Patch "md/raid1/10: reset bio allocated from mempool" has been added to the 4.12-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
md/raid1/10: reset bio allocated from mempool
to the 4.12-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
md-raid1-10-reset-bio-allocated-from-mempool.patch
and it can be found in the queue-4.12 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
208410b546207cfc4c832635fa46419cfa86b4cdMon Sep 17 00:00:00 2001
From: Shaohua Li <[email protected]>
Date: Thu, 24 Aug 2017 17:50:40 -0700
Subject: md/raid1/10: reset bio allocated from mempool
From: Shaohua Li <[email protected]>
commit 208410b546207cfc4c832635fa46419cfa86b4cd upstream.
Data allocated from mempool doesn't always get initialized, this happens when the data is reused instead of fresh allocation. In the raid1/10 case, we must reinitialize the bios.
--- drivers/md/raid1.c | 19 ++++++++++++++++++- drivers/md/raid10.c | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 50 insertions(+), 4 deletions(-)
drivers/md/raid1.c +18 -1
@@ -2586,6 +2586,23 @@ static int init_resync(struct r1conf *coreturn 0 ; } +static struct r1bio *raid1_alloc_init_r1buf (struct r1conf *conf) +{ +struct r1bio *r1bio =mempool_alloc (conf->r1buf_pool,GFP_NOIO ); +struct resync_pages *rps; +struct bio *bio; +int i; + +for (i = conf->poolinfo->raid_disks; i--; ) { + bio = r1bio->bios[i]; + rps = bio->bi_private; +bio_reset (bio); + bio->bi_private = rps; + } + r1bio->master_bio =NULL ; +return r1bio; +} +/* * perform a "sync" on one "block" *
@@ -2671,7 +2688,7 @@ static sector_t raid1_sync_request(strucbitmap_cond_end_sync (mddev->bitmap, sector_nr,mddev_is_clustered (mddev) && (sector_nr +2 *RESYNC_SECTORS > conf->cluster_sync_high)); - r1_bio =mempool_alloc (conf->r1buf_pool,GFP_NOIO ); + r1_bio =raid1_alloc_init_r1buf (conf);raise_barrier (conf, sector_nr);
drivers/md/raid10.c +32 -3
@@ -2807,6 +2807,35 @@ static int init_resync(struct r10conf *creturn 0 ; } +static struct r10bio *raid10_alloc_init_r10buf (struct r10conf *conf) +{ +struct r10bio *r10bio =mempool_alloc (conf->r10buf_pool,GFP_NOIO ); +struct rsync_pages *rp; +struct bio *bio; +int nalloc; +int i; + +if (test_bit (MD_RECOVERY_SYNC , &conf->mddev->recovery) || +test_bit (MD_RECOVERY_RESHAPE , &conf->mddev->recovery)) + nalloc = conf->copies;/* resync */ +else + nalloc =2 ;/* recovery */ + +for (i =0 ; i < nalloc; i++) { + bio = r10bio->devs[i].bio; + rp = bio->bi_private; +bio_reset (bio); + bio->bi_private = rp; + bio = r10bio->devs[i].repl_bio; +if (bio) { + rp = bio->bi_private; +bio_reset (bio); + bio->bi_private = rp; + } + } +return r10bio; +} +/* * perform a "sync" on one "block" *
@@ -3036,7 +3065,7 @@ static sector_t raid10_sync_request(struatomic_inc (&mreplace->nr_pending);rcu_read_unlock (); - r10_bio =mempool_alloc (conf->r10buf_pool,GFP_NOIO ); + r10_bio =raid10_alloc_init_r10buf (conf); r10_bio->state =0 ;raise_barrier (conf, rb2 !=NULL );atomic_set (&r10_bio->remaining,0 );
@@ -3245,7 +3274,7 @@ static sector_t raid10_sync_request(stru }if (sync_blocks < max_sync) max_sync = sync_blocks; - r10_bio =mempool_alloc (conf->r10buf_pool,GFP_NOIO ); + r10_bio =raid10_alloc_init_r10buf (conf); r10_bio->state =0 ; r10_bio->mddev = mddev;
@@ -4369,7 +4398,7 @@ static sector_t reshape_request(struct m read_more:/* Now schedule reads for blocks from sector_nr to last */ - r10_bio =mempool_alloc (conf->r10buf_pool,GFP_NOIO ); + r10_bio =raid10_alloc_init_r10buf (conf); r10_bio->state =0 ;raise_barrier (conf, sectors_done !=0 );atomic_set (&r10_bio->remaining,0 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.12/md-raid5-release-flush-io-in-raid5_do_work.patch queue-4.12/md-raid1-10-reset-bio-allocated-from-mempool.patch