diff options
Diffstat (limited to 'libmount/src/hook_subdir.c')
| -rw-r--r-- | libmount/src/hook_subdir.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/libmount/src/hook_subdir.c b/libmount/src/hook_subdir.c index 1e5d79958a..7cbb2c88d4 100644 --- a/libmount/src/hook_subdir.c +++ b/libmount/src/hook_subdir.c @@ -313,6 +313,7 @@ static int is_subdir_required(struct libmnt_context *cxt, int *rc, char **subdir struct libmnt_optlist *ol; struct libmnt_opt *opt; const char *dir = NULL; + unsigned long flags = 0; assert(cxt); assert(rc); @@ -328,16 +329,26 @@ static int is_subdir_required(struct libmnt_context *cxt, int *rc, char **subdir return 0; dir = mnt_opt_get_value(opt); - if (!dir || !*dir) { DBG(HOOK, ul_debug("failed to parse X-mount.subdir '%s'", dir)); *rc = -MNT_ERR_MOUNTOPT; - } else { - *subdir = strdup(dir); - if (!*subdir) - *rc = -ENOMEM; + return 0; + } + + *rc = mnt_optlist_get_flags(ol, &flags, cxt->map_linux, 0); + if (*rc) + return 0; + + if (flags & MS_REMOUNT || flags & MS_BIND || flags & MS_MOVE + || mnt_context_propagation_only(cxt)) { + DBG(HOOK, ul_debug("ignore subdir= (bind/move/remount/..)")); + return 0; } + *subdir = strdup(dir); + if (!*subdir) + *rc = -ENOMEM; + return *rc == 0; } |
