New RESHAPE_NO_BACKUP flag to track when backup action is needed.
Some arrays (raid10) never need a backup file, so during assembly we can avoid the whole Grow_continue check in that case. Achieve this using a flag set by the metadata handler. Also get "mdadm -I" to fail if a backup process would be needed. It currently does fail as the kernel rejects things, but it is nicer to have this explicit. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
19ceb16daf
commit
5e88ab2e2f
|
@ -1192,7 +1192,8 @@ int Assemble(struct supertype *st, char *mddev,
|
|||
* The code of doing this lives in Grow.c
|
||||
*/
|
||||
#ifndef MDASSEMBLE
|
||||
if (content->reshape_active) {
|
||||
if (content->reshape_active &&
|
||||
!(content->reshape_active & RESHAPE_NO_BACKUP)) {
|
||||
int err = 0;
|
||||
int *fdlist = xmalloc(sizeof(int)* bestcnt);
|
||||
if (c->verbose > 0)
|
||||
|
@ -1368,6 +1369,7 @@ int Assemble(struct supertype *st, char *mddev,
|
|||
int rv;
|
||||
#ifndef MDASSEMBLE
|
||||
if (content->reshape_active &&
|
||||
!(content->reshape_active & RESHAPE_NO_BACKUP) &&
|
||||
content->delta_disks <= 0) {
|
||||
rv = sysfs_set_str(content, NULL,
|
||||
"array_state", "readonly");
|
||||
|
|
|
@ -494,6 +494,14 @@ int Incremental(char *devname, struct context *c,
|
|||
if (c->runstop > 0 || active_disks >= info.array.working_disks) {
|
||||
struct mdinfo *dsk;
|
||||
/* Let's try to start it */
|
||||
|
||||
if (info.reshape_active && !(info.reshape_active & RESHAPE_NO_BACKUP)) {
|
||||
fprintf(stderr, Name
|
||||
": %s: This array is being reshaped and cannot be started\n"
|
||||
" by --incremental. Please use --assemble\n",
|
||||
chosen_name);
|
||||
goto out;
|
||||
}
|
||||
if (match && match->bitmap_file) {
|
||||
int bmfd = open(match->bitmap_file, O_RDWR);
|
||||
if (bmfd < 0) {
|
||||
|
@ -1285,6 +1293,9 @@ int IncrementalScan(int verbose)
|
|||
me->path, strerror(errno));
|
||||
}
|
||||
}
|
||||
/* FIXME check for reshape_active and consider not
|
||||
* starting array.
|
||||
*/
|
||||
sra = sysfs_read(mdfd, 0, 0);
|
||||
if (sra) {
|
||||
if (sysfs_set_str(sra, NULL,
|
||||
|
|
1
mdadm.h
1
mdadm.h
|
@ -198,6 +198,7 @@ struct mdinfo {
|
|||
#define NO_RESHAPE 0
|
||||
#define VOLUME_RESHAPE 1
|
||||
#define CONTAINER_RESHAPE 2
|
||||
#define RESHAPE_NO_BACKUP 16 /* Mask 'or'ed in */
|
||||
int reshape_active;
|
||||
unsigned long long reshape_progress;
|
||||
int recovery_blocked; /* for external metadata it
|
||||
|
|
2
super1.c
2
super1.c
|
@ -766,6 +766,8 @@ static void getinfo_super1(struct supertype *st, struct mdinfo *info, char *map)
|
|||
|
||||
if (sb->feature_map & __le32_to_cpu(MD_FEATURE_RESHAPE_ACTIVE)) {
|
||||
info->reshape_active = 1;
|
||||
if (info->array.level == 10)
|
||||
info->reshape_active |= RESHAPE_NO_BACKUP;
|
||||
info->reshape_progress = __le64_to_cpu(sb->reshape_position);
|
||||
info->new_level = __le32_to_cpu(sb->new_level);
|
||||
info->delta_disks = __le32_to_cpu(sb->delta_disks);
|
||||
|
|
Loading…
Reference in New Issue