Commit 6346f6bf authored by Qu Wenruo's avatar Qu Wenruo Committed by David Sterba

btrfs: raid56: make raid56_add_scrub_pages() subpage compatible

This requires one extra parameter @pgoff for the function.

In the current code base, scrub is still one page per sector, thus the
new parameter will always be 0.

It needs the extra subpage scrub optimization code to fully take
advantage.
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 f77183dc
...@@ -2381,17 +2381,19 @@ struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio, ...@@ -2381,17 +2381,19 @@ struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio,
/* Used for both parity scrub and missing. */ /* Used for both parity scrub and missing. */
void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page, void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page,
u64 logical) unsigned int pgoff, u64 logical)
{ {
const u32 sectorsize = rbio->bioc->fs_info->sectorsize;
int stripe_offset; int stripe_offset;
int index; int index;
ASSERT(logical >= rbio->bioc->raid_map[0]); ASSERT(logical >= rbio->bioc->raid_map[0]);
ASSERT(logical + PAGE_SIZE <= rbio->bioc->raid_map[0] + ASSERT(logical + sectorsize <= rbio->bioc->raid_map[0] +
rbio->stripe_len * rbio->nr_data); rbio->stripe_len * rbio->nr_data);
stripe_offset = (int)(logical - rbio->bioc->raid_map[0]); stripe_offset = (int)(logical - rbio->bioc->raid_map[0]);
index = stripe_offset >> PAGE_SHIFT; index = stripe_offset / sectorsize;
rbio->bio_pages[index] = page; rbio->bio_sectors[index].page = page;
rbio->bio_sectors[index].pgoff = pgoff;
} }
/* /*
......
...@@ -35,7 +35,7 @@ int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc, ...@@ -35,7 +35,7 @@ int raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,
int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc, u32 stripe_len); int raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc, u32 stripe_len);
void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page, void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page,
u64 logical); unsigned int pgoff, u64 logical);
struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio, struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio,
struct btrfs_io_context *bioc, u32 stripe_len, struct btrfs_io_context *bioc, u32 stripe_len,
......
...@@ -2205,7 +2205,11 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock) ...@@ -2205,7 +2205,11 @@ static void scrub_missing_raid56_pages(struct scrub_block *sblock)
for (i = 0; i < sblock->sector_count; i++) { for (i = 0; i < sblock->sector_count; i++) {
struct scrub_sector *sector = sblock->sectors[i]; struct scrub_sector *sector = sblock->sectors[i];
raid56_add_scrub_pages(rbio, sector->page, sector->logical); /*
* For now, our scrub is still one page per sector, so pgoff
* is always 0.
*/
raid56_add_scrub_pages(rbio, sector->page, 0, sector->logical);
} }
btrfs_init_work(&sblock->work, scrub_missing_raid56_worker, NULL, NULL); btrfs_init_work(&sblock->work, scrub_missing_raid56_worker, NULL, NULL);
......
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