md/raid5: prepare for allowing reshape to change layout
Add prev_algo to raid5_conf_t along the same lines as prev_chunk and previous_raid_disks. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
784052ecc6
commit
e183eaedd5
@ -1273,6 +1273,8 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector,
|
|||||||
int pd_idx, qd_idx;
|
int pd_idx, qd_idx;
|
||||||
int ddf_layout = 0;
|
int ddf_layout = 0;
|
||||||
sector_t new_sector;
|
sector_t new_sector;
|
||||||
|
int algorithm = previous ? conf->prev_algo
|
||||||
|
: conf->algorithm;
|
||||||
int sectors_per_chunk = previous ? (conf->prev_chunk >> 9)
|
int sectors_per_chunk = previous ? (conf->prev_chunk >> 9)
|
||||||
: (conf->chunk_size >> 9);
|
: (conf->chunk_size >> 9);
|
||||||
int raid_disks = previous ? conf->previous_raid_disks
|
int raid_disks = previous ? conf->previous_raid_disks
|
||||||
@ -1307,7 +1309,7 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector,
|
|||||||
pd_idx = data_disks;
|
pd_idx = data_disks;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
switch (conf->algorithm) {
|
switch (algorithm) {
|
||||||
case ALGORITHM_LEFT_ASYMMETRIC:
|
case ALGORITHM_LEFT_ASYMMETRIC:
|
||||||
pd_idx = data_disks - stripe % raid_disks;
|
pd_idx = data_disks - stripe % raid_disks;
|
||||||
if (*dd_idx >= pd_idx)
|
if (*dd_idx >= pd_idx)
|
||||||
@ -1335,13 +1337,13 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector,
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "raid5: unsupported algorithm %d\n",
|
printk(KERN_ERR "raid5: unsupported algorithm %d\n",
|
||||||
conf->algorithm);
|
algorithm);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
|
|
||||||
switch (conf->algorithm) {
|
switch (algorithm) {
|
||||||
case ALGORITHM_LEFT_ASYMMETRIC:
|
case ALGORITHM_LEFT_ASYMMETRIC:
|
||||||
pd_idx = raid_disks - 1 - (stripe % raid_disks);
|
pd_idx = raid_disks - 1 - (stripe % raid_disks);
|
||||||
qd_idx = pd_idx + 1;
|
qd_idx = pd_idx + 1;
|
||||||
@ -1454,7 +1456,7 @@ static sector_t raid5_compute_sector(raid5_conf_t *conf, sector_t r_sector,
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
printk(KERN_CRIT "raid6: unsupported algorithm %d\n",
|
printk(KERN_CRIT "raid6: unsupported algorithm %d\n",
|
||||||
conf->algorithm);
|
algorithm);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1481,6 +1483,8 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
|
|||||||
sector_t new_sector = sh->sector, check;
|
sector_t new_sector = sh->sector, check;
|
||||||
int sectors_per_chunk = previous ? (conf->prev_chunk >> 9)
|
int sectors_per_chunk = previous ? (conf->prev_chunk >> 9)
|
||||||
: (conf->chunk_size >> 9);
|
: (conf->chunk_size >> 9);
|
||||||
|
int algorithm = previous ? conf->prev_algo
|
||||||
|
: conf->algorithm;
|
||||||
sector_t stripe;
|
sector_t stripe;
|
||||||
int chunk_offset;
|
int chunk_offset;
|
||||||
int chunk_number, dummy1, dd_idx = i;
|
int chunk_number, dummy1, dd_idx = i;
|
||||||
@ -1497,7 +1501,7 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
|
|||||||
switch(conf->level) {
|
switch(conf->level) {
|
||||||
case 4: break;
|
case 4: break;
|
||||||
case 5:
|
case 5:
|
||||||
switch (conf->algorithm) {
|
switch (algorithm) {
|
||||||
case ALGORITHM_LEFT_ASYMMETRIC:
|
case ALGORITHM_LEFT_ASYMMETRIC:
|
||||||
case ALGORITHM_RIGHT_ASYMMETRIC:
|
case ALGORITHM_RIGHT_ASYMMETRIC:
|
||||||
if (i > sh->pd_idx)
|
if (i > sh->pd_idx)
|
||||||
@ -1516,14 +1520,14 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "raid5: unsupported algorithm %d\n",
|
printk(KERN_ERR "raid5: unsupported algorithm %d\n",
|
||||||
conf->algorithm);
|
algorithm);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
if (i == sh->qd_idx)
|
if (i == sh->qd_idx)
|
||||||
return 0; /* It is the Q disk */
|
return 0; /* It is the Q disk */
|
||||||
switch (conf->algorithm) {
|
switch (algorithm) {
|
||||||
case ALGORITHM_LEFT_ASYMMETRIC:
|
case ALGORITHM_LEFT_ASYMMETRIC:
|
||||||
case ALGORITHM_RIGHT_ASYMMETRIC:
|
case ALGORITHM_RIGHT_ASYMMETRIC:
|
||||||
case ALGORITHM_ROTATING_ZERO_RESTART:
|
case ALGORITHM_ROTATING_ZERO_RESTART:
|
||||||
@ -1571,7 +1575,7 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_CRIT "raid6: unsupported algorithm %d\n",
|
printk(KERN_CRIT "raid6: unsupported algorithm %d\n",
|
||||||
conf->algorithm);
|
algorithm);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -4330,8 +4334,10 @@ static raid5_conf_t *setup_conf(mddev_t *mddev)
|
|||||||
conf->algorithm = mddev->new_layout;
|
conf->algorithm = mddev->new_layout;
|
||||||
conf->max_nr_stripes = NR_STRIPES;
|
conf->max_nr_stripes = NR_STRIPES;
|
||||||
conf->reshape_progress = mddev->reshape_position;
|
conf->reshape_progress = mddev->reshape_position;
|
||||||
if (conf->reshape_progress != MaxSector)
|
if (conf->reshape_progress != MaxSector) {
|
||||||
conf->prev_chunk = mddev->chunk_size;
|
conf->prev_chunk = mddev->chunk_size;
|
||||||
|
conf->prev_algo = mddev->layout;
|
||||||
|
}
|
||||||
|
|
||||||
memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
|
memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
|
||||||
conf->raid_disks * ((sizeof(struct bio) + PAGE_SIZE))) / 1024;
|
conf->raid_disks * ((sizeof(struct bio) + PAGE_SIZE))) / 1024;
|
||||||
@ -4474,12 +4480,12 @@ static int run(mddev_t *mddev)
|
|||||||
printk("raid5: raid level %d set %s active with %d out of %d"
|
printk("raid5: raid level %d set %s active with %d out of %d"
|
||||||
" devices, algorithm %d\n", conf->level, mdname(mddev),
|
" devices, algorithm %d\n", conf->level, mdname(mddev),
|
||||||
mddev->raid_disks-mddev->degraded, mddev->raid_disks,
|
mddev->raid_disks-mddev->degraded, mddev->raid_disks,
|
||||||
conf->algorithm);
|
mddev->new_layout);
|
||||||
else
|
else
|
||||||
printk(KERN_ALERT "raid5: raid level %d set %s active with %d"
|
printk(KERN_ALERT "raid5: raid level %d set %s active with %d"
|
||||||
" out of %d devices, algorithm %d\n", conf->level,
|
" out of %d devices, algorithm %d\n", conf->level,
|
||||||
mdname(mddev), mddev->raid_disks - mddev->degraded,
|
mdname(mddev), mddev->raid_disks - mddev->degraded,
|
||||||
mddev->raid_disks, conf->algorithm);
|
mddev->raid_disks, mddev->new_layout);
|
||||||
|
|
||||||
print_raid5_conf(conf);
|
print_raid5_conf(conf);
|
||||||
|
|
||||||
|
@ -350,7 +350,7 @@ struct raid5_private_data {
|
|||||||
*/
|
*/
|
||||||
sector_t reshape_safe;
|
sector_t reshape_safe;
|
||||||
int previous_raid_disks;
|
int previous_raid_disks;
|
||||||
int prev_chunk;
|
int prev_chunk, prev_algo;
|
||||||
short generation; /* increments with every reshape */
|
short generation; /* increments with every reshape */
|
||||||
|
|
||||||
struct list_head handle_list; /* stripes needing handling */
|
struct list_head handle_list; /* stripes needing handling */
|
||||||
|
Loading…
Reference in New Issue
Block a user