diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c index c22ce1eb6b8b..f137a8e90f07 100644 --- a/fs/bcachefs/io.c +++ b/fs/bcachefs/io.c @@ -1227,12 +1227,6 @@ again: BKEY_EXTENT_U64s_MAX)) break; - if ((op->flags & BCH_WRITE_FROM_INTERNAL) && - percpu_ref_is_dying(&c->writes)) { - ret = -EROFS; - goto err; - } - /* * The copygc thread is now global, which means it's no longer * freeing up space on specific disks, which means that diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index a19c3117f9fe..eae93c65e1c7 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -52,9 +52,11 @@ struct moving_io { static void move_free(struct moving_io *io) { struct moving_context *ctxt = io->write.ctxt; + struct bch_fs *c = ctxt->c; bch2_data_update_exit(&io->write); wake_up(&ctxt->wait); + percpu_ref_put(&c->writes); kfree(io); } @@ -192,6 +194,9 @@ static int bch2_move_extent(struct btree_trans *trans, unsigned sectors = k.k->size, pages; int ret = -ENOMEM; + if (!percpu_ref_tryget_live(&c->writes)) + return -EROFS; + /* write path might have to decompress data: */ bkey_for_each_ptr_decode(k.k, ptrs, p, entry) sectors = max_t(unsigned, sectors, p.crc.uncompressed_size); @@ -258,6 +263,7 @@ err_free_pages: err_free: kfree(io); err: + percpu_ref_put(&c->writes); trace_move_alloc_mem_fail(k.k); return ret; }