diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-01-09 20:52:10 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:22 -0400 |
commit | 8ede99101ec354053ac755419df9da5434a13733 (patch) | |
tree | 273dde110cbd6e3ec933e7b4ce2bb5f654905f06 /fs/bcachefs/move.c | |
parent | d5030164ec53ab212f6acaff8938b352c654b67e (diff) | |
download | lwn-8ede99101ec354053ac755419df9da5434a13733.tar.gz lwn-8ede99101ec354053ac755419df9da5434a13733.zip |
bcachefs: Handle transaction restarts in __bch2_move_data()
We weren't checking for -EINTR in the main loop in __bch2_move_data -
this code predates modern transaction restarts.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/move.c')
-rw-r--r-- | fs/bcachefs/move.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index 8756df0414a8..f428e2ff99f6 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -701,17 +701,20 @@ static int __bch2_move_data(struct bch_fs *c, bch2_trans_begin(&trans); k = bch2_btree_iter_peek(&iter); - - stats->pos = iter.pos; - if (!k.k) break; + ret = bkey_err(k); + if (ret == -EINTR) + continue; if (ret) break; + if (bkey_cmp(bkey_start_pos(k.k), end) >= 0) break; + stats->pos = iter.pos; + if (!bkey_extent_is_direct_data(k.k)) goto next_nondata; @@ -754,10 +757,8 @@ static int __bch2_move_data(struct bch_fs *c, ret2 = bch2_move_extent(&trans, ctxt, wp, io_opts, btree_id, k, data_cmd, data_opts); if (ret2) { - if (ret2 == -EINTR) { - bch2_trans_begin(&trans); + if (ret2 == -EINTR) continue; - } if (ret2 == -ENOMEM) { /* memory allocation failure, wait for some IO to finish */ |