summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-03-05 00:26:19 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:55 +0300
commit61a19ce4255abd1133d4e7cd64a6cfa40d1f37fa (patch)
tree2440c784ca3b4d2c7ad6c1b41bdd17083475d017
parentf020bfcdb058e4542a4682557e046a750dc71660 (diff)
downloadlinux-61a19ce4255abd1133d4e7cd64a6cfa40d1f37fa.tar.xz
bcachefs: Fix bpos_diff()
Previously, bpos_diff() did not handle borrows correctly. Minor thing considering how it was used, but worth fixing. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/bkey.h31
-rw-r--r--fs/bcachefs/btree_iter.c8
2 files changed, 31 insertions, 8 deletions
diff --git a/fs/bcachefs/bkey.h b/fs/bcachefs/bkey.h
index 25cb5e985109..77d9d871adfb 100644
--- a/fs/bcachefs/bkey.h
+++ b/fs/bcachefs/bkey.h
@@ -183,6 +183,37 @@ static inline struct bpos bpos_max(struct bpos l, struct bpos r)
return bkey_cmp(l, r) > 0 ? l : r;
}
+#define sbb(a, b, borrow) \
+do { \
+ typeof(a) d1, d2; \
+ \
+ d1 = a - borrow; \
+ borrow = d1 > a; \
+ \
+ d2 = d1 - b; \
+ borrow += d2 > d1; \
+ a = d2; \
+} while (0)
+
+/* returns a - b: */
+static inline struct bpos bpos_sub(struct bpos a, struct bpos b)
+{
+ int borrow = 0;
+
+ sbb(a.snapshot, b.snapshot, borrow);
+ sbb(a.offset, b.offset, borrow);
+ sbb(a.inode, b.inode, borrow);
+ return a;
+}
+
+static inline struct bpos bpos_diff(struct bpos l, struct bpos r)
+{
+ if (bkey_cmp(l, r) > 0)
+ swap(l, r);
+
+ return bpos_sub(r, l);
+}
+
void bch2_bpos_swab(struct bpos *);
void bch2_bkey_swab_key(const struct bkey_format *, struct bkey_packed *);
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 69d15bb20c7c..bf59678b609e 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -2067,14 +2067,6 @@ static inline void btree_iter_copy(struct btree_iter *dst,
dst->flags &= ~BTREE_ITER_SET_POS_AFTER_COMMIT;
}
-static inline struct bpos bpos_diff(struct bpos l, struct bpos r)
-{
- if (bkey_cmp(l, r) > 0)
- swap(l, r);
-
- return POS(r.inode - l.inode, r.offset - l.offset);
-}
-
static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans,
unsigned btree_id, struct bpos pos,
unsigned flags)