]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: fix missing error handling when searching for inode refs during log replay
authorFilipe Manana <fdmanana@suse.com>
Wed, 18 Jun 2025 15:57:07 +0000 (16:57 +0100)
committerDavid Sterba <dsterba@suse.com>
Fri, 27 Jun 2025 17:56:35 +0000 (19:56 +0200)
During log replay, at __add_inode_ref(), when we are searching for inode
ref keys we totally ignore if btrfs_search_slot() returns an error. This
may make a log replay succeed when there was an actual error and leave
some metadata inconsistency in a subvolume tree. Fix this by checking if
an error was returned from btrfs_search_slot() and if so, return it to
the caller.

Fixes: e02119d5a7b4 ("Btrfs: Add a write ahead tree log to optimize synchronous operations")
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-log.c

index 858b609e292cb9414663a16c76b522bb788be601..8b66173d9023b7af4fd2df8569bbcd11b85d7ae3 100644 (file)
@@ -1073,7 +1073,9 @@ again:
        search_key.type = BTRFS_INODE_REF_KEY;
        search_key.offset = parent_objectid;
        ret = btrfs_search_slot(NULL, root, &search_key, path, 0, 0);
-       if (ret == 0) {
+       if (ret < 0) {
+               return ret;
+       } else if (ret == 0) {
                struct btrfs_inode_ref *victim_ref;
                unsigned long ptr;
                unsigned long ptr_end;