| From cfd312695b71df04c3a2597859ff12c470d1e2e4 Mon Sep 17 00:00:00 2001 |
| From: Filipe Manana <fdmanana@suse.com> |
| Date: Fri, 1 Oct 2021 13:48:18 +0100 |
| Subject: btrfs: check for error when looking up inode during dir entry replay |
| |
| From: Filipe Manana <fdmanana@suse.com> |
| |
| commit cfd312695b71df04c3a2597859ff12c470d1e2e4 upstream. |
| |
| At replay_one_name(), we are treating any error from btrfs_lookup_inode() |
| as if the inode does not exists. Fix this by checking for an error and |
| returning it to the caller. |
| |
| CC: stable@vger.kernel.org # 4.14+ |
| Signed-off-by: Filipe Manana <fdmanana@suse.com> |
| Reviewed-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: David Sterba <dsterba@suse.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/btrfs/tree-log.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| --- a/fs/btrfs/tree-log.c |
| +++ b/fs/btrfs/tree-log.c |
| @@ -1902,8 +1902,8 @@ static noinline int replay_one_name(stru |
| struct btrfs_key log_key; |
| struct inode *dir; |
| u8 log_type; |
| - int exists; |
| - int ret = 0; |
| + bool exists; |
| + int ret; |
| bool update_size = (key->type == BTRFS_DIR_INDEX_KEY); |
| bool name_added = false; |
| |
| @@ -1923,12 +1923,12 @@ static noinline int replay_one_name(stru |
| name_len); |
| |
| btrfs_dir_item_key_to_cpu(eb, di, &log_key); |
| - exists = btrfs_lookup_inode(trans, root, path, &log_key, 0); |
| - if (exists == 0) |
| - exists = 1; |
| - else |
| - exists = 0; |
| + ret = btrfs_lookup_inode(trans, root, path, &log_key, 0); |
| btrfs_release_path(path); |
| + if (ret < 0) |
| + goto out; |
| + exists = (ret == 0); |
| + ret = 0; |
| |
| if (key->type == BTRFS_DIR_ITEM_KEY) { |
| dst_di = btrfs_lookup_dir_item(trans, root, path, key->objectid, |