summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ata/ata_raid.c4
-rw-r--r--sys/dev/dkwedge/dk.c3
-rw-r--r--sys/dev/fss.c7
-rw-r--r--sys/dev/isa/fd.c3
-rw-r--r--sys/dev/ld.c3
-rw-r--r--sys/dev/raidframe/rf_diskqueue.c3
-rw-r--r--sys/dev/vme/xd.c3
-rw-r--r--sys/dev/vme/xy.c3
-rw-r--r--sys/fs/udf/udf_readwrite.c12
-rw-r--r--sys/fs/udf/udf_strat_rmw.c6
-rw-r--r--sys/kern/kern_physio.c9
-rw-r--r--sys/kern/vfs_bio.c38
-rw-r--r--sys/kern/vfs_subr.c6
-rw-r--r--sys/kern/vfs_wapbl.c6
-rw-r--r--sys/miscfs/genfs/genfs_io.c9
-rw-r--r--sys/sys/buf.h21
-rw-r--r--sys/sys/lockdoc.h2
-rw-r--r--sys/sys/vnode.h2
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c3
-rw-r--r--sys/ufs/ffs/ffs_vnops.c3
-rw-r--r--sys/ufs/lfs/lfs_bio.c17
-rw-r--r--sys/ufs/lfs/lfs_segment.c15
-rw-r--r--sys/ufs/lfs/lfs_vfsops.c3
-rw-r--r--sys/uvm/uvm_swap.c3
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;