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

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



The double loop is just checking if the page for the vertical stripe
is allocated.

We can easily convert it to single loop and get rid of @stripe variable.

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 ef340fcc
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -2380,24 +2380,23 @@ void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page,
static int alloc_rbio_essential_pages(struct btrfs_raid_bio *rbio)
{
	const u32 sectorsize = rbio->bioc->fs_info->sectorsize;
	int stripe;
	int sectornr;
	int total_sector_nr;

	for_each_set_bit(sectornr, &rbio->dbitmap, rbio->stripe_nsectors) {
		for (stripe = 0; stripe < rbio->real_stripes; stripe++) {
	for (total_sector_nr = 0; total_sector_nr < rbio->nr_sectors;
	     total_sector_nr++) {
		struct page *page;
			int index = (stripe * rbio->stripe_nsectors + sectornr) *
				    sectorsize >> PAGE_SHIFT;
		int sectornr = total_sector_nr % rbio->stripe_nsectors;
		int index = (total_sector_nr * sectorsize) >> PAGE_SHIFT;

		if (!test_bit(sectornr, &rbio->dbitmap))
			continue;
		if (rbio->stripe_pages[index])
			continue;

		page = alloc_page(GFP_NOFS);
		if (!page)
			return -ENOMEM;
		rbio->stripe_pages[index] = page;
	}
	}
	index_stripe_sectors(rbio);
	return 0;
}