Commit 1c10702e authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

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

Originally it's iterating all the sectors which has dbitmap sector for
the vertical stripe.

It can be easily converted to sector bytenr iteration with an test_bit()
call.
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 550cdeb3
...@@ -2661,8 +2661,7 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) ...@@ -2661,8 +2661,7 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio)
int bios_to_read = 0; int bios_to_read = 0;
struct bio_list bio_list; struct bio_list bio_list;
int ret; int ret;
int sectornr; int total_sector_nr;
int stripe;
struct bio *bio; struct bio *bio;
bio_list_init(&bio_list); bio_list_init(&bio_list);
...@@ -2672,37 +2671,38 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio) ...@@ -2672,37 +2671,38 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio)
goto cleanup; goto cleanup;
atomic_set(&rbio->error, 0); atomic_set(&rbio->error, 0);
/* /* Build a list of bios to read all the missing parts. */
* build a list of bios to read all the missing parts of this for (total_sector_nr = 0; total_sector_nr < rbio->nr_sectors;
* stripe total_sector_nr++) {
*/ int sectornr = total_sector_nr % rbio->stripe_nsectors;
for (stripe = 0; stripe < rbio->real_stripes; stripe++) { int stripe = total_sector_nr / rbio->stripe_nsectors;
for_each_set_bit(sectornr, &rbio->dbitmap, rbio->stripe_nsectors) { struct sector_ptr *sector;
struct sector_ptr *sector;
/*
* We want to find all the sectors missing from the
* rbio and read them from the disk. If * sector_in_rbio()
* finds a sector in the bio list we don't need to read
* it off the stripe.
*/
sector = sector_in_rbio(rbio, stripe, sectornr, 1);
if (sector)
continue;
sector = rbio_stripe_sector(rbio, stripe, sectornr); /* No data in the vertical stripe, no need to read. */
/* if (!test_bit(sectornr, &rbio->dbitmap))
* The bio cache may have handed us an uptodate sector. continue;
* If so, be happy and use it.
*/
if (sector->uptodate)
continue;
ret = rbio_add_io_sector(rbio, &bio_list, sector, /*
stripe, sectornr, rbio->stripe_len, * We want to find all the sectors missing from the rbio and
REQ_OP_READ); * read them from the disk. If sector_in_rbio() finds a sector
if (ret) * in the bio list we don't need to read it off the stripe.
goto cleanup; */
} sector = sector_in_rbio(rbio, stripe, sectornr, 1);
if (sector)
continue;
sector = rbio_stripe_sector(rbio, stripe, sectornr);
/*
* The bio cache may have handed us an uptodate sector. If so,
* use it.
*/
if (sector->uptodate)
continue;
ret = rbio_add_io_sector(rbio, &bio_list, sector, stripe,
sectornr, rbio->stripe_len, REQ_OP_READ);
if (ret)
goto cleanup;
} }
bios_to_read = bio_list_size(&bio_list); bios_to_read = bio_list_size(&bio_list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment