bcachefs: Don't unlock trans before data_update_init()
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 28 May 2025 20:06:07 +0000 (16:06 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 1 Jun 2025 02:03:17 +0000 (22:03 -0400)
data_update_init() does need to do btree operations, delay doing the
unlock-before-io.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/data_update.c
fs/bcachefs/move.c

index 1216729..63a10ea 100644 (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;
index 857519c..fc1a7a0 100644 (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;