dcavalca / rpms / util-linux

Forked from rpms/util-linux 2 years ago
Clone
Blob Blame History Raw
From e1e07c9aeacf71f3f95cbc4b2862e622962907cb Mon Sep 17 00:00:00 2001
From: Roberto Bergantinos Corpas <rbergant@redhat.com>
Date: Mon, 27 Apr 2020 15:46:02 +0200
Subject: [PATCH] libmount: fix mount -a EBUSY for cifs

fstab:

 //rhel73/myshare/sub/path  /mnt   cifs

after mount in mountinfo:

 #  grep cifs /proc/self/mountinfo
 47 39 0:40 /sub/path /mnt rw,relatime shared:60 - cifs //rhel73/myshare/sub/path ...
            ^^^^^^^^^
or:

 # grep cifs /proc/self/mountinfo
 47 39 0:40 / /mnt rw,relatime shared:60 - cifs //rhel73/myshare/sub/path ...
            ^

That is so since on kernel cifs code, cifs_get_root (which returns the
entry associated with mnt_root) return s_root if
CIFS_MOUNT_USE_PREFIX_PATH is set, no questions asked.

This situation can occurr often on CIFS mounts, as CIFS servers limit
frequently scope of access to the root path.

[kzak@redhat.com: - add more info to the commit message,
                  - clean up variable names]

Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1826719
Upstream: http://github.com/karelzak/util-linux/commit/31b3a523eca2fc7e5876ec5fd89094208fed0899
Signed-off-by: Roberto Bergantinos Corpas <rbergant@redhat.com>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
 libmount/src/tab.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/libmount/src/tab.c b/libmount/src/tab.c
index 575b33d8c..89c84c99b 100644
--- a/libmount/src/tab.c
+++ b/libmount/src/tab.c
@@ -1181,9 +1181,12 @@ int mnt_table_is_fs_mounted(struct libmnt_table *tb, struct libmnt_fs *fstab_fs)
 
 		if (root) {
 			if (strcmp(mnt_fs_get_fstype(fs), "cifs") == 0) {
-				const char *unc_subdir = get_cifs_unc_subdir_path(src);
-				const char *path_on_fs = mnt_fs_get_root(fs);
-				if (!unc_subdir || !path_on_fs || !streq_paths(unc_subdir, path_on_fs))
+
+				const char *sub = get_cifs_unc_subdir_path(src);
+				const char *r = mnt_fs_get_root(fs);
+
+				if (!sub || !r || (!streq_paths(sub, r) &&
+						   !streq_paths("/", r)))
 					continue;
 			} else {
 				const char *r = mnt_fs_get_root(fs);
-- 
2.25.4