diff options
| -rw-r--r-- | sys/dev/ata/ata_raid.c | 4 | ||||
| -rw-r--r-- | sys/dev/dkwedge/dk.c | 3 | ||||
| -rw-r--r-- | sys/dev/fss.c | 7 | ||||
| -rw-r--r-- | sys/dev/isa/fd.c | 3 | ||||
| -rw-r--r-- | sys/dev/ld.c | 3 | ||||
| -rw-r--r-- | sys/dev/raidframe/rf_diskqueue.c | 3 | ||||
| -rw-r--r-- | sys/dev/vme/xd.c | 3 | ||||
| -rw-r--r-- | sys/dev/vme/xy.c | 3 | ||||
| -rw-r--r-- | sys/fs/udf/udf_readwrite.c | 12 | ||||
| -rw-r--r-- | sys/fs/udf/udf_strat_rmw.c | 6 | ||||
| -rw-r--r-- | sys/kern/kern_physio.c | 9 | ||||
| -rw-r--r-- | sys/kern/vfs_bio.c | 38 | ||||
| -rw-r--r-- | sys/kern/vfs_subr.c | 6 | ||||
| -rw-r--r-- | sys/kern/vfs_wapbl.c | 6 | ||||
| -rw-r--r-- | sys/miscfs/genfs/genfs_io.c | 9 | ||||
| -rw-r--r-- | sys/sys/buf.h | 21 | ||||
| -rw-r--r-- | sys/sys/lockdoc.h | 2 | ||||
| -rw-r--r-- | sys/sys/vnode.h | 2 | ||||
| -rw-r--r-- | sys/ufs/ffs/ffs_snapshot.c | 3 | ||||
| -rw-r--r-- | sys/ufs/ffs/ffs_vnops.c | 3 | ||||
| -rw-r--r-- | sys/ufs/lfs/lfs_bio.c | 17 | ||||
| -rw-r--r-- | sys/ufs/lfs/lfs_segment.c | 15 | ||||
| -rw-r--r-- | sys/ufs/lfs/lfs_vfsops.c | 3 | ||||
| -rw-r--r-- | sys/uvm/uvm_swap.c | 3 |
24 files changed, 174 insertions, 10 deletions
diff --git a/sys/dev/ata/ata_raid.c b/sys/dev/ata/ata_raid.c index d63f55e151e..a1795a4fc53 100644 --- a/sys/dev/ata/ata_raid.c +++ b/sys/dev/ata/ata_raid.c @@ -313,7 +313,9 @@ ata_raid_config_block_rw(struct vnode *vp, daddr_t blkno, void *tbuf, bp->b_proc = curproc; bp->b_data = tbuf; SET(bp->b_cflags, BC_BUSY); /* mark buffer busy */ - +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif VOP_STRATEGY(vp, bp); error = biowait(bp); diff --git a/sys/dev/dkwedge/dk.c b/sys/dev/dkwedge/dk.c index c201cdf815f..8f3affaf4cb 100644 --- a/sys/dev/dkwedge/dk.c +++ b/sys/dev/dkwedge/dk.c @@ -1210,6 +1210,9 @@ dkwedge_read(struct disk *pdk, struct vnode *vp, daddr_t blkno, bp = getiobuf(bdvp, true); bp->b_flags = B_READ; bp->b_cflags = BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_dev = bdev; bp->b_data = tbuf; bp->b_bufsize = bp->b_bcount = len; diff --git a/sys/dev/fss.c b/sys/dev/fss.c index 2db93f5b996..8d1e7c78ff7 100644 --- a/sys/dev/fss.c +++ b/sys/dev/fss.c @@ -1047,6 +1047,9 @@ restart: mbp->b_resid = mbp->b_bcount = todo; mbp->b_flags = B_READ; mbp->b_cflags = BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(mbp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif mbp->b_dev = sc->sc_bdev; while (todo > 0) { len = todo; @@ -1293,7 +1296,9 @@ fss_bs_thread(void *arg) nbp->b_lblkno = 0; nbp->b_dev = sc->sc_bdev; SET(nbp->b_cflags, BC_BUSY); /* mark buffer busy */ - +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(nbp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bdev_strategy(nbp); error = biowait(nbp); diff --git a/sys/dev/isa/fd.c b/sys/dev/isa/fd.c index e1d28801a8d..29cdc6ac2ee 100644 --- a/sys/dev/isa/fd.c +++ b/sys/dev/isa/fd.c @@ -1612,6 +1612,9 @@ fdformat(dev_t dev, struct ne7_fd_formb *finfo, struct lwp *l) return ENOBUFS; bp->b_cflags = BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_flags = B_PHYS | B_FORMAT; bp->b_proc = l->l_proc; bp->b_dev = dev; diff --git a/sys/dev/ld.c b/sys/dev/ld.c index 562698e1b30..54296b136c0 100644 --- a/sys/dev/ld.c +++ b/sys/dev/ld.c @@ -690,6 +690,9 @@ ld_discard(device_t dev, off_t pos, off_t len) bp->b_bcount = len; bp->b_flags = B_WRITE; bp->b_cflags = BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif error = (*sc->sc_discard)(sc, bp); if (error == 0) diff --git a/sys/dev/raidframe/rf_diskqueue.c b/sys/dev/raidframe/rf_diskqueue.c index 2f8f56b47a1..1eec20486f6 100644 --- a/sys/dev/raidframe/rf_diskqueue.c +++ b/sys/dev/raidframe/rf_diskqueue.c @@ -392,6 +392,9 @@ rf_CreateDiskQueueData(RF_IoType_t typ, RF_SectorNum_t ssect, buf_init(p->bp); SET(p->bp->b_cflags, BC_BUSY); /* mark buffer busy */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(p->bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif if (mbp) { SET(p->bp->b_flags, mbp->b_flags & rf_b_pass); p->bp->b_proc = mbp->b_proc; diff --git a/sys/dev/vme/xd.c b/sys/dev/vme/xd.c index f6ebaba47f6..14050bc53fd 100644 --- a/sys/dev/vme/xd.c +++ b/sys/dev/vme/xd.c @@ -345,6 +345,9 @@ xddummystrat(struct buf *bp) memcpy(bp->b_data, xd_labeldata, XDFM_BPS); bp->b_oflags |= BO_DONE; bp->b_cflags &= ~BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(V_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif } int diff --git a/sys/dev/vme/xy.c b/sys/dev/vme/xy.c index eabb99f56f6..b5a0b2e4bb7 100644 --- a/sys/dev/vme/xy.c +++ b/sys/dev/vme/xy.c @@ -261,6 +261,9 @@ xydummystrat(struct buf *bp) memcpy(bp->b_data, xy_labeldata, XYFM_BPS); bp->b_oflags |= BO_DONE; bp->b_cflags &= ~BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(V_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif } int diff --git a/sys/fs/udf/udf_readwrite.c b/sys/fs/udf/udf_readwrite.c index 41bc35e4f25..35eb2fe9ce4 100644 --- a/sys/fs/udf/udf_readwrite.c +++ b/sys/fs/udf/udf_readwrite.c @@ -298,6 +298,9 @@ udf_read_phys_sectors(struct udf_mount *ump, int what, void *blob, buf = getiobuf(ump->devvp, true); buf->b_flags = B_READ; buf->b_cflags = BC_BUSY; /* needed? */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(buf->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif buf->b_iodone = NULL; buf->b_data = blob; buf->b_bcount = sectors * sector_size; @@ -495,6 +498,9 @@ udf_write_phys_sectors(struct udf_mount *ump, int what, void *blob, buf = getiobuf(vp, true); buf->b_flags = B_WRITE; buf->b_cflags = BC_BUSY; /* needed? */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(buf->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif buf->b_iodone = NULL; buf->b_data = blob; buf->b_bcount = sectors * sector_size; @@ -538,6 +544,9 @@ udf_write_phys_dscr_sync(struct udf_mount *ump, struct udf_node *udf_node, int w buf = getiobuf(vp, true); buf->b_flags = B_WRITE; buf->b_cflags = BC_BUSY; /* needed? */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(buf->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif buf->b_iodone = NULL; buf->b_data = (void *) dscr; buf->b_bcount = dscrlen; @@ -585,6 +594,9 @@ udf_write_phys_dscr_async(struct udf_mount *ump, struct udf_node *udf_node, buf = getiobuf(vp, true); buf->b_flags = B_WRITE; // | B_ASYNC; buf->b_cflags = BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(buf->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif buf->b_iodone = dscrwr_callback; buf->b_data = dscr; buf->b_bcount = dscrlen; diff --git a/sys/fs/udf/udf_strat_rmw.c b/sys/fs/udf/udf_strat_rmw.c index d6c0c699068..ca88dfc9090 100644 --- a/sys/fs/udf/udf_strat_rmw.c +++ b/sys/fs/udf/udf_strat_rmw.c @@ -1123,6 +1123,9 @@ udf_issue_eccline(struct udf_eccline *eccline, int queued_on) buf = eccline->buf; buf->b_flags = B_READ | B_ASYNC; SET(buf->b_cflags, BC_BUSY); /* mark buffer busy */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(buf->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif buf->b_oflags = 0; buf->b_iodone = udf_shedule_read_callback; buf->b_data = eccline->blob; @@ -1171,6 +1174,9 @@ udf_issue_eccline(struct udf_eccline *eccline, int queued_on) buf = eccline->buf; buf->b_flags = B_WRITE | B_ASYNC; SET(buf->b_cflags, BC_BUSY); /* mark buffer busy */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(buf->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif buf->b_oflags = 0; buf->b_iodone = udf_shedule_write_callback; buf->b_data = eccline->blob; diff --git a/sys/kern/kern_physio.c b/sys/kern/kern_physio.c index 9547e5ddea1..690e80d9fad 100644 --- a/sys/kern/kern_physio.c +++ b/sys/kern/kern_physio.c @@ -284,6 +284,9 @@ physio(void (*strategy)(struct buf *), struct buf *obp, dev_t dev, int flags, } else { bp = getiobuf(NULL, true); bp->b_cflags |= BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif } bp->b_dev = dev; bp->b_proc = p; @@ -297,6 +300,9 @@ physio(void (*strategy)(struct buf *), struct buf *obp, dev_t dev, int flags, */ bp->b_oflags = 0; bp->b_cflags |= BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_flags = flags | B_PHYS | B_RAW; bp->b_iodone = physio_biodone; @@ -430,6 +436,9 @@ done_locked: */ mutex_enter(&bufcache_lock); obp->b_cflags &= ~(BC_BUSY | BC_WANTED); +#ifdef LOCKDOC_VFS + lockdoc_log_lock(V_WRITE, &(obp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif obp->b_flags &= ~(B_PHYS | B_RAW); obp->b_iodone = NULL; cv_broadcast(&obp->b_busy); diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 21e36bafcdc..eaa6592de1c 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -154,6 +154,10 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.303 2022/03/30 14:54:29 riastradh Exp #include <miscfs/specfs/specdev.h> +#ifdef LOCKDOC_VFS +#include <sys/lockdoc.h> +#endif + SDT_PROVIDER_DEFINE(io); SDT_PROBE_DEFINE4(io, kernel, , bbusy__start, @@ -468,6 +472,12 @@ bufinit(void) mutex_init(&bufcache_lock, MUTEX_DEFAULT, IPL_NONE); mutex_init(&buffer_lock, MUTEX_DEFAULT, IPL_NONE); + +#ifdef LOCKDOC_VFS + lockdoc_log_memory(1, "kmutex_t", &bufcache_lock, sizeof(kmutex_t)); + lockdoc_log_memory(1, "kmutex_t", &buffer_lock, sizeof(kmutex_t)); +#endif + cv_init(&needbuffer_cv, "needbuf"); if (bufmem_valimit != 0) { @@ -1136,6 +1146,9 @@ brelsel(buf_t *bp, int set) already_queued: /* Unlock the buffer. */ CLR(bp->b_cflags, BC_AGE|BC_BUSY|BC_NOCACHE); +#ifdef LOCKDOC_VFS + lockdoc_log_lock(V_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif CLR(bp->b_flags, B_ASYNC); /* @@ -1399,6 +1412,9 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq) memset((char *)bp, 0, sizeof(*bp)); buf_init(bp); SET(bp->b_cflags, BC_BUSY); /* mark buffer busy */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif mutex_enter(&bufcache_lock); #if defined(DIAGNOSTIC) bp->b_freelistindex = -1; @@ -1430,6 +1446,9 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq) /* Buffer is no longer on free lists. */ SET(bp->b_cflags, BC_BUSY); +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif /* Wake anyone trying to lock the old identity. */ cv_broadcast(&bp->b_busy); @@ -1494,6 +1513,9 @@ getnewbuf(int slpflag, int slptimeo, int from_bufq) /* clear out various other fields */ bp->b_cflags = BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_oflags = 0; bp->b_flags = 0; bp->b_dev = NODEV; @@ -2106,6 +2128,9 @@ nestiobuf_setup(buf_t *mbp, buf_t *bp, int offset, size_t size) bp->b_dev = mbp->b_dev; bp->b_objlock = mbp->b_objlock; bp->b_cflags = BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_flags = B_ASYNC | b_pass; bp->b_iodone = nestiobuf_iodone; bp->b_data = (char *)mbp->b_data + offset; @@ -2164,6 +2189,10 @@ buf_init(buf_t *bp) bp->b_dev = NODEV; bp->b_vnbufs.le_next = NOLIST; BIO_SETPRIO(bp, BPRIO_DEFAULT); + +#ifdef LOCKDOC_VFS + lockdoc_log_memory(1, "buf", bp, sizeof(buf_t)); +#endif } void @@ -2172,6 +2201,12 @@ buf_destroy(buf_t *bp) cv_destroy(&bp->b_done); cv_destroy(&bp->b_busy); + +#ifdef LOCKDOC_VFS + if ((bp->b_cflags & BC_BUSY) != 0) + lockdoc_log_lock(V_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); + lockdoc_log_memory(0, "buf", bp, sizeof(buf_t)); +#endif } int @@ -2208,6 +2243,9 @@ bbusy(buf_t *bp, bool intr, int timo, kmutex_t *interlock) error = EPASSTHROUGH; } else { bp->b_cflags |= BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif error = 0; } diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 69d65335979..936a5c9670e 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -253,6 +253,9 @@ restart: printf("buffer still DELWRI\n"); #endif bp->b_cflags |= BC_BUSY | BC_VFLUSH; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif mutex_exit(&bufcache_lock); VOP_BWRITE(bp->b_vp, bp); mutex_enter(&bufcache_lock); @@ -355,6 +358,9 @@ loop: if ((bp->b_oflags & BO_DELWRI) == 0) panic("vflushbuf: not dirty, bp %p", bp); bp->b_cflags |= BC_BUSY | BC_VFLUSH; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif mutex_exit(&bufcache_lock); /* * Wait for I/O associated with indirect blocks to complete, diff --git a/sys/kern/vfs_wapbl.c b/sys/kern/vfs_wapbl.c index 80e80b365eb..87fd9bec89f 100644 --- a/sys/kern/vfs_wapbl.c +++ b/sys/kern/vfs_wapbl.c @@ -919,6 +919,9 @@ wapbl_doio(void *data, size_t len, struct vnode *devvp, daddr_t pbn, int flags) bp = getiobuf(devvp, true); bp->b_flags = flags; bp->b_cflags |= BC_BUSY; /* mandatory, asserted by biowait() */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_dev = devvp->v_rdev; bp->b_data = data; bp->b_bufsize = bp->b_resid = bp->b_bcount = len; @@ -994,6 +997,9 @@ wapbl_buffered_write_async(struct wapbl *wl, struct buf *bp) bp->b_flags |= B_WRITE; bp->b_cflags |= BC_BUSY; /* mandatory, asserted by biowait() */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_oflags = 0; bp->b_bcount = bp->b_resid; BIO_SETPRIO(bp, BPRIO_TIMECRITICAL); diff --git a/sys/miscfs/genfs/genfs_io.c b/sys/miscfs/genfs/genfs_io.c index 2dfb4ae3c18..614afe76d62 100644 --- a/sys/miscfs/genfs/genfs_io.c +++ b/sys/miscfs/genfs/genfs_io.c @@ -611,6 +611,9 @@ genfs_getpages_read(struct vnode *vp, struct vm_page **pgs, int npages, mbp->b_data = (void *)kva; mbp->b_resid = mbp->b_bcount = bytes; mbp->b_cflags |= BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(mbp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif if (async) { mbp->b_flags = B_READ | B_ASYNC; mbp->b_iodone = uvm_aio_aiodone; @@ -1480,6 +1483,9 @@ genfs_do_io(struct vnode *vp, off_t off, vaddr_t kva, size_t len, int flags, mbp->b_data = (void *)kva; mbp->b_resid = mbp->b_bcount = bytes; mbp->b_cflags |= BC_BUSY | BC_AGE; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(mbp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif if (async) { mbp->b_flags = brw | B_ASYNC; mbp->b_iodone = iodone; @@ -1712,6 +1718,9 @@ genfs_compat_gop_write(struct vnode *vp, struct vm_page **pgs, int npages, bp = getiobuf(vp, true); bp->b_cflags |= BC_BUSY | BC_AGE; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_lblkno = offset >> vp->v_mount->mnt_fs_bshift; bp->b_data = (char *)kva; bp->b_bcount = npages << PAGE_SHIFT; diff --git a/sys/sys/buf.h b/sys/sys/buf.h index d070c9527e1..cdc69c99992 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -78,6 +78,14 @@ #include <sys/workqueue.h> #endif /* defined(_KERNEL) */ +#ifdef LOCKDOC_VFS +/* + * Include LOCKDOC here so that every file that uses buf_t has access + * to the lockdoc_log_lock functions + */ +#include <sys/lockdoc.h> +#endif + struct buf; struct mount; struct vnode; @@ -112,13 +120,22 @@ __CTASSERT(sizeof(struct work) <= sizeof(TAILQ_ENTRY(buf))); #endif struct buf { +#ifndef LOCKDOC_VFS union { - TAILQ_ENTRY(buf) u_actq; - rb_node_t u_rbnode; +#else + struct { +#endif #if defined(_KERNEL) /* u_work is smaller than u_actq */ + + /* LOCKDOC: This had to be moved in front of u_actq and + * u_rbnode becuase the vfs_bio subsys does + * some *interesting* pointer stuff + */ struct work u_work; #endif + TAILQ_ENTRY(buf) u_actq; + rb_node_t u_rbnode; } b_u; /* b: device driver queue */ #define b_actq b_u.u_actq #define b_work b_u.u_work diff --git a/sys/sys/lockdoc.h b/sys/sys/lockdoc.h index 0f706a48ce2..347c03e3e19 100644 --- a/sys/sys/lockdoc.h +++ b/sys/sys/lockdoc.h @@ -10,7 +10,7 @@ #include <sys/mutex.h> #include <sys/rwlock.h> -#define LOCKDOC_VERSION "ms-vfs-0.2" +#define LOCKDOC_VERSION "ms-vfs-0.3" #define LOCKDOC_DELIMITER "#" #define LOCKDOC_DELIMITER_CHAR '#' #define LOCKDOC_PING() lockdoc_outb('p',0x00e9); diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 349dab62785..1d5d1a1d06d 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -169,7 +169,7 @@ struct vnode { kmutex_t *v_interlock; /* - vnode interlock */ struct mount *v_mount; /* v ptr to vfs we are in */ int (**v_op)(void *); /* : vnode operations vector */ -#ifndef LOCKDOC +#ifndef LOCKDOC_VFS union { #else struct { diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c index 9d4c46d475d..db8d4dfb471 100644 --- a/sys/ufs/ffs/ffs_snapshot.c +++ b/sys/ufs/ffs/ffs_snapshot.c @@ -2195,6 +2195,9 @@ rwfsblk(struct vnode *vp, int flags, void *data, daddr_t lbn) nbp->b_proc = NULL; nbp->b_dev = ip->i_devvp->v_rdev; SET(nbp->b_cflags, BC_BUSY); /* mark buffer busy */ +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(nbp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bdev_strategy(nbp); diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 9e14caa0bc1..340860c86ac 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -379,6 +379,9 @@ ffs_fsync(void *v) (bp->b_oflags & BO_DELWRI) == 0) continue; bp->b_cflags |= BC_BUSY | BC_VFLUSH; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif mutex_exit(&bufcache_lock); bawrite(bp); mutex_enter(&bufcache_lock); diff --git a/sys/ufs/lfs/lfs_bio.c b/sys/ufs/lfs/lfs_bio.c index 5169d09a673..06bd348b340 100644 --- a/sys/ufs/lfs/lfs_bio.c +++ b/sys/ufs/lfs/lfs_bio.c @@ -434,9 +434,12 @@ lfs_bwrite_ext(struct buf *bp, int flags) bp->b_error = 0; mutex_enter(&bufcache_lock); LFS_UNLOCK_BUF(bp); - if (LFS_IS_MALLOC_BUF(bp)) + if (LFS_IS_MALLOC_BUF(bp)){ bp->b_cflags &= ~BC_BUSY; - else +#ifdef LOCKDOC_VFS + lockdoc_log_lock(V_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif + } else brelsel(bp, 0); mutex_exit(&bufcache_lock); return (fs->lfs_ronly ? EROFS : 0); @@ -481,9 +484,12 @@ lfs_bwrite_ext(struct buf *bp, int flags) mutex_enter(&bufcache_lock); } - if (bp->b_iodone != NULL) + if (bp->b_iodone != NULL) { bp->b_cflags &= ~BC_BUSY; - else +#ifdef LOCKDOC_VFS + lockdoc_log_lock(V_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif + } else brelsel(bp, 0); mutex_exit(&bufcache_lock); @@ -736,6 +742,9 @@ lfs_newbuf(struct lfs *fs, struct vnode *vp, daddr_t daddr, size_t size, int typ bp->b_resid = 0; bp->b_iodone = lfs_free_aiodone; bp->b_cflags |= BC_BUSY | BC_NOCACHE; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_private = fs; mutex_enter(&bufcache_lock); diff --git a/sys/ufs/lfs/lfs_segment.c b/sys/ufs/lfs/lfs_segment.c index 5c0b5befe43..39c4114ba06 100644 --- a/sys/ufs/lfs/lfs_segment.c +++ b/sys/ufs/lfs/lfs_segment.c @@ -2124,6 +2124,9 @@ lfs_writeseg(struct lfs *fs, struct segment *sp) bp = *bpp; if (bp->b_iodone != NULL) { /* UBC or malloced buffer */ bp->b_cflags |= BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif continue; } @@ -2136,6 +2139,9 @@ lfs_writeseg(struct lfs *fs, struct segment *sp) cv_wait(&bp->b_busy, &bufcache_lock); } bp->b_cflags |= BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif mutex_exit(&bufcache_lock); unbusybp = NULL; @@ -2201,6 +2207,9 @@ lfs_writeseg(struct lfs *fs, struct segment *sp) mutex_enter(&bufcache_lock); if (unbusybp != NULL) { unbusybp->b_cflags &= ~BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(V_WRITE, &(unbusybp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif if (unbusybp->b_cflags & BC_WANTED) cv_broadcast(&bp->b_busy); } @@ -2280,6 +2289,9 @@ lfs_writeseg(struct lfs *fs, struct segment *sp) cbp->b_flags |= B_ASYNC; cbp->b_cflags |= BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(cbp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif cbp->b_bcount = 0; KASSERTMSG((bpp - sp->bpp <= @@ -2431,6 +2443,9 @@ lfs_writesuper(struct lfs *fs, daddr_t daddr) LFS_SBPAD - sizeof(struct dlfs)); bp->b_cflags |= BC_BUSY; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_flags = (bp->b_flags & ~B_READ) | B_ASYNC; bp->b_oflags &= ~(BO_DONE | BO_DELWRI); bp->b_error = 0; diff --git a/sys/ufs/lfs/lfs_vfsops.c b/sys/ufs/lfs/lfs_vfsops.c index 324f7af143f..e47d761b76e 100644 --- a/sys/ufs/lfs/lfs_vfsops.c +++ b/sys/ufs/lfs/lfs_vfsops.c @@ -2127,6 +2127,9 @@ lfs_gop_write(struct vnode *vp, struct vm_page **pgs, int npages, mbp->b_data = (void *)kva; mbp->b_resid = mbp->b_bcount = bytes; mbp->b_cflags |= BC_BUSY|BC_AGE; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(mbp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif mbp->b_iodone = uvm_aio_aiodone; bp = NULL; diff --git a/sys/uvm/uvm_swap.c b/sys/uvm/uvm_swap.c index 4922235b6f0..78e066c3f53 100644 --- a/sys/uvm/uvm_swap.c +++ b/sys/uvm/uvm_swap.c @@ -1961,6 +1961,9 @@ uvm_swap_io(struct vm_page **pps, int startslot, int npages, int flags) */ bp->b_cflags = BC_BUSY | BC_NOCACHE; +#ifdef LOCKDOC_VFS + lockdoc_log_lock(P_WRITE, &(bp->b_cflags), __FILE__, __LINE__, __func__, "b_cflags", 0); +#endif bp->b_flags = (flags & (B_READ|B_ASYNC)); bp->b_proc = &proc0; /* XXX */ bp->b_vnbufs.le_next = NOLIST; |
