--- //depot/vendor/freebsd/src/sys/gnu/fs/xfs/FreeBSD/xfs_buf.c 2006/06/09 06:06:46 +++ //depot/user/attilio/attilio_schedlock/gnu/fs/xfs/FreeBSD/xfs_buf.c 2008/01/18 23:33:23 @@ -86,7 +86,7 @@ bp->b_bufsize = size; bp->b_bcount = size; - KASSERT(BUF_REFCNT(bp) == 1, + KASSERT(BUF_ISLOCKED(bp), ("xfs_buf_get_empty: bp %p not locked",bp)); xfs_buf_set_target(bp, target); @@ -103,7 +103,7 @@ bp = geteblk(len); if (bp != NULL) { - KASSERT(BUF_REFCNT(bp) == 1, + KASSERT(BUF_ISLOCKED(bp), ("xfs_buf_get_empty: bp %p not locked",bp)); xfs_buf_set_target(bp, target); @@ -163,7 +163,7 @@ if ((bp->b_flags & B_ASYNC) == 0) { error = bufwait(bp); #if 0 - if (BUF_REFCNT(bp) > 1) + if (BUF_LOCKRECURSED(bp)) BUF_UNLOCK(bp); else brelse(bp); --- //depot/vendor/freebsd/src/sys/gnu/fs/xfs/FreeBSD/xfs_buf.h 2006/06/09 06:06:46 +++ //depot/user/attilio/attilio_schedlock/gnu/fs/xfs/FreeBSD/xfs_buf.h 2008/01/18 23:33:23 @@ -160,7 +160,6 @@ #define XFS_BUF_HOLD(x) ((void)0) #define XFS_BUF_UNHOLD(x) ((void)0) -#define XFS_BUF_ISHOLD(x) BUF_REFCNT(x) #define XFS_BUF_READ(x) ((x)->b_iocmd = BIO_READ) #define XFS_BUF_UNREAD(x) ((x)->b_iocmd = 0) @@ -234,7 +233,7 @@ #define XFS_BUF_SET_VTYPE(bp, type) #define XFS_BUF_SET_REF(bp, ref) -#define XFS_BUF_VALUSEMA(bp) (BUF_REFCNT(bp)? 0 : 1) +#define XFS_BUF_VALUSEMA(bp) (BUF_ISLOCKED(bp) ? 0 : 1) #define XFS_BUF_CPSEMA(bp) \ (BUF_LOCK(bp, LK_EXCLUSIVE|LK_CANRECURSE | LK_SLEEPFAIL, NULL) == 0) --- //depot/vendor/freebsd/src/sys/kern/kern_shutdown.c 2007/12/26 11:36:13 +++ //depot/user/attilio/attilio_schedlock/kern/kern_shutdown.c 2008/01/18 23:33:23 @@ -255,7 +255,7 @@ isbufbusy(struct buf *bp) { if (((bp->b_flags & (B_INVAL | B_PERSISTENT)) == 0 && - BUF_REFCNT(bp) > 0) || + BUF_ISLOCKED(bp)) || ((bp->b_flags & (B_DELWRI | B_INVAL)) == B_DELWRI)) return (1); return (0); --- //depot/vendor/freebsd/src/sys/kern/vfs_bio.c 2008/01/13 14:45:30 +++ //depot/user/attilio/attilio_schedlock/kern/vfs_bio.c 2008/01/18 23:33:23 @@ -658,7 +658,7 @@ { CTR3(KTR_BUF, "bremfree(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags); - KASSERT(BUF_REFCNT(bp), ("bremfree: buf must be locked.")); + KASSERT(BUF_ISLOCKED(bp), ("bremfree: buf must be locked.")); KASSERT((bp->b_flags & B_REMFREE) == 0, ("bremfree: buffer %p already marked for delayed removal.", bp)); KASSERT(bp->b_qindex != QUEUE_NONE, @@ -695,7 +695,7 @@ { CTR3(KTR_BUF, "bremfreel(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags); - KASSERT(BUF_REFCNT(bp), ("bremfreel: buffer %p not locked.", bp)); + KASSERT(BUF_ISLOCKED(bp), ("bremfreel: buffer %p not locked.", bp)); KASSERT(bp->b_qindex != QUEUE_NONE, ("bremfreel: buffer %p not on a queue.", bp)); mtx_assert(&bqlock, MA_OWNED); @@ -834,7 +834,7 @@ oldflags = bp->b_flags; - if (BUF_REFCNT(bp) == 0) + if (!BUF_ISLOCKED(bp)) panic("bufwrite: buffer is not busy???"); if (bp->b_pin_count > 0) @@ -952,7 +952,7 @@ CTR3(KTR_BUF, "bdwrite(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags); KASSERT(bp->b_bufobj != NULL, ("No b_bufobj %p", bp)); - KASSERT(BUF_REFCNT(bp) != 0, ("bdwrite: buffer is not busy")); + KASSERT(BUF_ISLOCKED(bp), ("bdwrite: buffer is not busy")); if (bp->b_flags & B_INVAL) { brelse(bp); @@ -1047,7 +1047,7 @@ CTR3(KTR_BUF, "bdirty(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags); - KASSERT(BUF_REFCNT(bp) == 1, ("bdirty: bp %p not locked",bp)); + KASSERT(BUF_ISLOCKED(bp), ("bdirty: bp %p not locked",bp)); KASSERT(bp->b_bufobj != NULL, ("No b_bufobj %p", bp)); KASSERT(bp->b_flags & B_REMFREE || bp->b_qindex == QUEUE_NONE, ("bdirty: buffer %p still on queue %d", bp, bp->b_qindex)); @@ -1081,7 +1081,7 @@ KASSERT(bp->b_bufobj != NULL, ("No b_bufobj %p", bp)); KASSERT(bp->b_flags & B_REMFREE || bp->b_qindex == QUEUE_NONE, ("bundirty: buffer %p still on queue %d", bp, bp->b_qindex)); - KASSERT(BUF_REFCNT(bp) == 1, ("bundirty: bp %p not locked",bp)); + KASSERT(BUF_ISLOCKED(bp), ("bundirty: bp %p not locked",bp)); if (bp->b_flags & B_DELWRI) { bp->b_flags &= ~B_DELWRI; @@ -1341,7 +1341,7 @@ brelvp(bp); } - if (BUF_REFCNT(bp) > 1) { + if (BUF_LOCKRECURSED(bp)) { /* do not release to free list */ BUF_UNLOCK(bp); return; @@ -1446,7 +1446,7 @@ KASSERT(!(bp->b_flags & (B_CLUSTER|B_PAGING)), ("bqrelse: inappropriate B_PAGING or B_CLUSTER bp %p", bp)); - if (BUF_REFCNT(bp) > 1) { + if (BUF_LOCKRECURSED(bp)) { /* do not release to free list */ BUF_UNLOCK(bp); return; @@ -2660,7 +2660,7 @@ bp->b_flags &= ~B_DONE; } CTR4(KTR_BUF, "getblk(%p, %ld, %d) = %p", vp, (long)blkno, size, bp); - KASSERT(BUF_REFCNT(bp) == 1, ("getblk: bp %p not locked",bp)); + KASSERT(BUF_ISLOCKED(bp), ("getblk: bp %p not locked",bp)); KASSERT(bp->b_bufobj == bo, ("bp %p wrong b_bufobj %p should be %p", bp, bp->b_bufobj, bo)); return (bp); @@ -2681,7 +2681,7 @@ continue; allocbuf(bp, size); bp->b_flags |= B_INVAL; /* b_dep cleared by getnewbuf() */ - KASSERT(BUF_REFCNT(bp) == 1, ("geteblk: bp %p not locked",bp)); + KASSERT(BUF_ISLOCKED(bp), ("geteblk: bp %p not locked",bp)); return (bp); } @@ -2707,7 +2707,7 @@ int newbsize, mbsize; int i; - if (BUF_REFCNT(bp) == 0) + if (!BUF_ISLOCKED(bp)) panic("allocbuf: buffer not busy"); if (bp->b_kvasize < size) @@ -3150,8 +3150,7 @@ CTR3(KTR_BUF, "bufdone(%p) vp %p flags %X", bp, bp->b_vp, bp->b_flags); dropobj = NULL; - KASSERT(BUF_REFCNT(bp) > 0, ("biodone: bp %p not busy %d", bp, - BUF_REFCNT(bp))); + KASSERT(BUF_ISLOCKED(bp), ("biodone: bp %p not busy", bp)); KASSERT(!(bp->b_flags & B_DONE), ("biodone: bp %p already done", bp)); runningbufwakeup(bp); @@ -3176,8 +3175,7 @@ void bufdone_finish(struct buf *bp) { - KASSERT(BUF_REFCNT(bp) > 0, ("biodone: bp %p not busy %d", bp, - BUF_REFCNT(bp))); + KASSERT(BUF_ISLOCKED(bp), ("biodone: bp %p not busy", bp)); if (!LIST_EMPTY(&bp->b_dep)) buf_complete(bp); @@ -3943,7 +3941,7 @@ for (i = 0; i < nbuf; i++) { bp = &buf[i]; - if (lockcount(&bp->b_lock)) { + if (BUF_ISLOCKED(bp)) { db_show_buffer((uintptr_t)bp, 1, 0, NULL); db_printf("\n"); } --- //depot/vendor/freebsd/src/sys/kern/vfs_subr.c 2008/01/13 14:45:30 +++ //depot/user/attilio/attilio_schedlock/kern/vfs_subr.c 2008/01/18 23:33:23 @@ -3570,7 +3570,7 @@ if ((bp->b_flags & B_CLUSTER) != 0) return; - if (BUF_REFCNT(bp) < 1) { + if (!BUF_ISLOCKED(bp)) { if (vfs_badlock_print) printf( "VOP_STRATEGY: bp is not locked but should be\n"); --- //depot/vendor/freebsd/src/sys/nfs4client/nfs4_vnops.c 2008/01/13 14:45:30 +++ //depot/user/attilio/attilio_schedlock/nfs4client/nfs4_vnops.c 2008/01/18 23:33:23 @@ -2446,8 +2446,9 @@ struct ucred *cr; int error = 0; - KASSERT(!(bp->b_flags & B_DONE), ("nfs4_strategy: buffer %p unexpectedly marked B_DONE", bp)); - KASSERT(BUF_REFCNT(bp) > 0, ("nfs4_strategy: buffer %p not locked", bp)); + KASSERT(!(bp->b_flags & B_DONE), + ("nfs4_strategy: buffer %p unexpectedly marked B_DONE", bp)); + KASSERT(BUF_ISLOCKED(bp), ("nfs4_strategy: buffer %p not locked", bp)); if (bp->b_iocmd == BIO_READ) cr = bp->b_rcred; @@ -2525,7 +2526,7 @@ bveccount = 0; VI_LOCK(vp); TAILQ_FOREACH_SAFE(bp, &vp->v_bufobj.bo_dirty.bv_hd, b_bobufs, nbp) { - if (BUF_REFCNT(bp) == 0 && + if (!BUF_ISLOCKED(bp) && (bp->b_flags & (B_DELWRI | B_NEEDCOMMIT)) == (B_DELWRI | B_NEEDCOMMIT)) bveccount++; @@ -2807,7 +2808,7 @@ off_t off; #endif - if (BUF_REFCNT(bp) == 0) + if (!BUF_ISLOCKED(bp)) panic("bwrite: buffer is not locked???"); if (bp->b_flags & B_INVAL) { --- //depot/vendor/freebsd/src/sys/nfsclient/nfs_subs.c 2008/01/13 14:45:30 +++ //depot/user/attilio/attilio_schedlock/nfsclient/nfs_subs.c 2008/01/18 23:33:23 @@ -918,7 +918,7 @@ } MNT_IUNLOCK(mp); TAILQ_FOREACH_SAFE(bp, &vp->v_bufobj.bo_dirty.bv_hd, b_bobufs, nbp) { - if (BUF_REFCNT(bp) == 0 && + if (!BUF_ISLOCKED(bp) && (bp->b_flags & (B_DELWRI | B_NEEDCOMMIT)) == (B_DELWRI | B_NEEDCOMMIT)) bp->b_flags &= ~(B_NEEDCOMMIT | B_CLUSTEROK); --- //depot/vendor/freebsd/src/sys/nfsclient/nfs_vnops.c 2008/01/13 14:45:30 +++ //depot/user/attilio/attilio_schedlock/nfsclient/nfs_vnops.c 2008/01/18 23:33:23 @@ -2692,8 +2692,9 @@ struct buf *bp = ap->a_bp; struct ucred *cr; - KASSERT(!(bp->b_flags & B_DONE), ("nfs_strategy: buffer %p unexpectedly marked B_DONE", bp)); - KASSERT(BUF_REFCNT(bp) > 0, ("nfs_strategy: buffer %p not locked", bp)); + KASSERT(!(bp->b_flags & B_DONE), + ("nfs_strategy: buffer %p unexpectedly marked B_DONE", bp)); + KASSERT(BUF_ISLOCKED(bp), ("nfs_strategy: buffer %p not locked", bp)); if (bp->b_iocmd == BIO_READ) cr = bp->b_rcred; @@ -2771,7 +2772,7 @@ bveccount = 0; VI_LOCK(vp); TAILQ_FOREACH_SAFE(bp, &vp->v_bufobj.bo_dirty.bv_hd, b_bobufs, nbp) { - if (BUF_REFCNT(bp) == 0 && + if (!BUF_ISLOCKED(bp) && (bp->b_flags & (B_DELWRI | B_NEEDCOMMIT)) == (B_DELWRI | B_NEEDCOMMIT)) bveccount++; @@ -3087,7 +3088,7 @@ off_t off; #endif - if (BUF_REFCNT(bp) == 0) + if (!BUF_ISLOCKED(bp)) panic("bwrite: buffer is not locked???"); if (bp->b_flags & B_INVAL) { --- //depot/vendor/freebsd/src/sys/sys/buf.h 2008/01/08 23:51:30 +++ //depot/user/attilio/attilio_schedlock/sys/buf.h 2008/01/19 00:21:37 @@ -320,11 +320,22 @@ } /* + * Check if a buffer lock is recursed. + */ +#define BUF_LOCKRECURSED(bp) \ + (lockmgr_recursed(&(bp)->b_lock)) + +/* + * Check if a buffer lock is currently held. + */ +#define BUF_ISLOCKED(bp) \ + (lockstatus(&(bp)->b_lock, curthread)) +/* * Free a buffer lock. */ #define BUF_LOCKFREE(bp) \ do { \ - if (BUF_REFCNT(bp) > 0) \ + if (BUF_ISLOCKED(bp)) \ panic("free locked buf"); \ lockdestroy(&(bp)->b_lock); \ } while (0) @@ -344,29 +355,6 @@ lockmgr_disown(&bp->b_lock); } #endif -/* - * Find out the number of references to a lock. - */ -static __inline int BUF_REFCNT(struct buf *); -static __inline int -BUF_REFCNT(struct buf *bp) -{ - int s, ret; - - /* - * When the system is panicing, the lock manager grants all lock - * requests whether or not the lock is available. To avoid "unlocked - * buffer" panics after a crash, we just claim that all buffers - * are locked when cleaning up after a system panic. - */ - if (panicstr != NULL) - return (1); - s = splbio(); - ret = lockcount(&(bp)->b_lock); - splx(s); - return ret; -} - /* * Find out the number of waiters on a lock. --- //depot/vendor/freebsd/src/sys/sys/lockmgr.h 2008/01/08 23:51:30 +++ //depot/user/attilio/attilio_schedlock/sys/lockmgr.h 2008/01/18 22:14:37 @@ -204,6 +204,8 @@ int lockwaiters(struct lock *); #define lockmgr(lock, flags, mtx, td) _lockmgr((lock), (flags), (mtx), (td), __FILE__, __LINE__) +#define lockmgr_recursed(lkp) \ + ((lkp)->lk_exclusivecount > 1) #ifdef DDB int lockmgr_chain(struct thread *td, struct thread **ownerp); #endif --- //depot/vendor/freebsd/src/sys/ufs/ffs/ffs_vfsops.c 2008/01/13 14:45:30 +++ //depot/user/attilio/attilio_schedlock/ufs/ffs/ffs_vfsops.c 2008/01/18 23:33:23 @@ -1718,7 +1718,7 @@ oldflags = bp->b_flags; - if (BUF_REFCNT(bp) == 0) + if (!BUF_ISLOCKED(bp)) panic("bufwrite: buffer is not busy???"); s = splbio(); /*