forked from pool/util-linux
43 lines
1.6 KiB
Diff
43 lines
1.6 KiB
Diff
|
From 7065cc0e5312cafc5ae3e4c342f78f264300fb5f Mon Sep 17 00:00:00 2001
|
||
|
From: Fabian Vogt <fvogt@suse.de>
|
||
|
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)
|