struct mdu_array_info_s array;
char *c;
- int rv = 0;
int *fdlist;
unsigned long long *offsets;
msg = analyse_change(info, &reshape);
if (msg) {
fprintf(stderr, Name ": %s\n", msg);
- return 1;
+ goto release;
}
if (ioctl(fd, GET_ARRAY_INFO, &array) != 0) {
dprintf("Canot get array information.\n");
- return 1;
+ goto release;
}
spares_needed = max(reshape.before.data_disks,
reshape.after.data_disks)
spares_needed,
spares_needed == 1 ? "" : "s",
info->array.spare_disks);
- return 1;
+ goto release;
}
if (reshape.level != info->array.level) {
char *c = map_num(pers, reshape.level);
int err;
if (c == NULL)
- return 1; /* This should not be possible */
+ goto release;
err = sysfs_set_str(info, NULL, "level", c);
if (err) {
(info->array.state & (1<<MD_SB_BITMAP_PRESENT)))
fprintf(stderr, " Bitmap must be removed"
" before level can be changed\n");
- return 1;
+ goto release;
}
if (!quiet)
fprintf(stderr, Name ": level of %s changed to %s\n",
info->array.layout = info->new_layout;
if (ioctl(fd, SET_ARRAY_INFO, &info->array) != 0) {
fprintf(stderr, Name ": failed to set new layout\n");
- rv = 1;
+ goto release;
} else if (!quiet)
printf("layout for %s set to %d\n",
devname, info->array.layout);
info->array.raid_disks += info->delta_disks;
if (ioctl(fd, SET_ARRAY_INFO, &info->array) != 0) {
fprintf(stderr, Name ": failed to set raid disks\n");
- rv = 1;
+ goto release;
} else if (!quiet)
printf("raid_disks for %s set to %d\n",
devname, info->array.raid_disks);
if (sysfs_set_num(info, NULL,
"chunk_size", info->new_chunk) != 0) {
fprintf(stderr, Name ": failed to set chunk size\n");
- rv = 1;
+ goto release;
} else if (!quiet)
printf("chunk size for %s set to %d\n",
devname, info->array.chunk_size);
}
- return rv;
+ if (!forked)
+ unfreeze(st);
+ return 0;
}
/*
" use --grow --array-size first to truncate array.\n"
" e.g. mdadm --grow %s --array-size %llu\n",
devname, reshape.new_size/2);
- rv = 1;
goto release;
}
if (!sra) {
fprintf(stderr, Name ": %s: Cannot get array details from sysfs\n",
devname);
- rv = 1;
goto release;
}
fprintf(stderr, Name ": %s: Something wrong"
" - reshape aborted\n",
devname);
- rv = 1;
goto release;
}
offsets = malloc((1+nrdisks) * sizeof(offsets[0]));
if (!fdlist || !offsets) {
fprintf(stderr, Name ": malloc failed: grow aborted\n");
- rv = 1;
goto release;
}
nrdisks, blocks, backup_file,
fdlist, offsets);
if (d < 0) {
- rv = 1;
goto release;
}
if (backup_file == NULL) {
fprintf(stderr,
Name ": %s: Cannot grow - need backup-file\n",
devname);
- rv = 1;
goto release;
} else if (sra->array.spare_disks == 0) {
fprintf(stderr, Name ": %s: Cannot grow - need a spare or "
"backup-file to backup critical section\n",
devname);
- rv = 1;
goto release;
}
} else {
if (!reshape_open_backup_file(backup_file, fd, devname,
(signed)blocks,
fdlist+d, offsets+d)) {
- rv = 1;
goto release;
}
d++;
array.raid_disks = reshape.after.data_disks + reshape.parity;
if (ioctl(fd, SET_ARRAY_INFO, &array) != 0) {
int err = errno;
- rv = 1;
+
fprintf(stderr,
Name ": Cannot set device shape for %s: %s\n",
devname, strerror(errno));
/* set them all just in case some old 'new_*' value
* persists from some earlier problem
*/
- int err = err; /* only used if rv==1, and always set if
- * rv==1, so initialisation not needed,
- * despite gcc warning
- */
+ int err = 0;
if (sysfs_set_num(sra, NULL, "chunk_size", info->new_chunk) < 0)
- rv = 1, err = errno;
- if (!rv && sysfs_set_num(sra, NULL, "layout",
+ err = errno;
+ if (!err && sysfs_set_num(sra, NULL, "layout",
reshape.after.layout) < 0)
- rv = 1, err = errno;
- if (!rv && subarray_set_num(container, sra, "raid_disks",
+ err = errno;
+ if (!err && subarray_set_num(container, sra, "raid_disks",
reshape.after.data_disks +
reshape.parity) < 0)
- rv = 1, err = errno;
- if (rv) {
+ err = errno;
+ if (err) {
fprintf(stderr, Name ": Cannot set device shape for %s\n",
devname);
case -1:
fprintf(stderr, Name ": Cannot run child to monitor reshape: %s\n",
strerror(errno));
- rv = 1;
abort_reshape(sra);
- break;
+ goto release;
default:
return 0;
case 0:
}
if (!forked)
unfreeze(st);
- return rv;
+ return 1;
}
int reshape_container(char *container, int cfd, char *devname,