HAMMER VFS - Fix deadlock during read-only HAMMER mount
* HAMMER UNDOs are addressed using zone-1 (HAMMER_ZONE_RAW_VOLUME) and
zone-2 (HAMMER_ZONE_RAW_BUFFER) data offsets. Normal filesystem
operations may use zone references which are incompatible with the UNDO
data references. That is, they may use a different zone accessing
the same physical disk offset.
Normally when the UNDO is run the modified buffers are flushed to disk
and the buffers are destroyed before normal filesystem operations begin.
Thus it isn't a problem for normal R+W mounts.
* Read-only mounts are a different story. The modified buffers from the
undo are left in core memory (they cannot be flushed yet because the
mount is read-only). The incompatible zones cause the HAMMER buffer
system to lose track of related locked buffer cache buffers and can lead
to a deadlock.
* Fix this by explicitly checking for a read-only mount and doing a
secondary lookup using the RAW zone for certain selected zones.
Reported-by: Matthias Schmidt <matthias@dragonflybsd.org>