• Josef Bacik's avatar
    btrfs: abort the transaction if we fail to inc ref in btrfs_copy_root · 867ed321
    Josef Bacik authored
    While testing my error handling patches, I added a error injection site
    at btrfs_inc_extent_ref, to validate the error handling I added was
    doing the correct thing.  However I hit a pretty ugly corruption while
    doing this check, with the following error injection stack trace:
    
    btrfs_inc_extent_ref
      btrfs_copy_root
        create_reloc_root
          btrfs_init_reloc_root
    	btrfs_record_root_in_trans
    	  btrfs_start_transaction
    	    btrfs_update_inode
    	      btrfs_update_time
    		touch_atime
    		  file_accessed
    		    btrfs_file_mmap
    
    This is because we do not catch the error from btrfs_inc_extent_ref,
    which in practice would be ENOMEM, which means we lose the extent
    references for a root that has already been allocated and inserted,
    which is the problem.  Fix this by aborting the transaction if we fail
    to do the reference modification.
    
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    867ed321
ctree.c 142 KB