File util-linux-libmount-use-mount-table-filter-on-no-canonicalize.patch of Package util-linux.7828

From f8416301c195d50a21cb54d9ea9abeccc40f9ee7 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 7 Jun 2017 11:35:26 +0200
Subject: [PATCH] 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>
---
 libmount/src/context.c        |   13 +++++++------
 libmount/src/context_umount.c |   20 ++++++++++++--------
 2 files changed, 19 insertions(+), 14 deletions(-)

--- a/libmount/src/context.c
+++ b/libmount/src/context.c
@@ -1069,7 +1069,10 @@ int mnt_context_get_mtab_for_target(stru
 	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)
@@ -1077,12 +1080,10 @@ int mnt_context_get_mtab_for_target(stru
 	}
 
 	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;
 }
--- a/libmount/src/context_umount.c
+++ b/libmount/src/context_umount.c
@@ -67,17 +67,21 @@ int mnt_context_find_umount_fs(struct li
 		return 1; /* empty string is not an error */
 
 	/*
-	 * The mtab file may be huge and on systems with utab we have to merge
-	 * userspace mount options into /proc/self/mountinfo. This all is
-	 * expensive. The mtab filter allows to filter out entries, then
-	 * mtab and utab are very tiny files.
+	 * The mtab file 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
openSUSE Build Service is sponsored by