git: fb4d7bd4b767 - main - vfs_busy(): add MBF_PCATCH flag to allow interrupting the sleep
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 29 Jul 2026 05:20:41 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=fb4d7bd4b7676963f9f37ff47f315f8c3652538b
commit fb4d7bd4b7676963f9f37ff47f315f8c3652538b
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-07-27 13:40:23 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-07-29 05:20:07 +0000
vfs_busy(): add MBF_PCATCH flag to allow interrupting the sleep
Reviewed by: jah, markj
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D58477
---
sys/kern/vfs_subr.c | 17 ++++++++++++++++-
sys/sys/mount.h | 3 ++-
2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 64c11660e211..8d6793ad9573 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -879,6 +879,7 @@ int
vfs_busy(struct mount *mp, int flags)
{
struct mount_pcpu *mpcpu;
+ int error;
MPASS((flags & ~MBF_MASK) == 0);
CTR3(KTR_VFS, "%s: mp %p with flags %d", __func__, mp, flags);
@@ -923,10 +924,24 @@ vfs_busy(struct mount *mp, int flags)
if (flags & MBF_MNTLSTLOCK)
mtx_unlock(&mountlist_mtx);
mp->mnt_kern_flag |= MNTK_MWAIT;
- msleep(mp, MNT_MTX(mp), PVFS | PDROP, "vfs_busy", 0);
+ error = msleep(mp, MNT_MTX(mp), ((flags & MBF_PCATCH) != 0 ?
+ PCATCH : 0) | PVFS | PDROP, "vfs_busy", 0);
if (flags & MBF_MNTLSTLOCK)
mtx_lock(&mountlist_mtx);
MNT_ILOCK(mp);
+ if (error != 0) {
+ MNT_REL(mp);
+
+ /*
+ * Clearing MNTK_MWAIT might cause spurious
+ * wakeups, but better clear our flag there
+ * then leak it.
+ */
+ mp->mnt_kern_flag &= ~MNTK_MWAIT;
+ wakeup(mp);
+ MNT_IUNLOCK(mp);
+ return (error);
+ }
}
if (flags & MBF_MNTLSTLOCK)
mtx_unlock(&mountlist_mtx);
diff --git a/sys/sys/mount.h b/sys/sys/mount.h
index b8b65a81369f..bc14a59da716 100644
--- a/sys/sys/mount.h
+++ b/sys/sys/mount.h
@@ -768,7 +768,8 @@ struct uio;
*/
#define MBF_NOWAIT 0x01
#define MBF_MNTLSTLOCK 0x02
-#define MBF_MASK (MBF_NOWAIT | MBF_MNTLSTLOCK)
+#define MBF_PCATCH 0x04
+#define MBF_MASK (MBF_NOWAIT | MBF_MNTLSTLOCK | MBF_PCATCH)
#ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_MOUNT);