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) */