diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-10-29 16:29:13 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:15 -0400 |
commit | 961b2d62821f23f9f963ee069b64eb8806f05e40 (patch) | |
tree | 4f78fc755bc7252ef9bb870fa1f73cb8c6a8e360 /fs/bcachefs/ec.c | |
parent | 37f72492f401671f1f773cc62dddf742e7fc553b (diff) |
bcachefs: Assorted ec fixes
- The backpointer that ec_stripe_update_ptrs() uses now needs to include
the snapshot ID, which means we have to change where we add the
backpointer to after getting the snapshot ID for the new extents
- ec_stripe_update_ptrs() needs to be calling bch2_trans_begin()
- improve error message in bch2_mark_stripe()
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/ec.c')
-rw-r--r-- | fs/bcachefs/ec.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/fs/bcachefs/ec.c b/fs/bcachefs/ec.c index 7dfa052e9765d..ed4a73345e3ad 100644 --- a/fs/bcachefs/ec.c +++ b/fs/bcachefs/ec.c @@ -837,8 +837,9 @@ static int ec_stripe_update_ptrs(struct bch_fs *c, bch2_trans_iter_init(&trans, &iter, BTREE_ID_extents, bkey_start_pos(pos), BTREE_ITER_INTENT); - - while ((k = bch2_btree_iter_peek(&iter)).k && +retry: + while (bch2_trans_begin(&trans), + (k = bch2_btree_iter_peek(&iter)).k && !(ret = bkey_err(k)) && bkey_cmp(bkey_start_pos(k.k), pos->p) < 0) { struct bch_extent_ptr *ptr, *ec_ptr = NULL; @@ -874,11 +875,11 @@ static int ec_stripe_update_ptrs(struct bch_fs *c, BTREE_INSERT_NOFAIL); if (!ret) bch2_btree_iter_set_pos(&iter, next_pos); - if (ret == -EINTR) - ret = 0; if (ret) break; } + if (ret == -EINTR) + goto retry; bch2_trans_iter_exit(&trans, &iter); bch2_trans_exit(&trans); @@ -1069,16 +1070,14 @@ void *bch2_writepoint_ec_buf(struct bch_fs *c, struct write_point *wp) return ob->ec->new_stripe.data[ob->ec_idx] + (offset << 9); } -void bch2_ec_add_backpointer(struct bch_fs *c, struct write_point *wp, - struct bpos pos, unsigned sectors) +void bch2_ob_add_backpointer(struct bch_fs *c, struct open_bucket *ob, + struct bkey *k) { - struct open_bucket *ob = ec_open_bucket(c, &wp->ptrs); - struct ec_stripe_new *ec; + struct ec_stripe_new *ec = ob->ec; - if (!ob) + if (!ec) return; - ec = ob->ec; mutex_lock(&ec->lock); if (bch2_keylist_realloc(&ec->keys, ec->inline_keys, @@ -1088,8 +1087,8 @@ void bch2_ec_add_backpointer(struct bch_fs *c, struct write_point *wp, } bkey_init(&ec->keys.top->k); - ec->keys.top->k.p = pos; - bch2_key_resize(&ec->keys.top->k, sectors); + ec->keys.top->k.p = k->p; + ec->keys.top->k.size = k->size; bch2_keylist_push(&ec->keys); mutex_unlock(&ec->lock); |