git: afa8f8971b86 - main - vn_start_write(): consistently set *mpp to NULL on error or after failed sleep
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 11 Apr 2023 13:20:54 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=afa8f8971b869b8b5d1468e431d18c615a35a63e
commit afa8f8971b869b8b5d1468e431d18c615a35a63e
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2023-04-05 21:00:04 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2023-04-11 12:59:46 +0000
vn_start_write(): consistently set *mpp to NULL on error or after failed sleep
This ensures that *mpp != NULL iff vn_finished_write() should be
called, regardless of the returned error, except for V_NOWAIT.
The only exception that must be maintained is the case where
vn_start_write(V_NOWAIT) is called with the intent of later dropping
other locks and then doing vn_start_write(V_XSLEEP), which needs the mp
value calculated from the non-waitable call above it.
Also note that V_XSLEEP is not supported by vn_start_secondary_write().
Reviewed by: markj, mjg (previous version), rmacklem (previous version)
Tested by: pho
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D39441
---
sys/kern/vfs_vnops.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 122e53c0d9fb..52242cce0692 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -1935,7 +1935,10 @@ vn_start_write(struct vnode *vp, struct mount **mpp, int flags)
if (vp == NULL)
vfs_ref(mp);
- return (vn_start_write_refed(mp, flags, false));
+ error = vn_start_write_refed(mp, flags, false);
+ if (error != 0 && (flags & V_NOWAIT) == 0)
+ *mpp = NULL;
+ return (error);
}
/*
@@ -1951,7 +1954,7 @@ vn_start_secondary_write(struct vnode *vp, struct mount **mpp, int flags)
struct mount *mp;
int error, mflags;
- KASSERT((flags & ~V_VALID_FLAGS) == 0,
+ KASSERT((flags & (~V_VALID_FLAGS | V_XSLEEP)) == 0,
("%s: invalid flags passed %d\n", __func__, flags));
retry:
@@ -1989,6 +1992,7 @@ vn_start_secondary_write(struct vnode *vp, struct mount **mpp, int flags)
if ((flags & V_NOWAIT) != 0) {
MNT_REL(mp);
MNT_IUNLOCK(mp);
+ *mpp = NULL;
return (EWOULDBLOCK);
}
/*
@@ -2004,6 +2008,7 @@ vn_start_secondary_write(struct vnode *vp, struct mount **mpp, int flags)
vfs_rel(mp);
if (error == 0)
goto retry;
+ *mpp = NULL;
return (error);
}