bcachefs: Better iterator picking
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 14 Apr 2021 17:29:34 +0000 (13:29 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:00 +0000 (17:09 -0400)
Avoid cloning iterators if we don't have to.

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

index 033a079fb3f3ef6e2dacbc00213d483dc6b79d5c..7d8b7d765cf7a64e32dbdbefe5aef4107dcdd98f 100644 (file)
@@ -2017,10 +2017,14 @@ struct btree_iter *__bch2_trans_get_iter(struct btree_trans *trans,
                if (iter->btree_id != btree_id)
                        continue;
 
-               if (best &&
-                   bkey_cmp(bpos_diff(best->real_pos, pos),
-                            bpos_diff(iter->real_pos, pos)) < 0)
-                       continue;
+               if (best) {
+                       int cmp = bkey_cmp(bpos_diff(best->real_pos, pos),
+                                          bpos_diff(iter->real_pos, pos));
+
+                       if (cmp < 0 ||
+                           ((cmp == 0 && btree_iter_keep(trans, iter))))
+                               continue;
+               }
 
                best = iter;
        }