Commit 550cdeb3 authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba
Browse files

btrfs: raid56: avoid double for loop inside raid56_rmw_stripe()



This function doesn't even utilize full stripe skip, just iterate all
the data sectors is definitely enough.

Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent aee35e4b
Loading
Loading
Loading
Loading
+28 −31
Original line number Diff line number Diff line
@@ -1547,9 +1547,9 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio)
{
	int bios_to_read = 0;
	struct bio_list bio_list;
	const int nr_data_sectors = rbio->stripe_nsectors * rbio->nr_data;
	int ret;
	int sectornr;
	int stripe;
	int total_sector_nr;
	struct bio *bio;

	bio_list_init(&bio_list);
@@ -1561,19 +1561,17 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio)
	index_rbio_pages(rbio);

	atomic_set(&rbio->error, 0);
	/*
	 * build a list of bios to read all the missing parts of this
	 * stripe
	 */
	for (stripe = 0; stripe < rbio->nr_data; stripe++) {
		for (sectornr = 0; sectornr < rbio->stripe_nsectors; sectornr++) {
	/* Build a list of bios to read all the missing data sectors. */
	for (total_sector_nr = 0; total_sector_nr < nr_data_sectors;
	     total_sector_nr++) {
		struct sector_ptr *sector;
		int stripe = total_sector_nr / rbio->stripe_nsectors;
		int sectornr = total_sector_nr % rbio->stripe_nsectors;

		/*
			 * We want to find all the sectors missing from the
			 * rbio and read them from the disk.  If * sector_in_rbio()
			 * finds a page in the bio list we don't need to read
			 * it off the stripe.
		 * We want to find all the sectors missing from the rbio and
		 * read them from the disk.  If sector_in_rbio() finds a page
		 * in the bio list we don't need to read it off the stripe.
		 */
		sector = sector_in_rbio(rbio, stripe, sectornr, 1);
		if (sector)
@@ -1581,8 +1579,8 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio)

		sector = rbio_stripe_sector(rbio, stripe, sectornr);
		/*
			 * The bio cache may have handed us an uptodate page.
			 * If so, be happy and use it.
		 * The bio cache may have handed us an uptodate page.  If so,
		 * use it.
		 */
		if (sector->uptodate)
			continue;
@@ -1593,7 +1591,6 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio)
		if (ret)
			goto cleanup;
	}
	}

	bios_to_read = bio_list_size(&bio_list);
	if (!bios_to_read) {