bcachefs: Refactor __bch2_cut_front()
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 18 Jul 2019 21:21:21 +0000 (17:21 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:24 +0000 (17:08 -0400)
Minor cleanup - prep work for new key types for reflink

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/extents.c
fs/bcachefs/extents.h

index 4d3722cb7e33c7de96a8152fc208c337c443822d..60fe50368d21718514f64abc5b9534dd38acb357 100644 (file)
@@ -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;
                }
-       }
 
-       k.k->size = len;
-
-       return true;
+               break;
+       }
+       case KEY_TYPE_reservation:
+               break;
+       default:
+               BUG();
+       }
 }
 
 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;
 
index fe92737354bd202815ea70fb627b383824911520..549188c864ae3d98cada02d612f495eaeaffa3e8 100644 (file)
@@ -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 *);