summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2015-06-10 02:20:58 +0000
committerkib <kib@FreeBSD.org>2015-06-10 02:20:58 +0000
commit2187b2a06e2c4352326b9615e46b8efb66e5030d (patch)
tree91e211e46c9e2bb4a48f18b201a2f0ee2439a79e
parenta105f5d7fd400b5c08d8493a9d051428dfa6d646 (diff)
downloadFreeBSD-src-2187b2a06e2c4352326b9615e46b8efb66e5030d.zip
FreeBSD-src-2187b2a06e2c4352326b9615e46b8efb66e5030d.tar.gz
MFC r283601:
Add V_MNTREF flag, to indicate that caller of vn_start*_write() already owns a reference on the mount point, and the functions can consume it.
-rw-r--r--sys/kern/vfs_vnops.c20
-rw-r--r--sys/sys/vnode.h1
2 files changed, 11 insertions, 10 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 1965375..ace8e5c 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -1619,14 +1619,14 @@ unlock:
}
int
-vn_start_write(vp, mpp, flags)
- struct vnode *vp;
- struct mount **mpp;
- int flags;
+vn_start_write(struct vnode *vp, struct mount **mpp, int flags)
{
struct mount *mp;
int error;
+ KASSERT((flags & V_MNTREF) == 0 || (*mpp != NULL && vp == NULL),
+ ("V_MNTREF requires mp"));
+
error = 0;
/*
* If a vnode is provided, get and return the mount point that
@@ -1651,7 +1651,7 @@ vn_start_write(vp, mpp, flags)
* emulate a vfs_ref().
*/
MNT_ILOCK(mp);
- if (vp == NULL)
+ if (vp == NULL && (flags & V_MNTREF) == 0)
MNT_REF(mp);
return (vn_start_write_locked(mp, flags));
@@ -1665,14 +1665,14 @@ vn_start_write(vp, mpp, flags)
* time, these operations are halted until the suspension is over.
*/
int
-vn_start_secondary_write(vp, mpp, flags)
- struct vnode *vp;
- struct mount **mpp;
- int flags;
+vn_start_secondary_write(struct vnode *vp, struct mount **mpp, int flags)
{
struct mount *mp;
int error;
+ KASSERT((flags & V_MNTREF) == 0 || (*mpp != NULL && vp == NULL),
+ ("V_MNTREF requires mp"));
+
retry:
if (vp != NULL) {
if ((error = VOP_GETWRITEMOUNT(vp, mpp)) != 0) {
@@ -1697,7 +1697,7 @@ vn_start_secondary_write(vp, mpp, flags)
* emulate a vfs_ref().
*/
MNT_ILOCK(mp);
- if (vp == NULL)
+ if (vp == NULL && (flags & V_MNTREF) == 0)
MNT_REF(mp);
if ((mp->mnt_kern_flag & (MNTK_SUSPENDED | MNTK_SUSPEND2)) == 0) {
mp->mnt_secondary_writes++;
diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h
index 71b129e..fe4c9ea 100644
--- a/sys/sys/vnode.h
+++ b/sys/sys/vnode.h
@@ -395,6 +395,7 @@ extern int vttoif_tab[];
#define V_WAIT 0x0001 /* vn_start_write: sleep for suspend */
#define V_NOWAIT 0x0002 /* vn_start_write: don't sleep for suspend */
#define V_XSLEEP 0x0004 /* vn_start_write: just return after sleep */
+#define V_MNTREF 0x0010 /* vn_start_write: mp is already ref-ed */
#define VR_START_WRITE 0x0001 /* vfs_write_resume: start write atomically */
#define VR_NO_SUSPCLR 0x0002 /* vfs_write_resume: do not clear suspension */
OpenPOWER on IntegriCloud