The current block interface for allocating a dirty copy of a given
stable block didn't cow. It moved the existing stable block into
its new dirty location.
This is fine for the btree which will never reference old stable blocks.
It's not optimal for the allocator which is going to want to combine the
previous stable allocator blocks with the current dirty allocator blocks
to determine which free regions can satisfy allocations. If we
invalidate the old stable cached copy it'll immediately read it back in.
And it turns out that it was a little buggy in how it moved the stable
block to its new dirty location. It didn't remove any old blocks at the
new blkno.
So we offer two high level interfaces for either moving or copying
the contents of the dirty block. And we're sure to always invalidate
old cached blocks at the new dirty blkno location.
Signed-off-by: Zach Brown <zab@versity.com>