summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-05-21 09:42:27 +1000
committerNeilBrown <neilb@suse.de>2012-05-21 09:42:27 +1000
commit85bdd744c1504c6a4e7823f1dfa5cfbc3c5de44b (patch)
treebe1b56b96e1c981addaa347862decad79b764811
parent9cf154394476f7f1d2b8852bd50b7fcb65d804dc (diff)
downloadmdadm-85bdd744c1504c6a4e7823f1dfa5cfbc3c5de44b.tar.gz
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 the 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>
-rw-r--r--Assemble.c4
-rw-r--r--Incremental.c11
-rw-r--r--mdadm.h1
-rw-r--r--super1.c2
4 files changed, 17 insertions, 1 deletions
diff --git a/Assemble.c b/Assemble.c
index 227d66f..abbec47 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -1202,7 +1202,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 = malloc(sizeof(int)* bestcnt);
if (verbose > 0)
@@ -1378,6 +1379,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");
diff --git a/Incremental.c b/Incremental.c
index e3639f2..2c4717c 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -513,6 +513,14 @@ int Incremental(char *devname, int verbose, int runstop,
if (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) {
@@ -1317,6 +1325,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,
diff --git a/mdadm.h b/mdadm.h
index a70a005..abe7c3c 100644
--- a/mdadm.h
+++ b/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
diff --git a/super1.c b/super1.c
index 94b6c7f..572bd6c 100644
--- a/super1.c
+++ b/super1.c
@@ -721,6 +721,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);