btrfs: scrub: embed scrub_wr_ctx into scrub context

The structure scrub_wr_ctx is not used anywhere just the scrub context,
we can move the members there. The tgtdev is renamed so it's more clear
that it belongs to the "wr" part.

Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2017-05-16 19:10:32 +02:00
parent 25cc1226c1
commit 3fb99303c6
1 changed files with 49 additions and 54 deletions

View File

@ -161,14 +161,6 @@ struct scrub_parity {
unsigned long bitmap[0]; unsigned long bitmap[0];
}; };
struct scrub_wr_ctx {
struct scrub_bio *wr_curr_bio;
struct btrfs_device *tgtdev;
int pages_per_wr_bio; /* <= SCRUB_PAGES_PER_WR_BIO */
atomic_t flush_all_writes;
struct mutex wr_lock;
};
struct scrub_ctx { struct scrub_ctx {
struct scrub_bio *bios[SCRUB_BIOS_PER_SCTX]; struct scrub_bio *bios[SCRUB_BIOS_PER_SCTX];
struct btrfs_fs_info *fs_info; struct btrfs_fs_info *fs_info;
@ -185,7 +177,12 @@ struct scrub_ctx {
int pages_per_rd_bio; int pages_per_rd_bio;
int is_dev_replace; int is_dev_replace;
struct scrub_wr_ctx wr_ctx;
struct scrub_bio *wr_curr_bio;
struct mutex wr_lock;
int pages_per_wr_bio; /* <= SCRUB_PAGES_PER_WR_BIO */
atomic_t flush_all_writes;
struct btrfs_device *wr_tgtdev;
/* /*
* statistics * statistics
@ -656,7 +653,7 @@ static noinline_for_stack void scrub_free_ctx(struct scrub_ctx *sctx)
kfree(sbio); kfree(sbio);
} }
kfree(sctx->wr_ctx.wr_curr_bio); kfree(sctx->wr_curr_bio);
scrub_free_csums(sctx); scrub_free_csums(sctx);
kfree(sctx); kfree(sctx);
} }
@ -712,14 +709,14 @@ struct scrub_ctx *scrub_setup_ctx(struct btrfs_device *dev, int is_dev_replace)
spin_lock_init(&sctx->stat_lock); spin_lock_init(&sctx->stat_lock);
init_waitqueue_head(&sctx->list_wait); init_waitqueue_head(&sctx->list_wait);
WARN_ON(sctx->wr_ctx.wr_curr_bio != NULL); WARN_ON(sctx->wr_curr_bio != NULL);
mutex_init(&sctx->wr_ctx.wr_lock); mutex_init(&sctx->wr_lock);
sctx->wr_ctx.wr_curr_bio = NULL; sctx->wr_curr_bio = NULL;
if (is_dev_replace) { if (is_dev_replace) {
WARN_ON(!dev->bdev); WARN_ON(!dev->bdev);
sctx->wr_ctx.pages_per_wr_bio = SCRUB_PAGES_PER_WR_BIO; sctx->pages_per_wr_bio = SCRUB_PAGES_PER_WR_BIO;
sctx->wr_ctx.tgtdev = dev; sctx->wr_tgtdev = dev;
atomic_set(&sctx->wr_ctx.flush_all_writes, 0); atomic_set(&sctx->flush_all_writes, 0);
} }
return sctx; return sctx;
@ -1892,35 +1889,34 @@ static int scrub_write_page_to_dev_replace(struct scrub_block *sblock,
static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx, static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx,
struct scrub_page *spage) struct scrub_page *spage)
{ {
struct scrub_wr_ctx *wr_ctx = &sctx->wr_ctx;
struct scrub_bio *sbio; struct scrub_bio *sbio;
int ret; int ret;
mutex_lock(&wr_ctx->wr_lock); mutex_lock(&sctx->wr_lock);
again: again:
if (!wr_ctx->wr_curr_bio) { if (!sctx->wr_curr_bio) {
wr_ctx->wr_curr_bio = kzalloc(sizeof(*wr_ctx->wr_curr_bio), sctx->wr_curr_bio = kzalloc(sizeof(*sctx->wr_curr_bio),
GFP_KERNEL); GFP_KERNEL);
if (!wr_ctx->wr_curr_bio) { if (!sctx->wr_curr_bio) {
mutex_unlock(&wr_ctx->wr_lock); mutex_unlock(&sctx->wr_lock);
return -ENOMEM; return -ENOMEM;
} }
wr_ctx->wr_curr_bio->sctx = sctx; sctx->wr_curr_bio->sctx = sctx;
wr_ctx->wr_curr_bio->page_count = 0; sctx->wr_curr_bio->page_count = 0;
} }
sbio = wr_ctx->wr_curr_bio; sbio = sctx->wr_curr_bio;
if (sbio->page_count == 0) { if (sbio->page_count == 0) {
struct bio *bio; struct bio *bio;
sbio->physical = spage->physical_for_dev_replace; sbio->physical = spage->physical_for_dev_replace;
sbio->logical = spage->logical; sbio->logical = spage->logical;
sbio->dev = wr_ctx->tgtdev; sbio->dev = sctx->wr_tgtdev;
bio = sbio->bio; bio = sbio->bio;
if (!bio) { if (!bio) {
bio = btrfs_io_bio_alloc(GFP_KERNEL, bio = btrfs_io_bio_alloc(GFP_KERNEL,
wr_ctx->pages_per_wr_bio); sctx->pages_per_wr_bio);
if (!bio) { if (!bio) {
mutex_unlock(&wr_ctx->wr_lock); mutex_unlock(&sctx->wr_lock);
return -ENOMEM; return -ENOMEM;
} }
sbio->bio = bio; sbio->bio = bio;
@ -1945,7 +1941,7 @@ static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx,
if (sbio->page_count < 1) { if (sbio->page_count < 1) {
bio_put(sbio->bio); bio_put(sbio->bio);
sbio->bio = NULL; sbio->bio = NULL;
mutex_unlock(&wr_ctx->wr_lock); mutex_unlock(&sctx->wr_lock);
return -EIO; return -EIO;
} }
scrub_wr_submit(sctx); scrub_wr_submit(sctx);
@ -1955,23 +1951,22 @@ static int scrub_add_page_to_wr_bio(struct scrub_ctx *sctx,
sbio->pagev[sbio->page_count] = spage; sbio->pagev[sbio->page_count] = spage;
scrub_page_get(spage); scrub_page_get(spage);
sbio->page_count++; sbio->page_count++;
if (sbio->page_count == wr_ctx->pages_per_wr_bio) if (sbio->page_count == sctx->pages_per_wr_bio)
scrub_wr_submit(sctx); scrub_wr_submit(sctx);
mutex_unlock(&wr_ctx->wr_lock); mutex_unlock(&sctx->wr_lock);
return 0; return 0;
} }
static void scrub_wr_submit(struct scrub_ctx *sctx) static void scrub_wr_submit(struct scrub_ctx *sctx)
{ {
struct scrub_wr_ctx *wr_ctx = &sctx->wr_ctx;
struct scrub_bio *sbio; struct scrub_bio *sbio;
if (!wr_ctx->wr_curr_bio) if (!sctx->wr_curr_bio)
return; return;
sbio = wr_ctx->wr_curr_bio; sbio = sctx->wr_curr_bio;
wr_ctx->wr_curr_bio = NULL; sctx->wr_curr_bio = NULL;
WARN_ON(!sbio->bio->bi_bdev); WARN_ON(!sbio->bio->bi_bdev);
scrub_pending_bio_inc(sctx); scrub_pending_bio_inc(sctx);
/* process all writes in a single worker thread. Then the block layer /* process all writes in a single worker thread. Then the block layer
@ -2414,10 +2409,10 @@ static void scrub_missing_raid56_worker(struct btrfs_work *work)
scrub_block_put(sblock); scrub_block_put(sblock);
if (sctx->is_dev_replace && if (sctx->is_dev_replace &&
atomic_read(&sctx->wr_ctx.flush_all_writes)) { atomic_read(&sctx->flush_all_writes)) {
mutex_lock(&sctx->wr_ctx.wr_lock); mutex_lock(&sctx->wr_lock);
scrub_wr_submit(sctx); scrub_wr_submit(sctx);
mutex_unlock(&sctx->wr_ctx.wr_lock); mutex_unlock(&sctx->wr_lock);
} }
scrub_pending_bio_dec(sctx); scrub_pending_bio_dec(sctx);
@ -2622,10 +2617,10 @@ static void scrub_bio_end_io_worker(struct btrfs_work *work)
spin_unlock(&sctx->list_lock); spin_unlock(&sctx->list_lock);
if (sctx->is_dev_replace && if (sctx->is_dev_replace &&
atomic_read(&sctx->wr_ctx.flush_all_writes)) { atomic_read(&sctx->flush_all_writes)) {
mutex_lock(&sctx->wr_ctx.wr_lock); mutex_lock(&sctx->wr_lock);
scrub_wr_submit(sctx); scrub_wr_submit(sctx);
mutex_unlock(&sctx->wr_ctx.wr_lock); mutex_unlock(&sctx->wr_lock);
} }
scrub_pending_bio_dec(sctx); scrub_pending_bio_dec(sctx);
@ -3299,9 +3294,9 @@ static noinline_for_stack int scrub_raid56_parity(struct scrub_ctx *sctx,
logic_end - logic_start); logic_end - logic_start);
scrub_parity_put(sparity); scrub_parity_put(sparity);
scrub_submit(sctx); scrub_submit(sctx);
mutex_lock(&sctx->wr_ctx.wr_lock); mutex_lock(&sctx->wr_lock);
scrub_wr_submit(sctx); scrub_wr_submit(sctx);
mutex_unlock(&sctx->wr_ctx.wr_lock); mutex_unlock(&sctx->wr_lock);
btrfs_release_path(path); btrfs_release_path(path);
return ret < 0 ? ret : 0; return ret < 0 ? ret : 0;
@ -3457,14 +3452,14 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx,
*/ */
if (atomic_read(&fs_info->scrub_pause_req)) { if (atomic_read(&fs_info->scrub_pause_req)) {
/* push queued extents */ /* push queued extents */
atomic_set(&sctx->wr_ctx.flush_all_writes, 1); atomic_set(&sctx->flush_all_writes, 1);
scrub_submit(sctx); scrub_submit(sctx);
mutex_lock(&sctx->wr_ctx.wr_lock); mutex_lock(&sctx->wr_lock);
scrub_wr_submit(sctx); scrub_wr_submit(sctx);
mutex_unlock(&sctx->wr_ctx.wr_lock); mutex_unlock(&sctx->wr_lock);
wait_event(sctx->list_wait, wait_event(sctx->list_wait,
atomic_read(&sctx->bios_in_flight) == 0); atomic_read(&sctx->bios_in_flight) == 0);
atomic_set(&sctx->wr_ctx.flush_all_writes, 0); atomic_set(&sctx->flush_all_writes, 0);
scrub_blocked_if_needed(fs_info); scrub_blocked_if_needed(fs_info);
} }
@ -3671,9 +3666,9 @@ static noinline_for_stack int scrub_stripe(struct scrub_ctx *sctx,
out: out:
/* push queued extents */ /* push queued extents */
scrub_submit(sctx); scrub_submit(sctx);
mutex_lock(&sctx->wr_ctx.wr_lock); mutex_lock(&sctx->wr_lock);
scrub_wr_submit(sctx); scrub_wr_submit(sctx);
mutex_unlock(&sctx->wr_ctx.wr_lock); mutex_unlock(&sctx->wr_lock);
blk_finish_plug(&plug); blk_finish_plug(&plug);
btrfs_free_path(path); btrfs_free_path(path);
@ -3910,11 +3905,11 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,
* write requests are really completed when bios_in_flight * write requests are really completed when bios_in_flight
* changes to 0. * changes to 0.
*/ */
atomic_set(&sctx->wr_ctx.flush_all_writes, 1); atomic_set(&sctx->flush_all_writes, 1);
scrub_submit(sctx); scrub_submit(sctx);
mutex_lock(&sctx->wr_ctx.wr_lock); mutex_lock(&sctx->wr_lock);
scrub_wr_submit(sctx); scrub_wr_submit(sctx);
mutex_unlock(&sctx->wr_ctx.wr_lock); mutex_unlock(&sctx->wr_lock);
wait_event(sctx->list_wait, wait_event(sctx->list_wait,
atomic_read(&sctx->bios_in_flight) == 0); atomic_read(&sctx->bios_in_flight) == 0);
@ -3928,7 +3923,7 @@ int scrub_enumerate_chunks(struct scrub_ctx *sctx,
*/ */
wait_event(sctx->list_wait, wait_event(sctx->list_wait,
atomic_read(&sctx->workers_pending) == 0); atomic_read(&sctx->workers_pending) == 0);
atomic_set(&sctx->wr_ctx.flush_all_writes, 0); atomic_set(&sctx->flush_all_writes, 0);
scrub_pause_off(fs_info); scrub_pause_off(fs_info);
@ -4633,7 +4628,7 @@ static int write_page_nocow(struct scrub_ctx *sctx,
struct btrfs_device *dev; struct btrfs_device *dev;
int ret; int ret;
dev = sctx->wr_ctx.tgtdev; dev = sctx->wr_tgtdev;
if (!dev) if (!dev)
return -EIO; return -EIO;
if (!dev->bdev) { if (!dev->bdev) {