• Filipe Manana's avatar
    btrfs: check for commit error at btrfs_attach_transaction_barrier() · b28ff3a7
    Filipe Manana authored
    btrfs_attach_transaction_barrier() is used to get a handle pointing to the
    current running transaction if the transaction has not started its commit
    yet (its state is < TRANS_STATE_COMMIT_START). If the transaction commit
    has started, then we wait for the transaction to commit and finish before
    returning - however we completely ignore if the transaction was aborted
    due to some error during its commit, we simply return ERR_PT(-ENOENT),
    which makes the caller assume everything is fine and no errors happened.
    
    This could make an fsync return success (0) to user space when in fact we
    had a transaction abort and the target inode changes were therefore not
    persisted.
    
    Fix this by checking for the return value from btrfs_wait_for_commit(),
    and if it returned an error, return it back to the caller.
    
    Fixes: d4edf39b ("Btrfs: fix uncompleted transaction")
    CC: stable@vger.kernel.org # 4.19+
    Reviewed-by: default avatarQu Wenruo <wqu@suse.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>
    b28ff3a7
transaction.c 77.6 KB