How about this change instead? Still going over the rest of the function calls of wapbl_flush.
>From d51a64a5e9a15169949b8f1442c79060c157536d Mon Sep 17 00:00:00 2001 From: coypu <[email protected]> Date: Wed, 11 May 2016 13:08:06 +0300 Subject: [PATCH 1/2] assert wl_mtx held in wapbl_transaction_len --- sys/kern/vfs_wapbl.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sys/kern/vfs_wapbl.c b/sys/kern/vfs_wapbl.c index e63f228..e317daf 100644 --- a/sys/kern/vfs_wapbl.c +++ b/sys/kern/vfs_wapbl.c @@ -2098,6 +2098,9 @@ wapbl_transaction_len(struct wapbl *wl) sizeof(((struct wapbl_wc_blocklist *)0)->wc_blocks[0]); KASSERT(bph > 0); +#ifdef WAPBL_DEBUG /* XXX: get rid of this eventually */ + KASSERT(mutex_owned(&wl->wl_mtx)); +#endif len = wl->wl_bcount; len += howmany(wl->wl_bufcount, bph) * blocklen; -- 2.8.1 >From fa8f55b0373747697f81c4fedc36deb93ad2e51d Mon Sep 17 00:00:00 2001 From: coypu <[email protected]> Date: Wed, 11 May 2016 14:27:46 +0300 Subject: [PATCH 2/2] hold wl_mtx for wapbl_truncate and wl_bufcount --- sys/kern/vfs_wapbl.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sys/kern/vfs_wapbl.c b/sys/kern/vfs_wapbl.c index e317daf..3d2fd4c 100644 --- a/sys/kern/vfs_wapbl.c +++ b/sys/kern/vfs_wapbl.c @@ -1592,6 +1592,9 @@ wapbl_flush(struct wapbl *wl, int waitfor) * file system didn't produce any blocks as a consequence of * it, but the same does not seem to be so of wl_inohashcnt. */ + + mutex_enter(&wl->wl_mtx); /* protect bufcount, truncate call */ + if (wl->wl_bufcount == 0) { goto wait_out; } @@ -1624,6 +1627,9 @@ wapbl_flush(struct wapbl *wl, int waitfor) } error = wapbl_truncate(wl, flushsize); + + mutex_exit(&wl->wl_mtx); + if (error) goto out; @@ -1753,6 +1759,7 @@ wapbl_flush(struct wapbl *wl, int waitfor) error = wapbl_truncate(wl, wl->wl_circ_size - wl->wl_reserved_bytes); } + mutex_exit(&wl->wl_mtx); out: if (error) { -- 2.8.1
