mirror of
https://github.com/torvalds/linux.git
synced 2024-10-23 21:50:43 +00:00
bcachefs: Fix bch2_inode_delete_keys()
bch2_inode_delete_keys() was using BTREE_ITER_NOT_EXTENTS, on the assumption that it would never need to split extents. But that caused a race with extents being split by other threads - specifically, the data move path. Extents iterators have the iterator position pointing to the start of the extent, which avoids the race. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
7dcf62c06d
commit
4220666398
|
@ -780,6 +780,7 @@ static int bch2_inode_delete_keys(struct btree_trans *trans,
|
|||
struct btree_iter iter;
|
||||
struct bkey_s_c k;
|
||||
struct bkey_i delete;
|
||||
struct bpos end = POS(inum.inum, U64_MAX);
|
||||
u32 snapshot;
|
||||
int ret = 0;
|
||||
|
||||
|
@ -788,7 +789,7 @@ static int bch2_inode_delete_keys(struct btree_trans *trans,
|
|||
* extent iterator:
|
||||
*/
|
||||
bch2_trans_iter_init(trans, &iter, id, POS(inum.inum, 0),
|
||||
BTREE_ITER_INTENT|BTREE_ITER_NOT_EXTENTS);
|
||||
BTREE_ITER_INTENT);
|
||||
|
||||
while (1) {
|
||||
bch2_trans_begin(trans);
|
||||
|
@ -799,7 +800,7 @@ static int bch2_inode_delete_keys(struct btree_trans *trans,
|
|||
|
||||
bch2_btree_iter_set_snapshot(&iter, snapshot);
|
||||
|
||||
k = bch2_btree_iter_peek_upto(&iter, POS(inum.inum, U64_MAX));
|
||||
k = bch2_btree_iter_peek_upto(&iter, end);
|
||||
ret = bkey_err(k);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
@ -810,6 +811,11 @@ static int bch2_inode_delete_keys(struct btree_trans *trans,
|
|||
bkey_init(&delete.k);
|
||||
delete.k.p = iter.pos;
|
||||
|
||||
if (iter.flags & BTREE_ITER_IS_EXTENTS)
|
||||
bch2_key_resize(&delete.k,
|
||||
bpos_min(end, k.k->p).offset -
|
||||
iter.pos.offset);
|
||||
|
||||
ret = bch2_trans_update(trans, &iter, &delete, 0) ?:
|
||||
bch2_trans_commit(trans, NULL, NULL,
|
||||
BTREE_INSERT_NOFAIL);
|
||||
|
|
Loading…
Reference in New Issue
Block a user