btrfs: use a single variable to track return value for log_dir_items()
authorFilipe Manana <fdmanana@suse.com>
Tue, 10 Jan 2023 14:56:41 +0000 (14:56 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 13 Feb 2023 16:50:34 +0000 (17:50 +0100)
We currently use 'ret' and 'err' to track the return value for
log_dir_items(), which is confusing and likely the cause for previous
bugs where log_dir_items() did not return an error when it should, fixed
in previous patches.

So change this and use only a single variable, 'ret', to track the return
value. This is simpler and makes it similar to most of the existing code.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-log.c

index 94fc8b08254c17e7869e30a9005e0f5a32d7f77d..997ba92481cb9ec05f93c917906fd2bbede2e91c 100644 (file)
@@ -3793,7 +3793,6 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,
        struct btrfs_key min_key;
        struct btrfs_root *root = inode->root;
        struct btrfs_root *log = root->log_root;
-       int err = 0;
        int ret;
        u64 last_old_dentry_offset = min_offset - 1;
        u64 last_offset = (u64)-1;
@@ -3834,8 +3833,8 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,
                                              path->slots[0]);
                        if (tmp.type == BTRFS_DIR_INDEX_KEY)
                                last_old_dentry_offset = tmp.offset;
-               } else if (ret < 0) {
-                       err = ret;
+               } else if (ret > 0) {
+                       ret = 0;
                }
 
                goto done;
@@ -3858,7 +3857,6 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,
                if (tmp.type == BTRFS_DIR_INDEX_KEY)
                        last_old_dentry_offset = tmp.offset;
        } else if (ret < 0) {
-               err = ret;
                goto done;
        }
 
@@ -3880,12 +3878,15 @@ static noinline int log_dir_items(struct btrfs_trans_handle *trans,
         */
 search:
        ret = btrfs_search_slot(NULL, root, &min_key, path, 0, 0);
-       if (ret > 0)
+       if (ret > 0) {
                ret = btrfs_next_item(root, path);
+               if (ret > 0) {
+                       /* There are no more keys in the inode's root. */
+                       ret = 0;
+                       goto done;
+               }
+       }
        if (ret < 0)
-               err = ret;
-       /* If ret is 1, there are no more keys in the inode's root. */
-       if (ret != 0)
                goto done;
 
        /*
@@ -3896,8 +3897,8 @@ search:
                ret = process_dir_items_leaf(trans, inode, path, dst_path, ctx,
                                             &last_old_dentry_offset);
                if (ret != 0) {
-                       if (ret < 0)
-                               err = ret;
+                       if (ret > 0)
+                               ret = 0;
                        goto done;
                }
                path->slots[0] = btrfs_header_nritems(path->nodes[0]);
@@ -3908,10 +3909,10 @@ search:
                 */
                ret = btrfs_next_leaf(root, path);
                if (ret) {
-                       if (ret == 1)
+                       if (ret == 1) {
                                last_offset = (u64)-1;
-                       else
-                               err = ret;
+                               ret = 0;
+                       }
                        goto done;
                }
                btrfs_item_key_to_cpu(path->nodes[0], &min_key, path->slots[0]);
@@ -3942,7 +3943,7 @@ done:
        btrfs_release_path(path);
        btrfs_release_path(dst_path);
 
-       if (err == 0) {
+       if (ret == 0) {
                *last_offset_ret = last_offset;
                /*
                 * In case the leaf was changed in the current transaction but
@@ -3953,15 +3954,13 @@ done:
                 * a range, last_old_dentry_offset is == to last_offset.
                 */
                ASSERT(last_old_dentry_offset <= last_offset);
-               if (last_old_dentry_offset < last_offset) {
+               if (last_old_dentry_offset < last_offset)
                        ret = insert_dir_log_key(trans, log, path, ino,
                                                 last_old_dentry_offset + 1,
                                                 last_offset);
-                       if (ret)
-                               err = ret;
-               }
        }
-       return err;
+
+       return ret;
 }
 
 /*