From: Johannes Thumshirn Date: Wed, 12 Dec 2018 14:14:17 +0000 (+0100) Subject: btrfs: improve error handling of btrfs_add_link X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=1690dd41e0cb1dade80850ed8a3eb0121b96d22f;p=openwrt%2Fstaging%2Fblogic.git btrfs: improve error handling of btrfs_add_link In the error handling block, err holds the return value of either btrfs_del_root_ref() or btrfs_del_inode_ref() but it hasn't been checked since it's introduction with commit fe66a05a0679 (Btrfs: improve error handling for btrfs_insert_dir_item callers) in 2012. If the error handling in the error handling fails, there's not much left to do and the abort either happened earlier in the callees or is necessary here. So if one of btrfs_del_root_ref() or btrfs_del_inode_ref() failed, abort the transaction, but still return the original code of the failure stored in 'ret' as this will be reported to the user. Signed-off-by: Johannes Thumshirn Reviewed-by: David Sterba Signed-off-by: David Sterba --- diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index c5c27d5457cc..3d29505971fe 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -6359,14 +6359,19 @@ fail_dir_item: err = btrfs_del_root_ref(trans, key.objectid, root->root_key.objectid, parent_ino, &local_index, name, name_len); - + if (err) + btrfs_abort_transaction(trans, err); } else if (add_backref) { u64 local_index; int err; err = btrfs_del_inode_ref(trans, root, name, name_len, ino, parent_ino, &local_index); + if (err) + btrfs_abort_transaction(trans, err); } + + /* Return the original error code */ return ret; }