Author: kib
Date: Wed Jun 10 02:20:58 2015
New Revision: 284202
URL: https://svnweb.freebsd.org/changeset/base/284202

Log:
  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.

Modified:
  stable/10/sys/kern/vfs_vnops.c
  stable/10/sys/sys/vnode.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/kern/vfs_vnops.c
==============================================================================
--- stable/10/sys/kern/vfs_vnops.c      Wed Jun 10 02:14:33 2015        
(r284201)
+++ stable/10/sys/kern/vfs_vnops.c      Wed Jun 10 02:20:58 2015        
(r284202)
@@ -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++;

Modified: stable/10/sys/sys/vnode.h
==============================================================================
--- stable/10/sys/sys/vnode.h   Wed Jun 10 02:14:33 2015        (r284201)
+++ stable/10/sys/sys/vnode.h   Wed Jun 10 02:20:58 2015        (r284202)
@@ -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 */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to