bcachefs: Fix an exiting of uninitialized iterator
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 13 Nov 2021 17:57:00 +0000 (12:57 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:16 +0000 (17:09 -0400)
bch2_dirent_lookup had an error path where we'd exit a btree_iter that
hadn't been properly initialized.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/dirent.c

index 9267eea810f8bd91495cb5b6e08c221826ee083c..5db1426faaf31496b1cfd8b8b9fd66dab450fbe4 100644 (file)
@@ -418,16 +418,15 @@ int __bch2_dirent_lookup_trans(struct btree_trans *trans,
 
        k = bch2_btree_iter_peek_slot(iter);
        ret = bkey_err(k);
-       if (ret) {
-               bch2_trans_iter_exit(trans, iter);
-               return ret;
-       }
+       if (ret)
+               goto err;
 
        d = bkey_s_c_to_dirent(k);
 
        ret = bch2_dirent_read_target(trans, dir, d, inum);
        if (ret > 0)
                ret = -ENOENT;
+err:
        if (ret)
                bch2_trans_iter_exit(trans, iter);
 
@@ -448,10 +447,10 @@ retry:
 
        ret = __bch2_dirent_lookup_trans(&trans, &iter, dir, hash_info,
                                          name, inum, 0);
-
-       bch2_trans_iter_exit(&trans, &iter);
        if (ret == -EINTR)
                goto retry;
+       if (!ret)
+               bch2_trans_iter_exit(&trans, &iter);
        bch2_trans_exit(&trans);
        return ret;
 }