mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
md/raid5: resize stripe_head when reshape array
When reshape array, we try to reuse shared pages of old stripe_head, and allocate more for the new one if needed. Signed-off-by: Yufen Yu <yuyufen@huawei.com> Signed-off-by: Song Liu <songliubraving@fb.com>
This commit is contained in:
parent
046169f048
commit
f16acaf328
@ -2535,6 +2535,12 @@ static int resize_stripes(struct r5conf *conf, int newsize)
|
|||||||
osh = get_free_stripe(conf, hash);
|
osh = get_free_stripe(conf, hash);
|
||||||
unlock_device_hash_lock(conf, hash);
|
unlock_device_hash_lock(conf, hash);
|
||||||
|
|
||||||
|
#if PAGE_SIZE != DEFAULT_STRIPE_SIZE
|
||||||
|
for (i = 0; i < osh->nr_pages; i++) {
|
||||||
|
nsh->pages[i] = osh->pages[i];
|
||||||
|
osh->pages[i] = NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
for(i=0; i<conf->pool_size; i++) {
|
for(i=0; i<conf->pool_size; i++) {
|
||||||
nsh->dev[i].page = osh->dev[i].page;
|
nsh->dev[i].page = osh->dev[i].page;
|
||||||
nsh->dev[i].orig_page = osh->dev[i].page;
|
nsh->dev[i].orig_page = osh->dev[i].page;
|
||||||
@ -2589,6 +2595,23 @@ static int resize_stripes(struct r5conf *conf, int newsize)
|
|||||||
nsh = list_entry(newstripes.next, struct stripe_head, lru);
|
nsh = list_entry(newstripes.next, struct stripe_head, lru);
|
||||||
list_del_init(&nsh->lru);
|
list_del_init(&nsh->lru);
|
||||||
|
|
||||||
|
#if PAGE_SIZE != DEFAULT_STRIPE_SIZE
|
||||||
|
for (i = 0; i < nsh->nr_pages; i++) {
|
||||||
|
if (nsh->pages[i])
|
||||||
|
continue;
|
||||||
|
nsh->pages[i] = alloc_page(GFP_NOIO);
|
||||||
|
if (!nsh->pages[i])
|
||||||
|
err = -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = conf->raid_disks; i < newsize; i++) {
|
||||||
|
if (nsh->dev[i].page)
|
||||||
|
continue;
|
||||||
|
nsh->dev[i].page = raid5_get_dev_page(nsh, i);
|
||||||
|
nsh->dev[i].orig_page = nsh->dev[i].page;
|
||||||
|
nsh->dev[i].offset = raid5_get_page_offset(nsh, i);
|
||||||
|
}
|
||||||
|
#else
|
||||||
for (i=conf->raid_disks; i < newsize; i++)
|
for (i=conf->raid_disks; i < newsize; i++)
|
||||||
if (nsh->dev[i].page == NULL) {
|
if (nsh->dev[i].page == NULL) {
|
||||||
struct page *p = alloc_page(GFP_NOIO);
|
struct page *p = alloc_page(GFP_NOIO);
|
||||||
@ -2598,6 +2621,7 @@ static int resize_stripes(struct r5conf *conf, int newsize)
|
|||||||
if (!p)
|
if (!p)
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
raid5_release_stripe(nsh);
|
raid5_release_stripe(nsh);
|
||||||
}
|
}
|
||||||
/* critical section pass, GFP_NOIO no longer needed */
|
/* critical section pass, GFP_NOIO no longer needed */
|
||||||
|
Loading…
Reference in New Issue
Block a user