| From e15ac6413745e3def00e663de00aea5a717311c1 Mon Sep 17 00:00:00 2001 |
| From: Filipe Manana <fdmanana@suse.com> |
| Date: Fri, 1 Oct 2021 13:52:31 +0100 |
| Subject: btrfs: deal with errors when replaying dir entry during log replay |
| |
| From: Filipe Manana <fdmanana@suse.com> |
| |
| commit e15ac6413745e3def00e663de00aea5a717311c1 upstream. |
| |
| At replay_one_one(), we are treating any error returned from |
| btrfs_lookup_dir_item() or from btrfs_lookup_dir_index_item() as meaning |
| that there is no existing directory entry in the fs/subvolume tree. |
| This is not correct since we can get errors such as, for example, -EIO |
| when reading extent buffers while searching the fs/subvolume's btree. |
| |
| So fix that and return the error to the caller when it is not -ENOENT. |
| |
| 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 | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/fs/btrfs/tree-log.c |
| +++ b/fs/btrfs/tree-log.c |
| @@ -1938,7 +1938,14 @@ static noinline int replay_one_name(stru |
| ret = -EINVAL; |
| goto out; |
| } |
| - if (IS_ERR_OR_NULL(dst_di)) { |
| + |
| + if (dst_di == ERR_PTR(-ENOENT)) |
| + dst_di = NULL; |
| + |
| + if (IS_ERR(dst_di)) { |
| + ret = PTR_ERR(dst_di); |
| + goto out; |
| + } else if (!dst_di) { |
| /* we need a sequence number to insert, so we only |
| * do inserts for the BTRFS_DIR_INDEX_KEY types |
| */ |