From 7065cc0e5312cafc5ae3e4c342f78f264300fb5f Mon Sep 17 00:00:00 2001 From: Fabian Vogt Date: Wed, 1 Apr 2020 13:15:13 +0200 Subject: [PATCH 1/4] libmount: Avoid triggering autofs in lookup_umount_fs_by_statfs References: boo#1168389 Upstream: merged (gh#karelzak/util-linux#1002) Currently, umount /foo results in a statfs("/foo") call, which triggers autofs. This can create another mountpoint on /foo, which is then unmounted later instead of the actual /foo at the time umount was called. This is especially an issue for umount -R /bar, which just fails with -EBUSY as the accidental mountpoint is never accounted for and so it tries to umount /bar before /bar/someautofs. Replace the direct statfs call with open(path, O_PATH) + fstatfs, which sees the autofs mount directly, without triggering it. --- libmount/src/context_umount.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) Index: util-linux-2.34/libmount/src/context_umount.c =================================================================== --- util-linux-2.34.orig/libmount/src/context_umount.c +++ util-linux-2.34/libmount/src/context_umount.c @@ -283,9 +283,13 @@ static int lookup_umount_fs(struct libmn if (!type) { struct statfs vfs; - DBG(CXT, ul_debugobj(cxt, "umount: trying statfs()")); - if (statfs(tgt, &vfs) == 0) + DBG(CXT, ul_debugobj(cxt, "umount: trying fstatfs()")); + /* O_PATH avoids triggering automount points. */ + int pathfd = open(tgt, O_PATH); + if (pathfd >= 0 && fstatfs(pathfd, &vfs) == 0) { type = mnt_statfs_get_fstype(&vfs); + close(pathfd); + } if (type) { rc = mnt_fs_set_fstype(cxt->fs, type); if (rc)