summaryrefslogtreecommitdiff
path: root/fs/bcachefs/alloc_background.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-03-29 02:37:25 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:58 +0300
commit1546cf972709d9b10c39fdb3bff9da3f22a57226 (patch)
treee2954b97af4a6b6186dd668ca5d3c985739ee533 /fs/bcachefs/alloc_background.c
parent2a6c302fb3a00bd74dfc3882698d290482bc5382 (diff)
downloadlinux-1546cf972709d9b10c39fdb3bff9da3f22a57226.tar.xz
bcachefs: Fix bch2_get_key_or_hole()
This fixes an off by one error, due to confusing closed vs. half open intervals. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/alloc_background.c')
-rw-r--r--fs/bcachefs/alloc_background.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index aea6caa791ea..e5cbb4bce1ee 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -962,10 +962,17 @@ struct bkey_s_c bch2_get_key_or_hole(struct btree_iter *iter, struct bpos end, s
struct bpos next;
bch2_trans_copy_iter(&iter2, iter);
- k = bch2_btree_iter_peek_upto(&iter2,
- bkey_min(bkey_min(end,
- iter->path->l[0].b->key.k.p),
- POS(iter->pos.inode, iter->pos.offset + U32_MAX - 1)));
+
+ if (!bpos_eq(iter->path->l[0].b->key.k.p, SPOS_MAX))
+ end = bkey_min(end, bpos_nosnap_successor(iter->path->l[0].b->key.k.p));
+
+ end = bkey_min(end, POS(iter->pos.inode, iter->pos.offset + U32_MAX - 1));
+
+ /*
+ * btree node min/max is a closed interval, upto takes a half
+ * open interval:
+ */
+ k = bch2_btree_iter_peek_upto(&iter2, end);
next = iter2.pos;
bch2_trans_iter_exit(iter->trans, &iter2);