Commit df88febc authored by Kent Overstreet's avatar Kent Overstreet
Browse files

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
Loading
Loading
Loading
Loading
+5 −16
Original line number Diff line number Diff line
@@ -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,20 +809,15 @@ 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);

	/*
@@ -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)
+9 −14
Original line number Diff line number Diff line
@@ -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 *,
				    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);			\
									\
	struct bch_extent_ptr *_ptr = &_ptrs.start->ptr;		\
									\
	while ((_ptr = bkey_ptr_next(_ptrs, _ptr))) {			\
		if (_cond) {						\
			_ptr = (void *) bch2_bkey_drop_ptr(_k, _ptr);	\
	__label__ _again;						\
	struct bkey_ptrs _ptrs;						\
_again:									\
	_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)