summaryrefslogtreecommitdiffstats
path: root/libmount/src
diff options
context:
space:
mode:
authorKarel Zak2017-06-07 11:35:26 +0200
committerKarel Zak2017-06-07 11:35:26 +0200
commitf8416301c195d50a21cb54d9ea9abeccc40f9ee7 (patch)
tree9c55ab36703691d74d0b674f99631d2001e59acc /libmount/src
parentrename: add -o to the man page (diff)
downloadkernel-qcow2-util-linux-f8416301c195d50a21cb54d9ea9abeccc40f9ee7.tar.gz
kernel-qcow2-util-linux-f8416301c195d50a21cb54d9ea9abeccc40f9ee7.tar.xz
kernel-qcow2-util-linux-f8416301c195d50a21cb54d9ea9abeccc40f9ee7.zip
libmount: use mount table filter on --no-canonicalize
The umount command option --no-canonicalize means that the path is already canonical. So, we can use mount table filter in this case too. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/src')
-rw-r--r--libmount/src/context.c13
-rw-r--r--libmount/src/context_umount.c20
2 files changed, 19 insertions, 14 deletions
diff --git a/libmount/src/context.c b/libmount/src/context.c
index 3620f6525..5725ab1ad 100644
--- a/libmount/src/context.c
+++ b/libmount/src/context.c
@@ -1124,7 +1124,10 @@ int mnt_context_get_mtab_for_target(struct libmnt_context *cxt,
char *cn_tgt = NULL;
int rc;
- if (mnt_stat_mountpoint(tgt, &st) == 0 && S_ISDIR(st.st_mode)) {
+ if (mnt_context_is_nocanonicalize(cxt))
+ mnt_context_set_tabfilter(cxt, mtab_filter, (void *) tgt);
+
+ else if (mnt_stat_mountpoint(tgt, &st) == 0 && S_ISDIR(st.st_mode)) {
cache = mnt_context_get_cache(cxt);
cn_tgt = mnt_resolve_path(tgt, cache);
if (cn_tgt)
@@ -1132,12 +1135,10 @@ int mnt_context_get_mtab_for_target(struct libmnt_context *cxt,
}
rc = mnt_context_get_mtab(cxt, mtab);
+ mnt_context_set_tabfilter(cxt, NULL, NULL);
- if (cn_tgt) {
- mnt_context_set_tabfilter(cxt, NULL, NULL);
- if (!cache)
- free(cn_tgt);
- }
+ if (cn_tgt && !cache)
+ free(cn_tgt);
return rc;
}
diff --git a/libmount/src/context_umount.c b/libmount/src/context_umount.c
index 693891def..4a4c5bfe5 100644
--- a/libmount/src/context_umount.c
+++ b/libmount/src/context_umount.c
@@ -67,17 +67,21 @@ int mnt_context_find_umount_fs(struct libmnt_context *cxt,
return 1; /* empty string is not an error */
/*
- * The mount table may be huge, and on systems with utab we have to merge
- * userspace mount options into /proc/self/mountinfo. This all is
- * expensive. The tab filter allows to filter out entries, then
- * a mount table and utab are very tiny files.
+ * The mount table may be huge, and on systems with utab we have to
+ * merge userspace mount options into /proc/self/mountinfo. This all is
+ * expensive. The tab filter allows to filter out entries, then a mount
+ * table and utab are very tiny files.
*
- * *but*... the filter uses mnt_fs_streq_{target,srcpath} functions
- * where LABEL, UUID or symlinks are canonicalized. It means that
- * it's usable only for canonicalized stuff (e.g. kernel mountinfo).
+ * The filter uses mnt_fs_streq_{target,srcpath} function where all
+ * paths should be absolute and canonicalized. This is done within
+ * mnt_context_get_mtab_for_target() where LABEL, UUID or symlinks are
+ * canonicalized. If --no-canonicalize is enabled than the target path
+ * is expected already canonical.
+ *
+ * It also means that we have to read mount table from kernel
+ * (non-writable mtab).
*/
if (!mnt_context_mtab_writable(cxt) && *tgt == '/' &&
- !mnt_context_is_nocanonicalize(cxt) &&
!mnt_context_is_force(cxt) && !mnt_context_is_lazy(cxt))
rc = mnt_context_get_mtab_for_target(cxt, &mtab, tgt);
else