]> www.infradead.org Git - users/hch/dma-mapping.git/commitdiff
bcachefs: Simplify bch2_bkey_drop_ptrs()
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 4 Sep 2024 21:49:20 +0000 (17:49 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 9 Sep 2024 13:41:46 +0000 (09:41 -0400)
bch2_bkey_drop_ptrs() had a some complicated machinery for avoiding
O(n^2) when dropping multiple pointers - but when n is only going to be
~4, it's not worth it.

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

index eb31bda195443bdef19d0ace41af101dc9b94469..1a0c714c13e2f3e8b56d910ebb5bcbf3210ad0e0 100644 (file)
@@ -781,12 +781,10 @@ static union bch_extent_entry *extent_entry_prev(struct bkey_ptrs ptrs,
 /*
  * Returns pointer to the next entry after the one being dropped:
  */
-union bch_extent_entry *bch2_bkey_drop_ptr_noerror(struct bkey_s k,
-                                                  struct bch_extent_ptr *ptr)
+void bch2_bkey_drop_ptr_noerror(struct bkey_s k, struct bch_extent_ptr *ptr)
 {
        struct bkey_ptrs ptrs = bch2_bkey_ptrs(k);
        union bch_extent_entry *entry = to_entry(ptr), *next;
-       union bch_extent_entry *ret = entry;
        bool drop_crc = true;
 
        EBUG_ON(ptr < &ptrs.start->ptr ||
@@ -811,21 +809,16 @@ union bch_extent_entry *bch2_bkey_drop_ptr_noerror(struct bkey_s k,
                        break;
 
                if ((extent_entry_is_crc(entry) && drop_crc) ||
-                   extent_entry_is_stripe_ptr(entry)) {
-                       ret = (void *) ret - extent_entry_bytes(entry);
+                   extent_entry_is_stripe_ptr(entry))
                        extent_entry_drop(k, entry);
-               }
        }
-
-       return ret;
 }
 
-union bch_extent_entry *bch2_bkey_drop_ptr(struct bkey_s k,
-                                          struct bch_extent_ptr *ptr)
+void bch2_bkey_drop_ptr(struct bkey_s k, struct bch_extent_ptr *ptr)
 {
        bool have_dirty = bch2_bkey_dirty_devs(k.s_c).nr;
-       union bch_extent_entry *ret =
-               bch2_bkey_drop_ptr_noerror(k, ptr);
+
+       bch2_bkey_drop_ptr_noerror(k, ptr);
 
        /*
         * If we deleted all the dirty pointers and there's still cached
@@ -837,14 +830,10 @@ union bch_extent_entry *bch2_bkey_drop_ptr(struct bkey_s k,
            !bch2_bkey_dirty_devs(k.s_c).nr) {
                k.k->type = KEY_TYPE_error;
                set_bkey_val_u64s(k.k, 0);
-               ret = NULL;
        } else if (!bch2_bkey_nr_ptrs(k.s_c)) {
                k.k->type = KEY_TYPE_deleted;
                set_bkey_val_u64s(k.k, 0);
-               ret = NULL;
        }
-
-       return ret;
 }
 
 void bch2_bkey_drop_device(struct bkey_s k, unsigned dev)
index 709dd83183be1fe5961da72681861390dd49dc8e..42a7c6d820a005382e9024d5c2f39833ed4eed49 100644 (file)
@@ -649,26 +649,21 @@ static inline void bch2_bkey_append_ptr(struct bkey_i *k, struct bch_extent_ptr
 
 void bch2_extent_ptr_decoded_append(struct bkey_i *,
                                    struct extent_ptr_decoded *);
-union bch_extent_entry *bch2_bkey_drop_ptr_noerror(struct bkey_s,
-                                                  struct bch_extent_ptr *);
-union bch_extent_entry *bch2_bkey_drop_ptr(struct bkey_s,
-                                          struct bch_extent_ptr *);
+void bch2_bkey_drop_ptr_noerror(struct bkey_s, struct bch_extent_ptr *);
+void bch2_bkey_drop_ptr(struct bkey_s, struct bch_extent_ptr *);
 
 #define bch2_bkey_drop_ptrs(_k, _ptr, _cond)                           \
 do {                                                                   \
-       struct bkey_ptrs _ptrs = bch2_bkey_ptrs(_k);                    \
+       __label__ _again;                                               \
+       struct bkey_ptrs _ptrs;                                         \
+_again:                                                                        \
+       _ptrs = bch2_bkey_ptrs(_k);                                     \
                                                                        \
-       struct bch_extent_ptr *_ptr = &_ptrs.start->ptr;                \
-                                                                       \
-       while ((_ptr = bkey_ptr_next(_ptrs, _ptr))) {                   \
+       bkey_for_each_ptr(_ptrs, _ptr)                                  \
                if (_cond) {                                            \
-                       _ptr = (void *) bch2_bkey_drop_ptr(_k, _ptr);   \
-                       _ptrs = bch2_bkey_ptrs(_k);                     \
-                       continue;                                       \
+                       bch2_bkey_drop_ptr(_k, _ptr);                   \
+                       goto _again;                                    \
                }                                                       \
-                                                                       \
-               (_ptr)++;                                               \
-       }                                                               \
 } while (0)
 
 bool bch2_bkey_matches_ptr(struct bch_fs *, struct bkey_s_c,