Hi,

v_numoutput is a struct member of vnode which is used to keep track the number 
of writes in progress.

in several function comments, it is marked as "Manipulates v_numoutput. Must be 
called at splbio()".

So I added a "[B]" mark in the comment to properly document the need of IPL_BIO 
protection.

Next, I audited the tree for usage. I found 2 occurrences of v_numoutput 
(modification) without the required protection, inside dev/softraid.c. I added 
them.

Comments or OK ?
-- 
Sebastien Marie

Index: dev/softraid.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid.c,v
retrieving revision 1.422
diff -u -p -r1.422 softraid.c
--- dev/softraid.c      20 Mar 2022 13:14:02 -0000      1.422
+++ dev/softraid.c      27 Mar 2022 13:28:55 -0000
@@ -437,8 +437,12 @@ sr_rw(struct sr_softc *sc, dev_t dev, ch
                b.b_resid = bufsize;
                b.b_vp = vp;
 
-               if ((b.b_flags & B_READ) == 0)
+               if ((b.b_flags & B_READ) == 0) {
+                       int s;
+                       s = splbio();
                        vp->v_numoutput++;
+                       splx(s);
+               }
 
                LIST_INIT(&b.b_dep);
                VOP_STRATEGY(vp, &b);
@@ -2006,8 +2010,12 @@ sr_ccb_rw(struct sr_discipline *sd, int 
        ccb->ccb_buf.b_vp = sc->src_vn;
        ccb->ccb_buf.b_bq = NULL;
 
-       if (!ISSET(ccb->ccb_buf.b_flags, B_READ))
+       if (!ISSET(ccb->ccb_buf.b_flags, B_READ)) {
+               int s;
+               s = splbio();
                ccb->ccb_buf.b_vp->v_numoutput++;
+               splx(s);
+       }
 
        LIST_INIT(&ccb->ccb_buf.b_dep);
 
Index: sys/vnode.h
===================================================================
RCS file: /cvs/src/sys/sys/vnode.h,v
retrieving revision 1.163
diff -u -p -r1.163 vnode.h
--- sys/vnode.h 12 Dec 2021 09:14:59 -0000      1.163
+++ sys/vnode.h 27 Mar 2022 13:28:56 -0000
@@ -89,6 +89,7 @@ RBT_HEAD(namecache_rb_cache, namecache);
  * Locks used to protect struct members in struct vnode:
  *     a       atomic
  *     V       vnode_mtx
+ *     B       IPL_BIO
  */
 struct uvm_vnode;
 struct vnode {
@@ -113,7 +114,7 @@ struct vnode {
        struct  buf_rb_bufs v_bufs_tree;        /* lookup of all bufs */
        struct  buflists v_cleanblkhd;          /* clean blocklist head */
        struct  buflists v_dirtyblkhd;          /* dirty blocklist head */
-       u_int   v_numoutput;                    /* num of writes in progress */
+       u_int   v_numoutput;            /* [B] num of writes in progress */
        LIST_ENTRY(vnode) v_synclist;           /* vnode with dirty buffers */
        union {
                struct mount    *vu_mountedhere;/* ptr to mounted vfs (VDIR) */

Reply via email to