]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: fix passing 0 to ERR_PTR in btrfs_search_dir_index_item()
authorYue Haibing <yuehaibing@huawei.com>
Tue, 22 Oct 2024 09:52:08 +0000 (17:52 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 1 Nov 2024 01:02:40 +0000 (02:02 +0100)
commit 75f49c3dc7b7423d3734f2e4dabe3dac8d064338 upstream.

The ret may be zero in btrfs_search_dir_index_item() and should not
passed to ERR_PTR(). Now btrfs_unlink_subvol() is the only caller to
this, reconstructed it to check ERR_PTR(-ENOENT) while ret >= 0.

This fixes smatch warnings:

fs/btrfs/dir-item.c:353
  btrfs_search_dir_index_item() warn: passing zero to 'ERR_PTR'

Fixes: 9dcbe16fccbb ("btrfs: use btrfs_for_each_slot in btrfs_search_dir_index_item")
CC: stable@vger.kernel.org # 6.1+
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Yue Haibing <yuehaibing@huawei.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/dir-item.c
fs/btrfs/inode.c

index 001c0c2f872c9925c77ce506236bd9d1f0b58418..1e8cd7c9472e1d357bea3be3bc62fc14ca0f3878 100644 (file)
@@ -347,8 +347,8 @@ btrfs_search_dir_index_item(struct btrfs_root *root, struct btrfs_path *path,
                        return di;
        }
        /* Adjust return code if the key was not found in the next leaf. */
-       if (ret > 0)
-               ret = 0;
+       if (ret >= 0)
+               ret = -ENOENT;
 
        return ERR_PTR(ret);
 }
index b1b6564ab68f0ca7ef9ff4d729c07203d3dc00e9..13675e128af6e07c919ffe5a05b0119d6d6f9b43 100644 (file)
@@ -4339,11 +4339,8 @@ static int btrfs_unlink_subvol(struct btrfs_trans_handle *trans,
         */
        if (btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID) {
                di = btrfs_search_dir_index_item(root, path, dir_ino, &fname.disk_name);
-               if (IS_ERR_OR_NULL(di)) {
-                       if (!di)
-                               ret = -ENOENT;
-                       else
-                               ret = PTR_ERR(di);
+               if (IS_ERR(di)) {
+                       ret = PTR_ERR(di);
                        btrfs_abort_transaction(trans, ret);
                        goto out;
                }