Hi, Can we use more list macros for v_dirtyblkhd? ok?
bluhm Index: kern/spec_vnops.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/kern/spec_vnops.c,v retrieving revision 1.92 diff -u -p -r1.92 spec_vnops.c --- kern/spec_vnops.c 2 May 2018 02:24:56 -0000 1.92 +++ kern/spec_vnops.c 2 Jul 2018 15:32:52 -0000 @@ -429,8 +429,7 @@ spec_fsync(void *v) */ loop: s = splbio(); - for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp != NULL; bp = nbp) { - nbp = LIST_NEXT(bp, b_vnbufs); + LIST_FOREACH_SAFE(bp, &vp->v_dirtyblkhd, b_vnbufs, nbp) { if ((bp->b_flags & B_BUSY)) continue; if ((bp->b_flags & B_DELWRI) == 0) Index: kern/vfs_subr.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/kern/vfs_subr.c,v retrieving revision 1.275 diff -u -p -r1.275 vfs_subr.c --- kern/vfs_subr.c 6 Jun 2018 19:02:38 -0000 1.275 +++ kern/vfs_subr.c 2 Jul 2018 15:37:06 -0000 @@ -2025,7 +2025,7 @@ brelvp(struct buf *bp) if (LIST_NEXT(bp, b_vnbufs) != NOLIST) bufremvn(bp); if ((vp->v_bioflag & VBIOONSYNCLIST) && - LIST_FIRST(&vp->v_dirtyblkhd) == NULL) { + LIST_EMPTY(&vp->v_dirtyblkhd)) { vp->v_bioflag &= ~VBIOONSYNCLIST; LIST_REMOVE(vp, v_synclist); } @@ -2091,7 +2091,7 @@ reassignbuf(struct buf *bp) if ((bp->b_flags & B_DELWRI) == 0) { listheadp = &vp->v_cleanblkhd; if ((vp->v_bioflag & VBIOONSYNCLIST) && - LIST_FIRST(&vp->v_dirtyblkhd) == NULL) { + LIST_EMPTY(&vp->v_dirtyblkhd)) { vp->v_bioflag &= ~VBIOONSYNCLIST; LIST_REMOVE(vp, v_synclist); } Index: nfs/nfs_subs.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/nfs/nfs_subs.c,v retrieving revision 1.136 diff -u -p -r1.136 nfs_subs.c --- nfs/nfs_subs.c 28 Apr 2018 03:13:05 -0000 1.136 +++ nfs/nfs_subs.c 2 Jul 2018 15:38:24 -0000 @@ -1519,10 +1519,9 @@ loop: if (vp->v_mount != mp) /* Paranoia */ goto loop; nvp = LIST_NEXT(vp, v_mntvnodes); - for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp != NULL; bp = nbp) { - nbp = LIST_NEXT(bp, b_vnbufs); + LIST_FOREACH_SAFE(bp, &vp->v_dirtyblkhd, b_vnbufs, nbp) { if ((bp->b_flags & (B_BUSY | B_DELWRI | B_NEEDCOMMIT)) - == (B_DELWRI | B_NEEDCOMMIT)) + == (B_DELWRI | B_NEEDCOMMIT)) bp->b_flags &= ~B_NEEDCOMMIT; } } Index: nfs/nfs_vfsops.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/nfs/nfs_vfsops.c,v retrieving revision 1.121 diff -u -p -r1.121 nfs_vfsops.c --- nfs/nfs_vfsops.c 27 May 2018 06:02:15 -0000 1.121 +++ nfs/nfs_vfsops.c 2 Jul 2018 15:39:21 -0000 @@ -812,7 +812,7 @@ loop: */ if (vp->v_mount != mp) goto loop; - if (VOP_ISLOCKED(vp) || LIST_FIRST(&vp->v_dirtyblkhd) == NULL) + if (VOP_ISLOCKED(vp) || LIST_EMPTY(&vp->v_dirtyblkhd)) continue; if (vget(vp, LK_EXCLUSIVE)) goto loop; Index: nfs/nfs_vnops.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/nfs/nfs_vnops.c,v retrieving revision 1.178 diff -u -p -r1.178 nfs_vnops.c --- nfs/nfs_vnops.c 21 Jun 2018 14:17:23 -0000 1.178 +++ nfs/nfs_vnops.c 2 Jul 2018 15:42:53 -0000 @@ -2867,18 +2867,15 @@ again: bvecpos = 0; if (NFS_ISV3(vp) && commit) { s = splbio(); - for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp != NULL; bp = nbp) { + LIST_FOREACH_SAFE(bp, &vp->v_dirtyblkhd, b_vnbufs, nbp) { if (bvecpos >= NFS_COMMITBVECSIZ) break; if ((bp->b_flags & (B_BUSY | B_DELWRI | B_NEEDCOMMIT)) - != (B_DELWRI | B_NEEDCOMMIT)) { - nbp = LIST_NEXT(bp, b_vnbufs); + != (B_DELWRI | B_NEEDCOMMIT)) continue; - } bremfree(bp); bp->b_flags |= B_WRITEINPROG; buf_acquire(bp); - nbp = LIST_NEXT(bp, b_vnbufs); /* * A list of these buffers is kept so that the @@ -2939,8 +2936,7 @@ again: */ loop: s = splbio(); - for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp != NULL; bp = nbp) { - nbp = LIST_NEXT(bp, b_vnbufs); + LIST_FOREACH_SAFE(bp, &vp->v_dirtyblkhd, b_vnbufs, nbp) { if (bp->b_flags & B_BUSY) { if (waitfor != MNT_WAIT || passone) continue; @@ -2993,7 +2989,7 @@ loop: goto loop2; } - if (LIST_FIRST(&vp->v_dirtyblkhd) && commit) { + if (!LIST_EMPTY(&vp->v_dirtyblkhd) && commit) { #if 0 vprint("nfs_fsync: dirty", vp); #endif Index: ufs/ffs/ffs_softdep.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/ufs/ffs/ffs_softdep.c,v retrieving revision 1.142 diff -u -p -r1.142 ffs_softdep.c --- ufs/ffs/ffs_softdep.c 2 May 2018 02:24:56 -0000 1.142 +++ ufs/ffs/ffs_softdep.c 2 Jul 2018 15:59:24 -0000 @@ -4640,8 +4640,7 @@ softdep_fsync_mountdev(struct vnode *vp, if (!vn_isdisk(vp, NULL)) panic("softdep_fsync_mountdev: vnode not a disk"); ACQUIRE_LOCK(&lk); - for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { - nbp = LIST_NEXT(bp, b_vnbufs); + LIST_FOREACH_SAFE(bp, &vp->v_dirtyblkhd, b_vnbufs, nbp) { /* * If it is already scheduled, skip to the next buffer. */ @@ -4932,7 +4931,7 @@ loop: * all potential buffers on the dirty list will be visible. */ drain_output(vp, 1); - if (LIST_FIRST(&vp->v_dirtyblkhd) == NULL) { + if (LIST_EMPTY(&vp->v_dirtyblkhd)) { FREE_LOCK(&lk); return (0); } Index: ufs/ffs/ffs_vnops.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/ufs/ffs/ffs_vnops.c,v retrieving revision 1.90 diff -u -p -r1.90 ffs_vnops.c --- ufs/ffs/ffs_vnops.c 13 Jan 2018 15:56:02 -0000 1.90 +++ ufs/ffs/ffs_vnops.c 2 Jul 2018 15:58:20 -0000 @@ -435,11 +435,10 @@ ffs_fsync(void *v) skipmeta = 1; s = splbio(); loop: - for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; - bp = LIST_NEXT(bp, b_vnbufs)) + LIST_FOREACH(bp, &vp->v_dirtyblkhd, b_vnbufs) { bp->b_flags &= ~B_SCANNED; - for (bp = LIST_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { - nbp = LIST_NEXT(bp, b_vnbufs); + } + LIST_FOREACH_SAFE(bp, &vp->v_dirtyblkhd, b_vnbufs, nbp) { /* * Reasons to skip this buffer: it has already been considered * on this pass, this pass is the first time through on a