summaryrefslogtreecommitdiffstats
path: root/Grow.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-05-03 23:44:32 +0000
committerNeil Brown <neilb@suse.de>2005-05-03 23:44:32 +0000
commitf9ce90ba509d0b624cc38635861b9c27550fbefc (patch)
treede5576f6c939e0fd95f76030b4d273fdfc9f5945 /Grow.c
parent4b1ac34b51a3783ab528b1af307156fab057b543 (diff)
downloadmdadm-f9ce90ba509d0b624cc38635861b9c27550fbefc.tar.gz
mdadm-f9ce90ba509d0b624cc38635861b9c27550fbefc.tar.xz
mdadm-f9ce90ba509d0b624cc38635861b9c27550fbefc.zip
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 <neilb@cse.unsw.edu.au>
Diffstat (limited to 'Grow.c')
-rw-r--r--Grow.c19
1 files changed, 13 insertions, 6 deletions
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;