Clean up return path for reshape_array.

Particular problem was that we didn't unfreeze if a reshape
wasn't needed.

But all that 'rv' stuff isn't needed and some of it was wrong,
so simplify it all.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2011-01-13 15:20:21 +11:00
parent 5dad078d99
commit 631d7405f1
1 changed files with 21 additions and 32 deletions

53
Grow.c
View File

@ -1583,7 +1583,6 @@ static int reshape_array(char *container, int fd, char *devname,
struct mdu_array_info_s array; struct mdu_array_info_s array;
char *c; char *c;
int rv = 0;
int *fdlist; int *fdlist;
unsigned long long *offsets; unsigned long long *offsets;
@ -1599,11 +1598,11 @@ static int reshape_array(char *container, int fd, char *devname,
msg = analyse_change(info, &reshape); msg = analyse_change(info, &reshape);
if (msg) { if (msg) {
fprintf(stderr, Name ": %s\n", msg); fprintf(stderr, Name ": %s\n", msg);
return 1; goto release;
} }
if (ioctl(fd, GET_ARRAY_INFO, &array) != 0) { if (ioctl(fd, GET_ARRAY_INFO, &array) != 0) {
dprintf("Canot get array information.\n"); dprintf("Canot get array information.\n");
return 1; goto release;
} }
spares_needed = max(reshape.before.data_disks, spares_needed = max(reshape.before.data_disks,
reshape.after.data_disks) reshape.after.data_disks)
@ -1619,14 +1618,14 @@ static int reshape_array(char *container, int fd, char *devname,
spares_needed, spares_needed,
spares_needed == 1 ? "" : "s", spares_needed == 1 ? "" : "s",
info->array.spare_disks); info->array.spare_disks);
return 1; goto release;
} }
if (reshape.level != info->array.level) { if (reshape.level != info->array.level) {
char *c = map_num(pers, reshape.level); char *c = map_num(pers, reshape.level);
int err; int err;
if (c == NULL) if (c == NULL)
return 1; /* This should not be possible */ goto release;
err = sysfs_set_str(info, NULL, "level", c); err = sysfs_set_str(info, NULL, "level", c);
if (err) { if (err) {
@ -1637,7 +1636,7 @@ static int reshape_array(char *container, int fd, char *devname,
(info->array.state & (1<<MD_SB_BITMAP_PRESENT))) (info->array.state & (1<<MD_SB_BITMAP_PRESENT)))
fprintf(stderr, " Bitmap must be removed" fprintf(stderr, " Bitmap must be removed"
" before level can be changed\n"); " before level can be changed\n");
return 1; goto release;
} }
if (!quiet) if (!quiet)
fprintf(stderr, Name ": level of %s changed to %s\n", fprintf(stderr, Name ": level of %s changed to %s\n",
@ -1686,7 +1685,7 @@ static int reshape_array(char *container, int fd, char *devname,
info->array.layout = info->new_layout; info->array.layout = info->new_layout;
if (ioctl(fd, SET_ARRAY_INFO, &info->array) != 0) { if (ioctl(fd, SET_ARRAY_INFO, &info->array) != 0) {
fprintf(stderr, Name ": failed to set new layout\n"); fprintf(stderr, Name ": failed to set new layout\n");
rv = 1; goto release;
} else if (!quiet) } else if (!quiet)
printf("layout for %s set to %d\n", printf("layout for %s set to %d\n",
devname, info->array.layout); devname, info->array.layout);
@ -1696,7 +1695,7 @@ static int reshape_array(char *container, int fd, char *devname,
info->array.raid_disks += info->delta_disks; info->array.raid_disks += info->delta_disks;
if (ioctl(fd, SET_ARRAY_INFO, &info->array) != 0) { if (ioctl(fd, SET_ARRAY_INFO, &info->array) != 0) {
fprintf(stderr, Name ": failed to set raid disks\n"); fprintf(stderr, Name ": failed to set raid disks\n");
rv = 1; goto release;
} else if (!quiet) } else if (!quiet)
printf("raid_disks for %s set to %d\n", printf("raid_disks for %s set to %d\n",
devname, info->array.raid_disks); devname, info->array.raid_disks);
@ -1706,13 +1705,15 @@ static int reshape_array(char *container, int fd, char *devname,
if (sysfs_set_num(info, NULL, if (sysfs_set_num(info, NULL,
"chunk_size", info->new_chunk) != 0) { "chunk_size", info->new_chunk) != 0) {
fprintf(stderr, Name ": failed to set chunk size\n"); fprintf(stderr, Name ": failed to set chunk size\n");
rv = 1; goto release;
} else if (!quiet) } else if (!quiet)
printf("chunk size for %s set to %d\n", printf("chunk size for %s set to %d\n",
devname, info->array.chunk_size); devname, info->array.chunk_size);
} }
return rv; if (!forked)
unfreeze(st);
return 0;
} }
/* /*
@ -1757,7 +1758,6 @@ static int reshape_array(char *container, int fd, char *devname,
" use --grow --array-size first to truncate array.\n" " use --grow --array-size first to truncate array.\n"
" e.g. mdadm --grow %s --array-size %llu\n", " e.g. mdadm --grow %s --array-size %llu\n",
devname, reshape.new_size/2); devname, reshape.new_size/2);
rv = 1;
goto release; goto release;
} }
@ -1768,7 +1768,6 @@ static int reshape_array(char *container, int fd, char *devname,
if (!sra) { if (!sra) {
fprintf(stderr, Name ": %s: Cannot get array details from sysfs\n", fprintf(stderr, Name ": %s: Cannot get array details from sysfs\n",
devname); devname);
rv = 1;
goto release; goto release;
} }
@ -1793,7 +1792,6 @@ static int reshape_array(char *container, int fd, char *devname,
fprintf(stderr, Name ": %s: Something wrong" fprintf(stderr, Name ": %s: Something wrong"
" - reshape aborted\n", " - reshape aborted\n",
devname); devname);
rv = 1;
goto release; goto release;
} }
@ -1804,7 +1802,6 @@ static int reshape_array(char *container, int fd, char *devname,
offsets = malloc((1+nrdisks) * sizeof(offsets[0])); offsets = malloc((1+nrdisks) * sizeof(offsets[0]));
if (!fdlist || !offsets) { if (!fdlist || !offsets) {
fprintf(stderr, Name ": malloc failed: grow aborted\n"); fprintf(stderr, Name ": malloc failed: grow aborted\n");
rv = 1;
goto release; goto release;
} }
@ -1812,7 +1809,6 @@ static int reshape_array(char *container, int fd, char *devname,
nrdisks, blocks, backup_file, nrdisks, blocks, backup_file,
fdlist, offsets); fdlist, offsets);
if (d < 0) { if (d < 0) {
rv = 1;
goto release; goto release;
} }
if (backup_file == NULL) { if (backup_file == NULL) {
@ -1820,20 +1816,17 @@ static int reshape_array(char *container, int fd, char *devname,
fprintf(stderr, fprintf(stderr,
Name ": %s: Cannot grow - need backup-file\n", Name ": %s: Cannot grow - need backup-file\n",
devname); devname);
rv = 1;
goto release; goto release;
} else if (sra->array.spare_disks == 0) { } else if (sra->array.spare_disks == 0) {
fprintf(stderr, Name ": %s: Cannot grow - need a spare or " fprintf(stderr, Name ": %s: Cannot grow - need a spare or "
"backup-file to backup critical section\n", "backup-file to backup critical section\n",
devname); devname);
rv = 1;
goto release; goto release;
} }
} else { } else {
if (!reshape_open_backup_file(backup_file, fd, devname, if (!reshape_open_backup_file(backup_file, fd, devname,
(signed)blocks, (signed)blocks,
fdlist+d, offsets+d)) { fdlist+d, offsets+d)) {
rv = 1;
goto release; goto release;
} }
d++; d++;
@ -1871,7 +1864,7 @@ static int reshape_array(char *container, int fd, char *devname,
array.raid_disks = reshape.after.data_disks + reshape.parity; array.raid_disks = reshape.after.data_disks + reshape.parity;
if (ioctl(fd, SET_ARRAY_INFO, &array) != 0) { if (ioctl(fd, SET_ARRAY_INFO, &array) != 0) {
int err = errno; int err = errno;
rv = 1;
fprintf(stderr, fprintf(stderr,
Name ": Cannot set device shape for %s: %s\n", Name ": Cannot set device shape for %s: %s\n",
devname, strerror(errno)); devname, strerror(errno));
@ -1888,20 +1881,17 @@ static int reshape_array(char *container, int fd, char *devname,
/* set them all just in case some old 'new_*' value /* set them all just in case some old 'new_*' value
* persists from some earlier problem * persists from some earlier problem
*/ */
int err = err; /* only used if rv==1, and always set if int err = 0;
* rv==1, so initialisation not needed,
* despite gcc warning
*/
if (sysfs_set_num(sra, NULL, "chunk_size", info->new_chunk) < 0) if (sysfs_set_num(sra, NULL, "chunk_size", info->new_chunk) < 0)
rv = 1, err = errno; err = errno;
if (!rv && sysfs_set_num(sra, NULL, "layout", if (!err && sysfs_set_num(sra, NULL, "layout",
reshape.after.layout) < 0) reshape.after.layout) < 0)
rv = 1, err = errno; err = errno;
if (!rv && subarray_set_num(container, sra, "raid_disks", if (!err && subarray_set_num(container, sra, "raid_disks",
reshape.after.data_disks + reshape.after.data_disks +
reshape.parity) < 0) reshape.parity) < 0)
rv = 1, err = errno; err = errno;
if (rv) { if (err) {
fprintf(stderr, Name ": Cannot set device shape for %s\n", fprintf(stderr, Name ": Cannot set device shape for %s\n",
devname); devname);
@ -1924,9 +1914,8 @@ static int reshape_array(char *container, int fd, char *devname,
case -1: case -1:
fprintf(stderr, Name ": Cannot run child to monitor reshape: %s\n", fprintf(stderr, Name ": Cannot run child to monitor reshape: %s\n",
strerror(errno)); strerror(errno));
rv = 1;
abort_reshape(sra); abort_reshape(sra);
break; goto release;
default: default:
return 0; return 0;
case 0: case 0:
@ -2045,7 +2034,7 @@ release:
} }
if (!forked) if (!forked)
unfreeze(st); unfreeze(st);
return rv; return 1;
} }
int reshape_container(char *container, int cfd, char *devname, int reshape_container(char *container, int cfd, char *devname,