]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Add reshape restart support for external metadata
authorAdam Kwolek <adam.kwolek@intel.com>
Wed, 8 Jun 2011 07:11:11 +0000 (17:11 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 8 Jun 2011 07:11:11 +0000 (17:11 +1000)
Patch introduces support for reshape process restart for external metadata
using metadata specific data handling methods.
It introduces recover_backup() function that restores array to stable state
It is equivalent to Grow_restart() functionality for native metadata.

Signed-off-by: Maciej Trela <maciej.trela@intel.com>
Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Assemble.c
mdadm.h

index 250a6e0ee15ff83a78f26c1d9c0072602471b637..a426afb08cad42c285029166b8b0f27f797efb09 100644 (file)
@@ -1190,8 +1190,11 @@ int Assemble(struct supertype *st, char *mddev,
                                fdlist[i] = -1;
                }
                if (!err) {
-                       err = Grow_restart(st, content, fdlist, bestcnt,
-                                          backup_file, verbose > 0);
+                       if (st->ss->external && st->ss->recover_backup)
+                               err = st->ss->recover_backup(st, content);
+                       else
+                               err = Grow_restart(st, content, fdlist, bestcnt,
+                                                  backup_file, verbose > 0);
                        if (err && invalid_backup) {
                                if (verbose > 0)
                                        fprintf(stderr, Name ": continuing"
@@ -1571,8 +1574,11 @@ int assemble_container_content(struct supertype *st, int mdfd,
                                else
                                        fdlist[spare++] = fd;
                        }
-                       err = Grow_restart(st, content, fdlist, spare,
-                                          backup_file, verbose > 0);
+                       if (st->ss->external && st->ss->recover_backup)
+                               err = st->ss->recover_backup(st, content);
+                       else
+                               err = Grow_restart(st, content, fdlist, spare,
+                                                  backup_file, verbose > 0);
                        while (spare > 0) {
                                spare--;
                                if (fdlist[spare] >= 0)
diff --git a/mdadm.h b/mdadm.h
index a69335219b196ef150f5eac66ec00a39f54e653b..e075dd2aa74f7621600c4c030ee94e124dbc633f 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -786,6 +786,9 @@ extern struct superswitch {
         */
        const char *(*get_disk_controller_domain)(const char *path);
 
+       /* for external backup area */
+       int (*recover_backup)(struct supertype *st, struct mdinfo *info);
+
        int swapuuid; /* true if uuid is bigending rather than hostendian */
        int external;
        const char *name; /* canonical metadata name */