Commit 4081ace3 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Get ref on c->writes in move.c

There's no point reading an extent in order to move it if the write is
going to fail because we're shutting down. This patch changes the move
path so that moving_io now owns a ref on c->writes - as a bonus,
rebalance and copygc will now notice that we're shutting down and exit
quicker.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
parent 0337cc7e
......@@ -1227,12 +1227,6 @@ static void __bch2_write(struct bch_write_op *op)
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
......
......@@ -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 @@ static int bch2_move_extent(struct btree_trans *trans,
err_free:
kfree(io);
err:
percpu_ref_put(&c->writes);
trace_move_alloc_mem_fail(k.k);
return ret;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment