Fix a softdep bug exposed by our recent changes to make reboot drop to read-only
authorbeck <beck@openbsd.org>
Wed, 13 Dec 2017 16:38:34 +0000 (16:38 +0000)
committerbeck <beck@openbsd.org>
Wed, 13 Dec 2017 16:38:34 +0000 (16:38 +0000)
commita6cb16e5f888a25da9c36191874fd73fb891b99e
tree98a606543424d2f98d029ddfcb600fa48b38d3d6
parent89312d65ae3e19bb940d5a79819c7db9444c15aa
Fix a softdep bug exposed by our recent changes to make reboot drop to read-only

The deadlock happens when softdep gets the same buffer in the BMSAFEMAP case
that it already called getdirtybuf() on and made busy at the top of the loop.
when this is the case, skip the BMSAFEMAP case and simply write the buffer
out at the bottom of the loop as always. This avoids calling getdirtybuf()
a second time on the same buffer we already took for exclusive use ourself
and have not yet written out.

While I'm in here add a KASSERT for the similar case above, which I don't
think can happen but we would deadlock in the same way if it does.

testing by and ok bluhm@
sys/ufs/ffs/ffs_softdep.c