Use the fact the vnodes are locked when operations are inflight.
authorclaudio <claudio@openbsd.org>
Mon, 4 Oct 2021 08:11:02 +0000 (08:11 +0000)
committerclaudio <claudio@openbsd.org>
Mon, 4 Oct 2021 08:11:02 +0000 (08:11 +0000)
Remove the v_inflight member and alter the ffs and ext2fs sync code to
track inflight by checking if the node is locked or not (which it already
did before but for a different reason).
OK mpi@

sys/kern/vfs_vops.c
sys/sys/vnode.h
sys/ufs/ext2fs/ext2fs_vfsops.c
sys/ufs/ffs/ffs_vfsops.c

index 877daef..caf2dc3 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vfs_vops.c,v 1.30 2021/04/28 09:53:53 claudio Exp $   */
+/*     $OpenBSD: vfs_vops.c,v 1.31 2021/10/04 08:11:02 claudio Exp $   */
 /*
  * Copyright (c) 2010 Thordur I. Bjornsson <thib@openbsd.org> 
  *
@@ -74,7 +74,6 @@ int
 VOP_LOOKUP(struct vnode *dvp, struct vnode **vpp, 
     struct componentname *cnp)
 {
-       int r;
        struct vop_lookup_args a;
        a.a_dvp = dvp;
        a.a_vpp = vpp;
@@ -83,17 +82,13 @@ VOP_LOOKUP(struct vnode *dvp, struct vnode **vpp,
        if (dvp->v_op->vop_lookup == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       r = (dvp->v_op->vop_lookup)(&a);
-       dvp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_lookup)(&a));
 }
 
 int
 VOP_CREATE(struct vnode *dvp, struct vnode **vpp, 
     struct componentname *cnp, struct vattr *vap)
 {
-       int r;
        struct vop_create_args a;
        a.a_dvp = dvp;
        a.a_vpp = vpp;
@@ -105,17 +100,13 @@ VOP_CREATE(struct vnode *dvp, struct vnode **vpp,
        if (dvp->v_op->vop_create == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       r = (dvp->v_op->vop_create)(&a);
-       dvp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_create)(&a));
 }
 
 int
 VOP_MKNOD(struct vnode *dvp, struct vnode **vpp, 
     struct componentname *cnp, struct vattr *vap)
 {
-       int r;
        struct vop_mknod_args a;
        a.a_dvp = dvp;
        a.a_vpp = vpp;
@@ -127,16 +118,12 @@ VOP_MKNOD(struct vnode *dvp, struct vnode **vpp,
        if (dvp->v_op->vop_mknod == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       r = (dvp->v_op->vop_mknod)(&a);
-       dvp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_mknod)(&a));
 }
 
 int
 VOP_OPEN(struct vnode *vp, int mode, struct ucred *cred, struct proc *p)
 {
-       int r;
        struct vop_open_args a;
        a.a_vp = vp;
        a.a_mode = mode;
@@ -148,16 +135,12 @@ VOP_OPEN(struct vnode *vp, int mode, struct ucred *cred, struct proc *p)
        if (vp->v_op->vop_open == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
-       r = (vp->v_op->vop_open)(&a);
-       vp->v_inflight--;
-       return r;
+       return ((vp->v_op->vop_open)(&a));
 }
 
 int
 VOP_CLOSE(struct vnode *vp, int fflag, struct ucred *cred, struct proc *p)
 {
-       int r;
        struct vop_close_args a;
        a.a_vp = vp;
        a.a_fflag = fflag;
@@ -170,10 +153,7 @@ VOP_CLOSE(struct vnode *vp, int fflag, struct ucred *cred, struct proc *p)
        if (vp->v_op->vop_close == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
-       r = (vp->v_op->vop_close)(&a);
-       vp->v_inflight--;
-       return r;
+       return ((vp->v_op->vop_close)(&a));
 }
 
 int
@@ -215,7 +195,6 @@ int
 VOP_SETATTR(struct vnode *vp, struct vattr *vap, struct ucred *cred, 
     struct proc *p)
 {
-       int r;
        struct vop_setattr_args a;
        a.a_vp = vp;
        a.a_vap = vap;
@@ -228,10 +207,7 @@ VOP_SETATTR(struct vnode *vp, struct vattr *vap, struct ucred *cred,
        if (vp->v_op->vop_setattr == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
-       r = (vp->v_op->vop_setattr)(&a);
-       vp->v_inflight--;
-       return r;
+       return ((vp->v_op->vop_setattr)(&a));
 }
 
 int
@@ -255,7 +231,6 @@ int
 VOP_WRITE(struct vnode *vp, struct uio *uio, int ioflag, 
     struct ucred *cred)
 {
-       int r;
        struct vop_write_args a;
        a.a_vp = vp;
        a.a_uio = uio;
@@ -267,17 +242,13 @@ VOP_WRITE(struct vnode *vp, struct uio *uio, int ioflag,
        if (vp->v_op->vop_write == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
-       r = (vp->v_op->vop_write)(&a);
-       vp->v_inflight--;
-       return r;
+       return ((vp->v_op->vop_write)(&a));
 }
 
 int
 VOP_IOCTL(struct vnode *vp, u_long command, void *data, int fflag, 
     struct ucred *cred, struct proc *p)
 {
-       int r;
        struct vop_ioctl_args a;
        a.a_vp = vp;
        a.a_command = command;
@@ -290,10 +261,7 @@ VOP_IOCTL(struct vnode *vp, u_long command, void *data, int fflag,
        if (vp->v_op->vop_ioctl == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
-       r = (vp->v_op->vop_ioctl)(&a);
-       vp->v_inflight--;
-       return r;
+       return ((vp->v_op->vop_ioctl)(&a));
 }
 
 int
@@ -356,9 +324,7 @@ VOP_FSYNC(struct vnode *vp, struct ucred *cred, int waitfor,
        if (vp->v_op->vop_fsync == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
        r = (vp->v_op->vop_fsync)(&a);
-       vp->v_inflight--;
        s = splbio();
        if (r == 0 && vp->v_bioflag & VBIOERROR)
                r = EIO;
@@ -369,7 +335,6 @@ VOP_FSYNC(struct vnode *vp, struct ucred *cred, int waitfor,
 int
 VOP_REMOVE(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
 {
-       int r;
        struct vop_remove_args a;
        a.a_dvp = dvp;
         a.a_vp = vp;
@@ -381,16 +346,12 @@ VOP_REMOVE(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
        if (dvp->v_op->vop_remove == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       r = (dvp->v_op->vop_remove)(&a);
-       dvp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_remove)(&a));
 }
 
 int
 VOP_LINK(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
 {
-       int r;
        struct vop_link_args a;
        a.a_dvp = dvp;
        a.a_vp = vp;
@@ -401,12 +362,7 @@ VOP_LINK(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
        if (dvp->v_op->vop_link == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       vp->v_inflight++;
-       r = (dvp->v_op->vop_link)(&a);
-       dvp->v_inflight--;
-       vp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_link)(&a));
 }
 
 int
@@ -414,7 +370,6 @@ VOP_RENAME(struct vnode *fdvp, struct vnode *fvp,
     struct componentname *fcnp, struct vnode *tdvp, struct vnode *tvp, 
     struct componentname *tcnp)
 {
-       int r;
        struct vop_rename_args a;
        a.a_fdvp = fdvp;
        a.a_fvp = fvp;
@@ -428,19 +383,13 @@ VOP_RENAME(struct vnode *fdvp, struct vnode *fvp,
        if (fdvp->v_op->vop_rename == NULL) 
                return (EOPNOTSUPP);
 
-       fdvp->v_inflight++;
-       tdvp->v_inflight++;
-       r = (fdvp->v_op->vop_rename)(&a);
-       fdvp->v_inflight--;
-       tdvp->v_inflight--;
-       return r;
+       return ((fdvp->v_op->vop_rename)(&a));
 }
 
 int
 VOP_MKDIR(struct vnode *dvp, struct vnode **vpp, 
     struct componentname *cnp, struct vattr *vap)
 {
-       int r;
        struct vop_mkdir_args a;
        a.a_dvp = dvp;
        a.a_vpp = vpp;
@@ -452,16 +401,12 @@ VOP_MKDIR(struct vnode *dvp, struct vnode **vpp,
        if (dvp->v_op->vop_mkdir == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       r = (dvp->v_op->vop_mkdir)(&a);
-       dvp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_mkdir)(&a));
 }
 
 int
 VOP_RMDIR(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
 {
-       int r;
        struct vop_rmdir_args a;
        a.a_dvp = dvp;
        a.a_vp = vp;
@@ -475,19 +420,13 @@ VOP_RMDIR(struct vnode *dvp, struct vnode *vp, struct componentname *cnp)
        if (dvp->v_op->vop_rmdir == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       vp->v_inflight++;
-       r = (dvp->v_op->vop_rmdir)(&a);
-       dvp->v_inflight--;
-       vp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_rmdir)(&a));
 }
 
 int
 VOP_SYMLINK(struct vnode *dvp, struct vnode **vpp, 
     struct componentname *cnp, struct vattr *vap, char *target)
 {
-       int r;
        struct vop_symlink_args a;
        a.a_dvp = dvp;
        a.a_vpp = vpp;
@@ -500,17 +439,13 @@ VOP_SYMLINK(struct vnode *dvp, struct vnode **vpp,
        if (dvp->v_op->vop_symlink == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       r = (dvp->v_op->vop_symlink)(&a);
-       dvp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_symlink)(&a));
 }
 
 int
 VOP_READDIR(struct vnode *vp, struct uio *uio, struct ucred *cred, 
     int *eofflag)
 {
-       int r;
        struct vop_readdir_args a;
        a.a_vp = vp;
        a.a_uio = uio;
@@ -522,16 +457,12 @@ VOP_READDIR(struct vnode *vp, struct uio *uio, struct ucred *cred,
        if (vp->v_op->vop_readdir == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
-       r = (vp->v_op->vop_readdir)(&a);
-       vp->v_inflight--;
-       return r;
+       return ((vp->v_op->vop_readdir)(&a));
 }
 
 int
 VOP_READLINK(struct vnode *vp, struct uio *uio, struct ucred *cred)
 {
-       int r;
        struct vop_readlink_args a;
        a.a_vp = vp;
        a.a_uio = uio;
@@ -542,16 +473,12 @@ VOP_READLINK(struct vnode *vp, struct uio *uio, struct ucred *cred)
        if (vp->v_op->vop_readlink == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
-       r = (vp->v_op->vop_readlink)(&a);
-       vp->v_inflight--;
-       return r;
+       return ((vp->v_op->vop_readlink)(&a));
 }
 
 int
 VOP_ABORTOP(struct vnode *dvp, struct componentname *cnp)
 {
-       int r;
        struct vop_abortop_args a;
        a.a_dvp = dvp;
        a.a_cnp = cnp;
@@ -559,10 +486,7 @@ VOP_ABORTOP(struct vnode *dvp, struct componentname *cnp)
        if (dvp->v_op->vop_abortop == NULL)
                return (EOPNOTSUPP);
 
-       dvp->v_inflight++;
-       r = (dvp->v_op->vop_abortop)(&a);
-       dvp->v_inflight--;
-       return r;
+       return ((dvp->v_op->vop_abortop)(&a));
 }
 
 int
@@ -584,7 +508,6 @@ VOP_INACTIVE(struct vnode *vp, struct proc *p)
 int
 VOP_RECLAIM(struct vnode *vp, struct proc *p)
 {
-       int r;
        struct vop_reclaim_args a;
        a.a_vp = vp;
        a.a_p = p;
@@ -593,10 +516,7 @@ VOP_RECLAIM(struct vnode *vp, struct proc *p)
        if (vp->v_op->vop_reclaim == NULL)
                return (EOPNOTSUPP);
 
-       vp->v_inflight++;
-       r = (vp->v_op->vop_reclaim)(&a);
-       vp->v_inflight--;
-       return r;
+       return ((vp->v_op->vop_reclaim)(&a));
 }
 
 int
index d393c7c..3668f95 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vnode.h,v 1.158 2021/10/02 08:51:41 semarie Exp $     */
+/*     $OpenBSD: vnode.h,v 1.159 2021/10/04 08:11:02 claudio Exp $     */
 /*     $NetBSD: vnode.h,v 1.38 1996/02/29 20:59:05 cgd Exp $   */
 
 /*
@@ -107,7 +107,6 @@ struct vnode {
        u_int   v_bioflag;
        u_int   v_holdcnt;                      /* buffer references */
        u_int   v_id;                           /* capability identifier */
-       u_int   v_inflight;
        struct  mount *v_mount;                 /* ptr to vfs we are in */
        TAILQ_ENTRY(vnode) v_freelist;          /* vnode freelist */
        TAILQ_ENTRY(vnode) v_mntvnodes;         /* vnodes for mount point */
index 4561dda..371ca53 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ext2fs_vfsops.c,v 1.115 2020/06/24 22:03:44 cheloha Exp $     */
+/*     $OpenBSD: ext2fs_vfsops.c,v 1.116 2021/10/04 08:11:02 claudio Exp $     */
 /*     $NetBSD: ext2fs_vfsops.c,v 1.1 1997/06/11 09:34:07 bouyer Exp $ */
 
 /*
@@ -717,9 +717,6 @@ ext2fs_sync_vnode(struct vnode *vp, void *args)
        if (vp->v_type == VNON)
                return (0);
 
-       if (vp->v_inflight)
-               esa->inflight = MIN(esa->inflight+1, 65536);
-
        ip = VTOI(vp);
        
        if (ip->i_e2fs_nlink == 0)
@@ -731,7 +728,7 @@ ext2fs_sync_vnode(struct vnode *vp, void *args)
        }
 
        if (vget(vp, LK_EXCLUSIVE | LK_NOWAIT)) {
-               nlink0 = 1;     /* potentially */
+               esa->inflight = MIN(esa->inflight+1, 65536);
                goto end;
        }
 
@@ -742,6 +739,7 @@ end:
        esa->nlink0 = MIN(esa->nlink0 + nlink0, 65536);
        return (0);
 }
+
 /*
  * Go through the disk queues to initiate sandbagged IO;
  * go through the inodes to write those that have been modified;
index a7cc61b..48303e6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: ffs_vfsops.c,v 1.189 2021/05/01 16:18:29 gnezdo Exp $ */
+/*     $OpenBSD: ffs_vfsops.c,v 1.190 2021/10/04 08:11:02 claudio Exp $        */
 /*     $NetBSD: ffs_vfsops.c,v 1.19 1996/02/09 22:22:26 christos Exp $ */
 
 /*
@@ -1165,9 +1165,6 @@ ffs_sync_vnode(struct vnode *vp, void *arg)
 
        ip = VTOI(vp);
 
-       if (vp->v_inflight && !(vp->v_type == VCHR || vp->v_type == VBLK))
-               fsa->inflight = MIN(fsa->inflight+1, 65536);
-
        /*
         * If unmounting or converting rw to ro, then stop deferring
         * timestamp writes.
@@ -1187,7 +1184,7 @@ ffs_sync_vnode(struct vnode *vp, void *arg)
        }
 
        if (vget(vp, LK_EXCLUSIVE | LK_NOWAIT)) {
-               nlink0 = 1;             /* potentially.. */
+               fsa->inflight = MIN(fsa->inflight+1, 65536);
                goto end;
        }