HAMMER VFS - Fix I/O invalidation collision assertion
Fix more issues with the hammer_reserve subsystem.
* Fix a broken base_offset calculation which had reversed the zone
and offset fields in a HAMMER_ZONE_ENCODE() call. The broken
base_offset caused hammer_del_buffers() to scan the wrong offset
range, leaving conflicting buffer cache buffers intact.
The resulting conflict caused a KKASSERT(LIST_FIRST(&bp->b_dep) == NULL)
to fail later on.
* Hold a reference through a potentially blocking operation in
hammer_blockmap_alloc().
* Record the proper zone in a hammer_reserve() structure created via
hammer_blockmap_free(). Without this the I/O invalidation code
cannot locate conflicting hammer_buffer structures.
* hammer_reserve_setdelay_offset() was not actually placing the
hammer_reserve() structure in the delay queue, allowing it to
be disposed of too early.