From: Fabian Vogt Date: Wed, 1 Apr 2020 11:15:13 +0000 (+0200) Subject: libmount: Avoid triggering autofs in lookup_umount_fs_by_statfs X-Git-Tag: v2.36-rc1~152 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7065cc0e5312cafc5ae3e4c342f78f264300fb5f;p=thirdparty%2Futil-linux.git libmount: Avoid triggering autofs in lookup_umount_fs_by_statfs 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. --- diff --git a/libmount/src/context_umount.c b/libmount/src/context_umount.c index 733e9194db..e3547d3564 100644 --- a/libmount/src/context_umount.c +++ b/libmount/src/context_umount.c @@ -287,9 +287,13 @@ static int lookup_umount_fs_by_statfs(struct libmnt_context *cxt, const char *tg if (!type) { struct statfs vfs; - DBG(CXT, ul_debugobj(cxt, " trying statfs()")); - if (statfs(tgt, &vfs) == 0) + DBG(CXT, ul_debugobj(cxt, " 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) { int rc = mnt_fs_set_fstype(cxt->fs, type); if (rc)