From 3f54bd62dc26c9d9dd3398ad07ab8fbd5a55474d Mon Sep 17 00:00:00 2001 From: Adam Kwolek Date: Wed, 21 Sep 2011 12:17:30 +1000 Subject: [PATCH] Move restore backup code to function Reshape backup should be able to be restored during reshape continuation also. To reuse already existing code it is moved to function. Signed-off-by: Adam Kwolek Signed-off-by: NeilBrown --- Assemble.c | 40 +++-------------------------------- Grow.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ mdadm.h | 6 ++++++ 3 files changed, 70 insertions(+), 37 deletions(-) diff --git a/Assemble.c b/Assemble.c index 66d2ee4..c6aad20 100644 --- a/Assemble.c +++ b/Assemble.c @@ -1555,44 +1555,10 @@ int assemble_container_content(struct supertype *st, int mdfd, if (content->reshape_active) { int spare = content->array.raid_disks + expansion; - int i; - int *fdlist = malloc(sizeof(int) * - (working + expansion - + content->array.raid_disks)); - for (i=0; idevs; dev; dev = dev->next) { - char buf[20]; - int fd; - sprintf(buf, "%d:%d", - dev->disk.major, - dev->disk.minor); - fd = dev_open(buf, O_RDWR); - - if (dev->disk.raid_disk >= 0) - fdlist[dev->disk.raid_disk] = fd; - else - fdlist[spare++] = fd; - } - 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) - close(fdlist[spare]); - } - free(fdlist); - if (err) { - fprintf(stderr, Name ": Failed to restore critical" - " section for reshape - sorry.\n"); - if (!backup_file) - fprintf(stderr, Name ": Possibly you need" - " to specify a --backup-file\n"); + if (restore_backup(st, content, + working, + spare, backup_file, verbose) == 1) return 1; - } err = Grow_continue(mdfd, st, content, backup_file); } else switch(content->array.level) { diff --git a/Grow.c b/Grow.c index 17d14b6..b7234e4 100644 --- a/Grow.c +++ b/Grow.c @@ -35,6 +35,67 @@ #define offsetof(t,f) ((size_t)&(((t*)0)->f)) #endif +int restore_backup(struct supertype *st, + struct mdinfo *content, + int working_disks, + int next_spare, + char *backup_file, + int verbose) +{ + int i; + int *fdlist; + struct mdinfo *dev; + int err; + int disk_count = next_spare + working_disks; + + dprintf("Called restore_backup()\n"); + fdlist = malloc(sizeof(int) * disk_count); + if (fdlist == NULL) { + fprintf(stderr, + Name ": cannot allocate memory for disk list\n"); + return 1; + } + for (i = 0; i < next_spare; i++) + fdlist[i] = -1; + for (dev = content->devs; dev; dev = dev->next) { + char buf[22]; + int fd; + sprintf(buf, "%d:%d", + dev->disk.major, + dev->disk.minor); + fd = dev_open(buf, O_RDWR); + + if (dev->disk.raid_disk >= 0) + fdlist[dev->disk.raid_disk] = fd; + else + fdlist[next_spare++] = fd; + } + + if (st->ss->external && st->ss->recover_backup) + err = st->ss->recover_backup(st, content); + else + err = Grow_restart(st, content, fdlist, next_spare, + backup_file, verbose > 0); + + while (next_spare > 0) { + disk_count--; + if (fdlist[disk_count] >= 0) + close(fdlist[disk_count]); + } + free(fdlist); + if (err) { + fprintf(stderr, Name ": Failed to restore critical" + " section for reshape - sorry.\n"); + if (!backup_file) + fprintf(stderr, Name ": Possibly you need" + " to specify a --backup-file\n"); + return 1; + } + + dprintf("restore_backup() returns status OK.\n"); + return 0; +} + int Grow_Add_device(char *devname, int fd, char *newdev) { /* Add a device to an active array. diff --git a/mdadm.h b/mdadm.h index 6a36f43..bd3063b 100644 --- a/mdadm.h +++ b/mdadm.h @@ -1025,6 +1025,12 @@ extern int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist, int cnt, char *backup_file, int verbose); extern int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info, char *backup_file); +extern int restore_backup(struct supertype *st, + struct mdinfo *content, + int working_disks, + int spares, + char *backup_file, + int verbose); extern int Assemble(struct supertype *st, char *mddev, struct mddev_ident *ident,