From e1e07c9aeacf71f3f95cbc4b2862e622962907cb Mon Sep 17 00:00:00 2001 From: Roberto Bergantinos Corpas 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 Signed-off-by: Karel Zak --- 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