Greetings,
Looking at the code of should_cow_block(), I see:
if (btrfs_header_generation(buf) == trans->transid &&
!btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN) &&
...
So if the extent buffer has been written to disk, and now is changed again
in the same transaction, we insist on COW'ing it. Can anybody explain why
COW is needed in this case? The transaction has not committed yet, so what
is the danger of rewriting to the same location on disk? My understanding
was that a tree block needs to be COW'ed at most once in the same
transaction. But I see that this is not the case.
I am asking because I am doing some profiling of btrfs metadata work under
heavy loads, and I see that sometimes btrfs COW's almost twice more tree
blocks than the total metadata size.
Thanks,
Alex.
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html