• Josef Bacik's avatar
    btrfs: record all roots for rename exchange on a subvol · 3e174099
    Josef Bacik authored
    Testing with the new fsstress support for subvolumes uncovered a pretty
    bad problem with rename exchange on subvolumes.  We're modifying two
    different subvolumes, but we only start the transaction on one of them,
    so the other one is not added to the dirty root list.  This is caught by
    btrfs_cow_block() with a warning because the root has not been updated,
    however if we do not modify this root again we'll end up pointing at an
    invalid root because the root item is never updated.
    
    Fix this by making sure we add the destination root to the trans list,
    the same as we do with normal renames.  This fixes the corruption.
    
    Fixes: cdd1fedf ("btrfs: add support for RENAME_EXCHANGE and RENAME_WHITEOUT")
    CC: stable@vger.kernel.org # 4.9+
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    3e174099
inode.c 300 KB