Grow: fix up recent changes to set_new_data_offset.

The second 'info2' wasn't being initialised.  So don't use it.

Reported by -O3

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2013-06-19 09:58:02 +10:00
parent f69bb60857
commit c0f0d8128a
1 changed files with 21 additions and 23 deletions

44
Grow.c
View File

@ -2225,21 +2225,21 @@ static int set_new_data_offset(struct mdinfo *sra, struct supertype *st,
for (sd = sra->devs; sd; sd = sd->next) { for (sd = sra->devs; sd; sd = sd->next) {
char *dn = map_dev(sd->disk.major, sd->disk.minor, 0); char *dn = map_dev(sd->disk.major, sd->disk.minor, 0);
unsigned long long new_data_offset;
struct mdinfo info2;
if (delta_disks < 0) { if (delta_disks < 0) {
/* Don't need any space as array is shrinking /* Don't need any space as array is shrinking
* just move data_offset up by min * just move data_offset up by min
*/ */
if (data_offset == INVALID_SECTORS) if (data_offset == INVALID_SECTORS)
info2.new_data_offset = info2.data_offset + min; new_data_offset = sd->data_offset + min;
else { else {
if (data_offset < info2.data_offset + min) { if (data_offset < sd->data_offset + min) {
pr_err("--data-offset too small for %s\n", pr_err("--data-offset too small for %s\n",
dn); dn);
goto release; goto release;
} }
info2.new_data_offset = data_offset; new_data_offset = data_offset;
} }
} else if (delta_disks > 0) { } else if (delta_disks > 0) {
/* need space before */ /* need space before */
@ -2249,14 +2249,14 @@ static int set_new_data_offset(struct mdinfo *sra, struct supertype *st,
goto release; goto release;
} }
if (data_offset == INVALID_SECTORS) if (data_offset == INVALID_SECTORS)
info2.new_data_offset = info2.data_offset - min; new_data_offset = sd->data_offset - min;
else { else {
if (data_offset > info2.data_offset - min) { if (data_offset > sd->data_offset - min) {
pr_err("--data-offset too large for %s\n", pr_err("--data-offset too large for %s\n",
dn); dn);
goto release; goto release;
} }
info2.new_data_offset = data_offset; new_data_offset = data_offset;
} }
} else { } else {
if (dir == 0) { if (dir == 0) {
@ -2264,65 +2264,63 @@ static int set_new_data_offset(struct mdinfo *sra, struct supertype *st,
* was set we would have already decided, * was set we would have already decided,
* so just choose direction with most space. * so just choose direction with most space.
*/ */
if (info2.space_before > info2.space_after) if (before > after)
dir = -1; dir = -1;
else else
dir = 1; dir = 1;
sysfs_set_str(sra, NULL, "reshape_direction", sysfs_set_str(sra, NULL, "reshape_direction",
dir == 1 ? "backwards" : "forwards"); dir == 1 ? "backwards" : "forwards");
} }
if (dir > 0) {
switch (dir) { /* Increase data offset */
case 1: /* Increase data offset */
if (after < min) { if (after < min) {
pr_err("Insufficient tail-space for reshape on %s\n", pr_err("Insufficient tail-space for reshape on %s\n",
dn); dn);
goto release; goto release;
} }
if (data_offset != INVALID_SECTORS && if (data_offset != INVALID_SECTORS &&
data_offset < info2.data_offset + min) { data_offset < sd->data_offset + min) {
pr_err("--data-offset too small on %s\n", pr_err("--data-offset too small on %s\n",
dn); dn);
goto release; goto release;
} }
if (data_offset != INVALID_SECTORS) if (data_offset != INVALID_SECTORS)
info2.new_data_offset = data_offset; new_data_offset = data_offset;
else { else {
unsigned long long off = after / 2; unsigned long long off = after / 2;
off &= ~7ULL; off &= ~7ULL;
if (off < min) if (off < min)
off = min; off = min;
info2.new_data_offset = new_data_offset =
info2.data_offset + off; sd->data_offset + off;
} }
break; } else {
case -1: /* Decrease data offset */ /* Decrease data offset */
if (before < min) { if (before < min) {
pr_err("insufficient head-room on %s\n", pr_err("insufficient head-room on %s\n",
dn); dn);
goto release; goto release;
} }
if (data_offset != INVALID_SECTORS && if (data_offset != INVALID_SECTORS &&
data_offset < info2.data_offset - min) { data_offset < sd->data_offset - min) {
pr_err("--data-offset too small on %s\n", pr_err("--data-offset too small on %s\n",
dn); dn);
goto release; goto release;
} }
if (data_offset != INVALID_SECTORS) if (data_offset != INVALID_SECTORS)
info2.new_data_offset = data_offset; new_data_offset = data_offset;
else { else {
unsigned long long off = before / 2; unsigned long long off = before / 2;
off &= ~7ULL; off &= ~7ULL;
if (off < min) if (off < min)
off = min; off = min;
info2.new_data_offset = new_data_offset =
info2.data_offset - off; sd->data_offset - off;
} }
break;
} }
} }
if (sysfs_set_num(sra, sd, "new_offset", if (sysfs_set_num(sra, sd, "new_offset",
info2.new_data_offset) < 0) { new_data_offset) < 0) {
err = errno; err = errno;
err = -1; err = -1;
if (errno == E2BIG && data_offset != INVALID_SECTORS) { if (errno == E2BIG && data_offset != INVALID_SECTORS) {