Commit df88febc authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: Simplify bch2_bkey_drop_ptrs()

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: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent ec36573d
...@@ -781,12 +781,10 @@ static union bch_extent_entry *extent_entry_prev(struct bkey_ptrs ptrs, ...@@ -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: * Returns pointer to the next entry after the one being dropped:
*/ */
union bch_extent_entry *bch2_bkey_drop_ptr_noerror(struct bkey_s k, void bch2_bkey_drop_ptr_noerror(struct bkey_s k, struct bch_extent_ptr *ptr)
struct bch_extent_ptr *ptr)
{ {
struct bkey_ptrs ptrs = bch2_bkey_ptrs(k); struct bkey_ptrs ptrs = bch2_bkey_ptrs(k);
union bch_extent_entry *entry = to_entry(ptr), *next; union bch_extent_entry *entry = to_entry(ptr), *next;
union bch_extent_entry *ret = entry;
bool drop_crc = true; bool drop_crc = true;
EBUG_ON(ptr < &ptrs.start->ptr || EBUG_ON(ptr < &ptrs.start->ptr ||
...@@ -811,20 +809,15 @@ union bch_extent_entry *bch2_bkey_drop_ptr_noerror(struct bkey_s k, ...@@ -811,20 +809,15 @@ union bch_extent_entry *bch2_bkey_drop_ptr_noerror(struct bkey_s k,
break; break;
if ((extent_entry_is_crc(entry) && drop_crc) || if ((extent_entry_is_crc(entry) && drop_crc) ||
extent_entry_is_stripe_ptr(entry)) { extent_entry_is_stripe_ptr(entry))
ret = (void *) ret - extent_entry_bytes(entry);
extent_entry_drop(k, entry); extent_entry_drop(k, entry);
} }
}
return ret;
} }
union bch_extent_entry *bch2_bkey_drop_ptr(struct bkey_s k, void bch2_bkey_drop_ptr(struct bkey_s k, struct bch_extent_ptr *ptr)
struct bch_extent_ptr *ptr)
{ {
bool have_dirty = bch2_bkey_dirty_devs(k.s_c).nr; 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);
/* /*
...@@ -837,14 +830,10 @@ union bch_extent_entry *bch2_bkey_drop_ptr(struct bkey_s k, ...@@ -837,14 +830,10 @@ union bch_extent_entry *bch2_bkey_drop_ptr(struct bkey_s k,
!bch2_bkey_dirty_devs(k.s_c).nr) { !bch2_bkey_dirty_devs(k.s_c).nr) {
k.k->type = KEY_TYPE_error; k.k->type = KEY_TYPE_error;
set_bkey_val_u64s(k.k, 0); set_bkey_val_u64s(k.k, 0);
ret = NULL;
} else if (!bch2_bkey_nr_ptrs(k.s_c)) { } else if (!bch2_bkey_nr_ptrs(k.s_c)) {
k.k->type = KEY_TYPE_deleted; k.k->type = KEY_TYPE_deleted;
set_bkey_val_u64s(k.k, 0); set_bkey_val_u64s(k.k, 0);
ret = NULL;
} }
return ret;
} }
void bch2_bkey_drop_device(struct bkey_s k, unsigned dev) void bch2_bkey_drop_device(struct bkey_s k, unsigned dev)
......
...@@ -649,25 +649,20 @@ static inline void bch2_bkey_append_ptr(struct bkey_i *k, struct bch_extent_ptr ...@@ -649,25 +649,20 @@ static inline void bch2_bkey_append_ptr(struct bkey_i *k, struct bch_extent_ptr
void bch2_extent_ptr_decoded_append(struct bkey_i *, void bch2_extent_ptr_decoded_append(struct bkey_i *,
struct extent_ptr_decoded *); struct extent_ptr_decoded *);
union bch_extent_entry *bch2_bkey_drop_ptr_noerror(struct bkey_s, void bch2_bkey_drop_ptr_noerror(struct bkey_s, struct bch_extent_ptr *);
struct bch_extent_ptr *); void bch2_bkey_drop_ptr(struct bkey_s, struct bch_extent_ptr *);
union bch_extent_entry *bch2_bkey_drop_ptr(struct bkey_s,
struct bch_extent_ptr *);
#define bch2_bkey_drop_ptrs(_k, _ptr, _cond) \ #define bch2_bkey_drop_ptrs(_k, _ptr, _cond) \
do { \ do { \
struct bkey_ptrs _ptrs = bch2_bkey_ptrs(_k); \ __label__ _again; \
\ struct bkey_ptrs _ptrs; \
struct bch_extent_ptr *_ptr = &_ptrs.start->ptr; \ _again: \
\
while ((_ptr = bkey_ptr_next(_ptrs, _ptr))) { \
if (_cond) { \
_ptr = (void *) bch2_bkey_drop_ptr(_k, _ptr); \
_ptrs = bch2_bkey_ptrs(_k); \ _ptrs = bch2_bkey_ptrs(_k); \
continue; \
} \
\ \
(_ptr)++; \ bkey_for_each_ptr(_ptrs, _ptr) \
if (_cond) { \
bch2_bkey_drop_ptr(_k, _ptr); \
goto _again; \
} \ } \
} while (0) } while (0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment