Commit 57906d58 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David Sterba
Browse files

btrfs: factor check and flush helpers from __btrfsic_submit_bio



Split out two helpers to make __btrfsic_submit_bio more readable.

Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 3687fcb0
Loading
Loading
Loading
Loading
+77 −72
Original line number Diff line number Diff line
@@ -2633,41 +2633,26 @@ static struct btrfsic_dev_state *btrfsic_dev_state_lookup(dev_t dev)
						  &btrfsic_dev_state_hashtable);
}

static void __btrfsic_submit_bio(struct bio *bio)
static void btrfsic_check_write_bio(struct bio *bio, struct btrfsic_dev_state *dev_state)
{
	struct btrfsic_dev_state *dev_state;

	if (!btrfsic_is_initialized)
		return;

	mutex_lock(&btrfsic_mutex);
	/* since btrfsic_submit_bio() is also called before
	 * btrfsic_mount(), this might return NULL */
	dev_state = btrfsic_dev_state_lookup(bio->bi_bdev->bd_dev);
	if (NULL != dev_state &&
	    (bio_op(bio) == REQ_OP_WRITE) && bio_has_data(bio)) {
		int i = 0;
		u64 dev_bytenr;
		u64 cur_bytenr;
		struct bio_vec bvec;
	unsigned int segs = bio_segments(bio);
	u64 dev_bytenr = 512 * bio->bi_iter.bi_sector;
	u64 cur_bytenr = dev_bytenr;
	struct bvec_iter iter;
		int bio_is_patched;
	struct bio_vec bvec;
	char **mapped_datav;
		unsigned int segs = bio_segments(bio);
	int bio_is_patched = 0;
	int i = 0;

		dev_bytenr = 512 * bio->bi_iter.bi_sector;
		bio_is_patched = 0;
		if (dev_state->state->print_mask &
		    BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH)
			pr_info("submit_bio(rw=%d,0x%x, bi_vcnt=%u, bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n",
	if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH)
		pr_info(
"submit_bio(rw=%d,0x%x, bi_vcnt=%u, bi_sector=%llu (bytenr %llu), bi_bdev=%p)\n",
		       bio_op(bio), bio->bi_opf, segs,
		       bio->bi_iter.bi_sector, dev_bytenr, bio->bi_bdev);

		mapped_datav = kmalloc_array(segs,
					     sizeof(*mapped_datav), GFP_NOFS);
	mapped_datav = kmalloc_array(segs, sizeof(*mapped_datav), GFP_NOFS);
	if (!mapped_datav)
			goto leave;
		cur_bytenr = dev_bytenr;
		return;

	bio_for_each_segment(bvec, bio, iter) {
		BUG_ON(bvec.bv_len != PAGE_SIZE);
@@ -2680,24 +2665,19 @@ static void __btrfsic_submit_bio(struct bio *bio)
			       i, cur_bytenr, bvec.bv_len, bvec.bv_offset);
		cur_bytenr += bvec.bv_len;
	}
		btrfsic_process_written_block(dev_state, dev_bytenr,
					      mapped_datav, segs,
					      bio, &bio_is_patched,
					      bio->bi_opf);

	btrfsic_process_written_block(dev_state, dev_bytenr, mapped_datav, segs,
				      bio, &bio_is_patched, bio->bi_opf);
	kfree(mapped_datav);
	} else if (NULL != dev_state && (bio->bi_opf & REQ_PREFLUSH)) {
		if (dev_state->state->print_mask &
		    BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH)
}

static void btrfsic_check_flush_bio(struct bio *bio, struct btrfsic_dev_state *dev_state)
{
	if (dev_state->state->print_mask & BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH)
		pr_info("submit_bio(rw=%d,0x%x FLUSH, bdev=%p)\n",
		       bio_op(bio), bio->bi_opf, bio->bi_bdev);
		if (!dev_state->dummy_block_for_bio_bh_flush.is_iodone) {
			if ((dev_state->state->print_mask &
			     (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH |
			      BTRFSIC_PRINT_MASK_VERBOSE)))
				pr_info(
"btrfsic_submit_bio(%pg) with FLUSH but dummy block already in use (ignored)!\n",
				       dev_state->bdev);
		} else {

	if (dev_state->dummy_block_for_bio_bh_flush.is_iodone) {
		struct btrfsic_block *const block =
			&dev_state->dummy_block_for_bio_bh_flush;

@@ -2711,9 +2691,34 @@ static void __btrfsic_submit_bio(struct bio *bio)
		block->next_in_same_bio = NULL;
		bio->bi_private = block;
		bio->bi_end_io = btrfsic_bio_end_io;
	} else if ((dev_state->state->print_mask &
		   (BTRFSIC_PRINT_MASK_SUBMIT_BIO_BH |
		    BTRFSIC_PRINT_MASK_VERBOSE))) {
		pr_info(
"btrfsic_submit_bio(%pg) with FLUSH but dummy block already in use (ignored)!\n",
		       dev_state->bdev);
	}
}

static void __btrfsic_submit_bio(struct bio *bio)
{
	struct btrfsic_dev_state *dev_state;

	if (!btrfsic_is_initialized)
		return;

	/*
	 * We can be called before btrfsic_mount, so there might not be a
	 * dev_state.
	 */
	dev_state = btrfsic_dev_state_lookup(bio->bi_bdev->bd_dev);
	mutex_lock(&btrfsic_mutex);
	if (dev_state) {
		if (bio_op(bio) == REQ_OP_WRITE && bio_has_data(bio))
			btrfsic_check_write_bio(bio, dev_state);
		else if (bio->bi_opf & REQ_PREFLUSH)
			btrfsic_check_flush_bio(bio, dev_state);
	}
leave:
	mutex_unlock(&btrfsic_mutex);
}