• Filipe Manana's avatar
    btrfs: do not BUG_ON on failure to get dir index for new snapshot · df9f2782
    Filipe Manana authored
    During the transaction commit path, at create_pending_snapshot(), there
    is no need to BUG_ON() in case we fail to get a dir index for the snapshot
    in the parent directory. This should fail very rarely because the parent
    inode should be loaded in memory already, with the respective delayed
    inode created and the parent inode's index_cnt field already initialized.
    
    However if it fails, it may be -ENOMEM like the comment at
    create_pending_snapshot() says or any error returned by
    btrfs_search_slot() through btrfs_set_inode_index_count(), which can be
    pretty much anything such as -EIO or -EUCLEAN for example. So the comment
    is not correct when it says it can only be -ENOMEM.
    
    However doing a BUG_ON() here is overkill, since we can instead abort
    the transaction and return the error. Note that any error returned by
    create_pending_snapshot() will eventually result in a transaction
    abort at cleanup_transaction(), called from btrfs_commit_transaction(),
    but we can explicitly abort the transaction at this point instead so that
    we get a stack trace to tell us that the call to btrfs_set_inode_index()
    failed.
    
    So just abort the transaction and return in case btrfs_set_inode_index()
    returned an error at create_pending_snapshot().
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    df9f2782
transaction.c 77.5 KB