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: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
550cdeb3e0
commit
1c10702e7c
|
@ -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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue