Commit 31683f4a authored by Christoph Hellwig's avatar Christoph Hellwig Committed by David Sterba
Browse files

btrfs: do not return errors from raid56_parity_write



Always consume the bio and call the end_io handler on error instead of
returning an error and letting the caller handle it.  This matches what
the block layer submission does and avoids any confusion on who
needs to handle errors.

Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
Tested-by: default avatarNikolay Borisov <nborisov@suse.com>
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 1a722d8f
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -1803,18 +1803,19 @@ static void rbio_add_bio(struct btrfs_raid_bio *rbio, struct bio *orig_bio)
/*
 * our main entry point for writes from the rest of the FS.
 */
int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
{
	struct btrfs_fs_info *fs_info = bioc->fs_info;
	struct btrfs_raid_bio *rbio;
	struct btrfs_plug_cb *plug = NULL;
	struct blk_plug_cb *cb;
	int ret;
	int ret = 0;

	rbio = alloc_rbio(fs_info, bioc);
	if (IS_ERR(rbio)) {
		btrfs_put_bioc(bioc);
		return PTR_ERR(rbio);
		ret = PTR_ERR(rbio);
		goto out;
	}
	rbio->operation = BTRFS_RBIO_WRITE;
	rbio_add_bio(rbio, bio);
@@ -1829,8 +1830,8 @@ int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
	if (rbio_is_full(rbio)) {
		ret = full_stripe_write(rbio);
		if (ret)
			btrfs_bio_counter_dec(fs_info);
		return ret;
			goto out_dec_counter;
		return;
	}

	cb = blk_check_plugged(btrfs_raid_unplug, fs_info, sizeof(*plug));
@@ -1841,13 +1842,19 @@ int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc)
			INIT_LIST_HEAD(&plug->rbio_list);
		}
		list_add_tail(&rbio->plug_list, &plug->rbio_list);
		ret = 0;
	} else {
		ret = __raid56_parity_write(rbio);
		if (ret)
			btrfs_bio_counter_dec(fs_info);
			goto out_dec_counter;
	}
	return ret;

	return;

out_dec_counter:
	btrfs_bio_counter_dec(fs_info);
out:
	bio->bi_status = errno_to_blk_status(ret);
	bio_endio(bio);
}

/*
+1 −1
Original line number Diff line number Diff line
@@ -167,7 +167,7 @@ struct btrfs_device;

int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
			  int mirror_num, int generic_io);
int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc);
void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc);

void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page,
			    unsigned int pgoff, u64 logical);
+1 −1
Original line number Diff line number Diff line
@@ -6762,7 +6762,7 @@ void btrfs_submit_bio(struct btrfs_fs_info *fs_info, struct bio *bio, int mirror
	if ((bioc->map_type & BTRFS_BLOCK_GROUP_RAID56_MASK) &&
	    ((btrfs_op(bio) == BTRFS_MAP_WRITE) || (mirror_num > 1))) {
		if (btrfs_op(bio) == BTRFS_MAP_WRITE)
			ret = raid56_parity_write(bio, bioc);
			raid56_parity_write(bio, bioc);
		else
			ret = raid56_parity_recover(bio, bioc, mirror_num, 1);
		goto out_dec;