Commit 2c91ab72 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: bch2_dev_get_ioref() checks for device not present

parent 465bf6f4
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1679,7 +1679,7 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,

	struct bch_dev *ca = s->ca && s->ca->dev_idx == pos.inode
		? s->ca
		: bch2_dev_get_ioref2(c, pos.inode, WRITE);
		: bch2_dev_get_ioref(c, pos.inode, WRITE);
	if (!ca) {
		bch2_btree_iter_set_pos(need_discard_iter, POS(pos.inode + 1, 0));
		return 0;
@@ -1860,7 +1860,7 @@ static void bch2_do_discards_fast_work(struct work_struct *work)
			if (i->snapshot)
				continue;

			ca = bch2_dev_get_ioref2(c, i->inode, WRITE);
			ca = bch2_dev_get_ioref(c, i->inode, WRITE);
			if (!ca) {
				darray_remove_item(&c->discard_buckets_in_flight, i);
				continue;
+1 −1
Original line number Diff line number Diff line
@@ -486,7 +486,7 @@ static int check_extent_checksum(struct btree_trans *trans,

	bytes = p.crc.compressed_size << 9;

	struct bch_dev *ca = bch2_dev_get_ioref2(c, dev, READ);
	struct bch_dev *ca = bch2_dev_get_ioref(c, dev, READ);
	if (!ca)
		return false;

+3 −3
Original line number Diff line number Diff line
@@ -1308,7 +1308,7 @@ static void btree_node_read_work(struct work_struct *work)
	while (1) {
		retry = true;
		bch_info(c, "retrying read");
		ca = bch2_dev_get_ioref2(c, rb->pick.ptr.dev, READ);
		ca = bch2_dev_get_ioref(c, rb->pick.ptr.dev, READ);
		rb->have_ioref		= ca != NULL;
		bio_reset(bio, NULL, REQ_OP_READ|REQ_SYNC|REQ_META);
		bio->bi_iter.bi_sector	= rb->pick.ptr.offset;
@@ -1618,7 +1618,7 @@ static int btree_node_read_all_replicas(struct bch_fs *c, struct btree *b, bool

	i = 0;
	bkey_for_each_ptr_decode(k.k, ptrs, pick, entry) {
		struct bch_dev *ca = bch2_dev_get_ioref2(c, pick.ptr.dev, READ);
		struct bch_dev *ca = bch2_dev_get_ioref(c, pick.ptr.dev, READ);
		struct btree_read_bio *rb =
			container_of(ra->bio[i], struct btree_read_bio, bio);
		rb->c			= c;
@@ -1695,7 +1695,7 @@ void bch2_btree_node_read(struct btree_trans *trans, struct btree *b,
		return;
	}

	ca = bch2_dev_get_ioref2(c, pick.ptr.dev, READ);
	ca = bch2_dev_get_ioref(c, pick.ptr.dev, READ);

	bio = bio_alloc_bioset(NULL,
			       buf_pages(b->data, btree_buf_bytes(b)),
+2 −2
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ static bool bch2_btree_verify_replica(struct bch_fs *c, struct btree *b,
	struct bio *bio;
	bool failed = false, saw_error = false;

	struct bch_dev *ca = bch2_dev_get_ioref2(c, pick.ptr.dev, READ);
	struct bch_dev *ca = bch2_dev_get_ioref(c, pick.ptr.dev, READ);
	if (!ca)
		return false;

@@ -194,7 +194,7 @@ void bch2_btree_node_ondisk_to_text(struct printbuf *out, struct bch_fs *c,
		return;
	}

	ca = bch2_dev_get_ioref2(c, pick.ptr.dev, READ);
	ca = bch2_dev_get_ioref(c, pick.ptr.dev, READ);
	if (!ca) {
		prt_printf(out, "error getting device to read from: not online\n");
		return;
+10 −11
Original line number Diff line number Diff line
@@ -732,12 +732,17 @@ static void ec_block_io(struct bch_fs *c, struct ec_stripe_buf *buf,
	struct bch_stripe *v = &bkey_i_to_stripe(&buf->key)->v;
	unsigned offset = 0, bytes = buf->size << 9;
	struct bch_extent_ptr *ptr = &v->ptrs[idx];
	struct bch_dev *ca = bch2_dev_bkey_exists(c, ptr->dev);
	enum bch_data_type data_type = idx < v->nr_blocks - v->nr_redundant
		? BCH_DATA_user
		: BCH_DATA_parity;
	int rw = op_is_write(opf);

	struct bch_dev *ca = bch2_dev_get_ioref(c, ptr->dev, rw);
	if (!ca) {
		clear_bit(idx, buf->valid);
		return;
	}

	if (dev_ptr_stale(ca, ptr)) {
		bch_err_ratelimited(c,
				    "error %s stripe: stale pointer",
@@ -746,10 +751,6 @@ static void ec_block_io(struct bch_fs *c, struct ec_stripe_buf *buf,
		return;
	}

	if (!bch2_dev_get_ioref(ca, rw)) {
		clear_bit(idx, buf->valid);
		return;
	}

	this_cpu_add(ca->io_done->sectors[rw][data_type], buf->size);

@@ -1354,20 +1355,18 @@ static void zero_out_rest_of_ec_bucket(struct bch_fs *c,
				       unsigned block,
				       struct open_bucket *ob)
{
	struct bch_dev *ca = bch2_dev_bkey_exists(c, ob->dev);
	unsigned offset = ca->mi.bucket_size - ob->sectors_free;
	int ret;

	if (!bch2_dev_get_ioref(ca, WRITE)) {
	struct bch_dev *ca = bch2_dev_get_ioref(c, ob->dev, WRITE);
	if (!ca) {
		s->err = -BCH_ERR_erofs_no_writes;
		return;
	}

	unsigned offset = ca->mi.bucket_size - ob->sectors_free;
	memset(s->new_stripe.data[block] + (offset << 9),
	       0,
	       ob->sectors_free << 9);

	ret = blkdev_issue_zeroout(ca->disk_sb.bdev,
	int ret = blkdev_issue_zeroout(ca->disk_sb.bdev,
			ob->bucket * ca->mi.bucket_size + offset,
			ob->sectors_free,
			GFP_KERNEL, 0);
Loading