• Josef Bacik's avatar
    Btrfs: inline checksums into the disk free space cache · 5b0e95bf
    Josef Bacik authored
    Yeah yeah I know this is how we used to do it and then I changed it, but damnit
    I'm changing it back.  The fact is that writing out checksums will modify
    metadata, which could cause us to dirty a block group we've already written out,
    so we have to truncate it and all of it's checksums and re-write it which will
    write new checksums which could dirty a blockg roup that has already been
    written and you see where I'm going with this?  This can cause unmount or really
    anything that depends on a transaction to commit to take it's sweet damned time
    to happen.  So go back to the way it was, only this time we're specifically
    setting NODATACOW because we can't go through the COW pathway anyway and we're
    doing our own built-in cow'ing by truncating the free space cache.  The other
    new thing is once we truncate the old cache and preallocate the new space, we
    don't need to do that song and dance at all for the rest of the transaction, we
    can just overwrite the existing space with the new cache if the block group
    changes for whatever reason, and the NODATACOW will let us do this fine.  So
    keep track of which transaction we last cleared our cache in and if we cleared
    it in this transaction just say we're all setup and carry on.  This survives
    xfstests and stress.sh.
    
    The inode cache will continue to use the normal csum infrastructure since it
    only gets written once and there will be no more modifications to the fs tree in
    a transaction commit.
    Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
    5b0e95bf
extent-tree.c 197 KB