From b1c9358a25eb0ed94c5bfc18ba5f9b00d51d8863 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 18 Jul 2019 17:21:21 -0400 Subject: [PATCH] bcachefs: Refactor __bch2_cut_front() Minor cleanup - prep work for new key types for reflink Signed-off-by: Kent Overstreet --- fs/bcachefs/extents.c | 50 +++++++++++++++++++++++-------------------- fs/bcachefs/extents.h | 6 +++--- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index 4d3722cb7e33..60fe50368d21 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -707,44 +707,47 @@ void bch2_btree_ptr_to_text(struct printbuf *out, struct bch_fs *c, /* Extents */ -bool __bch2_cut_front(struct bpos where, struct bkey_s k) +void __bch2_cut_front(struct bpos where, struct bkey_s k) { - u64 len = 0; + u64 sub; if (bkey_cmp(where, bkey_start_pos(k.k)) <= 0) - return false; + return; EBUG_ON(bkey_cmp(where, k.k->p) > 0); - len = k.k->p.offset - where.offset; + sub = where.offset - bkey_start_offset(k.k); - BUG_ON(len > k.k->size); + k.k->size -= sub; - /* - * Don't readjust offset if the key size is now 0, because that could - * cause offset to point to the next bucket: - */ - if (!len) + if (!k.k->size) k.k->type = KEY_TYPE_deleted; - else if (bkey_extent_is_data(k.k)) { - struct bkey_s_extent e = bkey_s_to_extent(k); + + switch (k.k->type) { + case KEY_TYPE_deleted: + case KEY_TYPE_discard: + case KEY_TYPE_error: + case KEY_TYPE_cookie: + break; + case KEY_TYPE_extent: { + struct bkey_ptrs ptrs = bch2_bkey_ptrs(k); union bch_extent_entry *entry; bool seen_crc = false; - extent_for_each_entry(e, entry) { + bkey_extent_entry_for_each(ptrs, entry) { switch (extent_entry_type(entry)) { case BCH_EXTENT_ENTRY_ptr: if (!seen_crc) - entry->ptr.offset += e.k->size - len; + entry->ptr.offset += sub; break; case BCH_EXTENT_ENTRY_crc32: - entry->crc32.offset += e.k->size - len; + entry->crc32.offset += sub; break; case BCH_EXTENT_ENTRY_crc64: - entry->crc64.offset += e.k->size - len; + entry->crc64.offset += sub; break; case BCH_EXTENT_ENTRY_crc128: - entry->crc128.offset += e.k->size - len; + entry->crc128.offset += sub; break; case BCH_EXTENT_ENTRY_stripe_ptr: break; @@ -753,11 +756,14 @@ bool __bch2_cut_front(struct bpos where, struct bkey_s k) if (extent_entry_is_crc(entry)) seen_crc = true; } + + break; + } + case KEY_TYPE_reservation: + break; + default: + BUG(); } - - k.k->size = len; - - return true; } bool bch2_cut_back(struct bpos where, struct bkey *k) @@ -771,8 +777,6 @@ bool bch2_cut_back(struct bpos where, struct bkey *k) len = where.offset - bkey_start_offset(k); - BUG_ON(len > k->size); - k->p = where; k->size = len; diff --git a/fs/bcachefs/extents.h b/fs/bcachefs/extents.h index fe92737354bd..549188c864ae 100644 --- a/fs/bcachefs/extents.h +++ b/fs/bcachefs/extents.h @@ -540,11 +540,11 @@ do { \ } \ } while (0) -bool __bch2_cut_front(struct bpos, struct bkey_s); +void __bch2_cut_front(struct bpos, struct bkey_s); -static inline bool bch2_cut_front(struct bpos where, struct bkey_i *k) +static inline void bch2_cut_front(struct bpos where, struct bkey_i *k) { - return __bch2_cut_front(where, bkey_i_to_s(k)); + __bch2_cut_front(where, bkey_i_to_s(k)); } bool bch2_cut_back(struct bpos, struct bkey *);