From f9ce90ba509d0b624cc38635861b9c27550fbefc Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Tue, 3 May 2005 23:44:32 +0000 Subject: Add a 'super-switch' so that different format superblocks can be used. This includes: adding --metadata= option to choose metadata format adding metadata= word to config file. Signed-off-by: Neil Brown --- Grow.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'Grow.c') diff --git a/Grow.c b/Grow.c index 8de28d4..ec2eb55 100644 --- a/Grow.c +++ b/Grow.c @@ -51,6 +51,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev) struct stat stb; int nfd, fd2; int d, nd; + struct superswitch *ss = NULL; if (ioctl(fd, GET_ARRAY_INFO, &info.array) < 0) { @@ -58,6 +59,12 @@ int Grow_Add_device(char *devname, int fd, char *newdev) return 1; } + ss = super_by_version(info.array.major_version); + if (!ss) { + fprintf(stderr, Name ": cannot handle arrays with superblock version %d\n", info.array.major_version); + return 1; + } + if (info.array.level != -1) { fprintf(stderr, Name ": can only add devices to linear arrays\n"); return 1; @@ -98,7 +105,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev) } if (super) free(super); super= NULL; - if (load_super0(fd2, &super, NULL)) { + if (ss->load_super(fd2, &super, NULL)) { fprintf(stderr, Name ": cannot find super block on %s\n", dv); close(fd2); return 1; @@ -114,9 +121,9 @@ int Grow_Add_device(char *devname, int fd, char *newdev) info.disk.minor = minor(stb.st_rdev); info.disk.raid_disk = d; info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE); - update_super0(&info, super, "grow", newdev, 0); + ss->update_super(&info, super, "grow", newdev, 0); - if (store_super0(nfd, super)) { + if (ss->store_super(nfd, super)) { fprintf(stderr, Name ": Cannot store new superblock on %s\n", newdev); close(nfd); return 1; @@ -158,7 +165,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev) fprintf(stderr, Name ": cannot open device file %s\n", dv); return 1; } - if (load_super0(fd2, &super, NULL)) { + if (ss->load_super(fd2, &super, NULL)) { fprintf(stderr, Name ": cannot find super block on %s\n", dv); close(fd); return 1; @@ -172,9 +179,9 @@ int Grow_Add_device(char *devname, int fd, char *newdev) info.disk.minor = minor(stb.st_rdev); info.disk.raid_disk = nd; info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE); - update_super0(&info, super, "grow", dv, 0); + ss->update_super(&info, super, "grow", dv, 0); - if (store_super0(fd2, super)) { + if (ss->store_super(fd2, super)) { fprintf(stderr, Name ": Cannot store new superblock on %s\n", dv); close(fd2); return 1; -- cgit