bcachefs: Don't unlock trans before data_update_init()

data_update_init() does need to do btree operations, delay doing the
unlock-before-io.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2025-05-28 16:06:07 -04:00
parent 642c1aabb0
commit f02d153274
2 changed files with 9 additions and 7 deletions

View File

@ -980,6 +980,8 @@ int bch2_data_update_init(struct btree_trans *trans,
goto out_nocow_unlock;
}
bch2_trans_unlock(trans);
ret = __bch2_data_update_bios_init(m, c, io_opts, buf_bytes);
if (ret)
goto out_nocow_unlock;

View File

@ -359,16 +359,14 @@ int bch2_move_extent(struct moving_context *ctxt,
return 0;
}
/*
* Before memory allocations & taking nocow locks in
* bch2_data_update_init():
*/
bch2_trans_unlock(trans);
struct moving_io *io = kzalloc(sizeof(struct moving_io), GFP_KERNEL);
struct moving_io *io = allocate_dropping_locks(trans, ret,
kzalloc(sizeof(struct moving_io), _gfp));
if (!io)
goto err;
if (ret)
goto err_free;
INIT_LIST_HEAD(&io->io_list);
io->write.ctxt = ctxt;
io->read_sectors = k.k->size;
@ -388,6 +386,8 @@ int bch2_move_extent(struct moving_context *ctxt,
io->write.op.c = c;
io->write.data_opts = data_opts;
bch2_trans_unlock(trans);
ret = bch2_data_update_bios_init(&io->write, c, &io_opts);
if (ret)
goto err_free;