Commit 9c2e6242 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Fix livelock calling bch2_mark_bkey_replicas()

The bug was that we were trying to find a replicas entry that wasn't
sorted - but, we can also simplify the code by not using
bch2_mark_bkey_replicas and instead ensuring the list of replicas
entries exists directly.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 2940295c
...@@ -707,11 +707,9 @@ int bch2_trans_commit_error(struct btree_trans *trans, ...@@ -707,11 +707,9 @@ int bch2_trans_commit_error(struct btree_trans *trans,
case BTREE_INSERT_NEED_MARK_REPLICAS: case BTREE_INSERT_NEED_MARK_REPLICAS:
bch2_trans_unlock(trans); bch2_trans_unlock(trans);
trans_for_each_update(trans, i) { ret = bch2_replicas_delta_list_mark(c, trans->fs_usage_deltas);
ret = bch2_mark_bkey_replicas(c, bkey_i_to_s_c(i->k));
if (ret) if (ret)
return ret; return ret;
}
if (bch2_trans_relock(trans)) if (bch2_trans_relock(trans))
return 0; return 0;
......
...@@ -565,6 +565,7 @@ static inline void update_replicas_list(struct btree_trans *trans, ...@@ -565,6 +565,7 @@ static inline void update_replicas_list(struct btree_trans *trans,
n->delta = sectors; n->delta = sectors;
memcpy((void *) n + offsetof(struct replicas_delta, r), memcpy((void *) n + offsetof(struct replicas_delta, r),
r, replicas_entry_bytes(r)); r, replicas_entry_bytes(r));
bch2_replicas_entry_sort(&n->r);
d->used += b; d->used += b;
} }
...@@ -615,6 +616,18 @@ int bch2_replicas_delta_list_apply(struct bch_fs *c, ...@@ -615,6 +616,18 @@ int bch2_replicas_delta_list_apply(struct bch_fs *c,
return -1; return -1;
} }
int bch2_replicas_delta_list_mark(struct bch_fs *c,
struct replicas_delta_list *r)
{
struct replicas_delta *d = r->d;
struct replicas_delta *top = (void *) r->d + r->used;
int ret = 0;
for (d = r->d; !ret && d != top; d = replicas_delta_next(d))
ret = bch2_mark_replicas(c, &d->r);
return ret;
}
#define do_mark_fn(fn, c, pos, flags, ...) \ #define do_mark_fn(fn, c, pos, flags, ...) \
({ \ ({ \
int gc, ret = 0; \ int gc, ret = 0; \
......
...@@ -253,6 +253,8 @@ int bch2_mark_update(struct btree_trans *, struct btree_iter *, ...@@ -253,6 +253,8 @@ int bch2_mark_update(struct btree_trans *, struct btree_iter *,
int bch2_replicas_delta_list_apply(struct bch_fs *, int bch2_replicas_delta_list_apply(struct bch_fs *,
struct bch_fs_usage *, struct bch_fs_usage *,
struct replicas_delta_list *); struct replicas_delta_list *);
int bch2_replicas_delta_list_mark(struct bch_fs *,
struct replicas_delta_list *);
int bch2_trans_mark_key(struct btree_trans *, struct bkey_s_c, struct bkey_s_c, int bch2_trans_mark_key(struct btree_trans *, struct bkey_s_c, struct bkey_s_c,
unsigned, s64, unsigned); unsigned, s64, unsigned);
int bch2_trans_mark_update(struct btree_trans *, struct btree_iter *iter, int bch2_trans_mark_update(struct btree_trans *, struct btree_iter *iter,
......
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