Patch "md: remove 'idx' from 'struct resync_pages'" 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: remove 'idx' from 'struct resync_pages'
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-remove-idx-from-struct-resync_pages.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
022e510fcbda79183fd2cdc01abb01b4be80d03fMon Sep 17 00:00:00 2001
From: Ming Lei <[email protected]>
Date: Fri, 14 Jul 2017 16:14:42 +0800
Subject: md: remove 'idx' from 'struct resync_pages'
From: Ming Lei <[email protected]>
commit 022e510fcbda79183fd2cdc01abb01b4be80d03f upstream.
bio_add_page() won't fail for resync bio, and the page index for each bio is same, so remove it.
More importantly the 'idx' of 'struct resync_pages' is initialized in mempool allocator function, the current way is wrong since mempool is only responsible for allocation, we can't use that for initialization.
--- drivers/md/md.h | 1 - drivers/md/raid1.c | 6 +++--- drivers/md/raid10.c | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-)
drivers/md/md.h +0 -1
@@ -733,7 +733,6 @@ static inline void mddev_check_write_zer/* for managing resync I/O pages */ struct resync_pages { -unsigned idx;/* for get/put page from the pool */ void *raid_bio;struct page *pages[RESYNC_PAGES ]; };
drivers/md/raid1.c +3 -3
@@ -170,7 +170,6 @@ static void * r1buf_pool_alloc(gfp_t gfpresync_get_all_pages (rp); } - rp->idx =0 ; rp->raid_bio = r1_bio; bio->bi_private = rp; }
@@ -2621,6 +2620,7 @@ static sector_t raid1_sync_request(strucint good_sectors =RESYNC_SECTORS ;int min_bad =0 ;/* number of sectors that are bad in all devices */ int idx =sector_to_idx (sector_nr); +int page_idx =0 ;if (!conf->r1buf_pool)if (init_resync (conf))
@@ -2848,7 +2848,7 @@ static sector_t raid1_sync_request(struc bio = r1_bio->bios[i]; rp =get_resync_pages (bio);if (bio->bi_end_io) { - page =resync_fetch_page (rp, rp->idx++); + page =resync_fetch_page (rp, page_idx);/* * won't fail because the vec table is big
@@ -2860,7 +2860,7 @@ static sector_t raid1_sync_request(struc nr_sectors += len>>9 ; sector_nr += len>>9 ; sync_blocks -= (len>>9 ); - }while (get_resync_pages (r1_bio->bios[disk]->bi_private)->idx <RESYNC_PAGES ); + }while (++page_idx <RESYNC_PAGES ); r1_bio->sectors = nr_sectors;
drivers/md/raid10.c +3 -3
@@ -221,7 +221,6 @@ static void * r10buf_pool_alloc(gfp_t gfresync_get_all_pages (rp); } - rp->idx =0 ; rp->raid_bio = r10_bio; bio->bi_private = rp;if (rbio) {
@@ -2853,6 +2852,7 @@ static sector_t raid10_sync_request(strusector_t sectors_skipped =0 ;int chunks_skipped =0 ;sector_t chunk_mask = conf->geo.chunk_mask; +int page_idx =0 ;if (!conf->r10buf_pool)if (init_resync (conf))
@@ -3355,7 +3355,7 @@ static sector_t raid10_sync_request(strubreak ;for (bio= biolist ; bio ; bio=bio->bi_next) {struct resync_pages *rp =get_resync_pages (bio); - page =resync_fetch_page (rp, rp->idx++); + page =resync_fetch_page (rp, page_idx);/* * won't fail because the vec table is big enough * to hold all these pages
@@ -3364,7 +3364,7 @@ static sector_t raid10_sync_request(stru } nr_sectors += len>>9 ; sector_nr += len>>9 ; - }while (get_resync_pages (biolist)->idx <RESYNC_PAGES ); + }while (++page_idx <RESYNC_PAGES ); r10_bio->sectors = nr_sectors;while (biolist) {
Patches currently in stable-queue which might be from [email protected] are
queue-4.12/md-remove-idx-from-struct-resync_pages.patch queue-4.12/md-raid1-fix-writebehind-bio-clone.patch