]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Manage.c
Fix create bug which initialised superblocks wrongly.
[thirdparty/mdadm.git] / Manage.c
index 34076cbfe63e0d7d13b64b984950902d72e1a2a5..c1debfa97f9ba9ca7e6af8ed019fb72f30e273c5 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -114,6 +114,44 @@ int Manage_runstop(char *devname, int fd, int runstop)
        return 0;
 }
 
+int Manage_resize(char *devname, int fd, long long size, int raid_disks)
+{
+       mdu_array_info_t info;
+       if (ioctl(fd, GET_ARRAY_INFO, &info) != 0) {
+               fprintf(stderr, Name ": Cannot get array information for %s: %s\n",
+                       devname, strerror(errno));
+               return 1;
+       }
+       if (size >= 0)
+               info.size = size;
+       if (raid_disks > 0)
+               info.raid_disks = raid_disks;
+       if (ioctl(fd, SET_ARRAY_INFO, &info) != 0) {
+               fprintf(stderr, Name ": Cannot set device size/shape for %s: %s\n",
+                       devname, strerror(errno));
+               return 1;
+       }
+       return 0;
+}
+
+int Manage_reconfig(char *devname, int fd, int layout)
+{
+       mdu_array_info_t info;
+       if (ioctl(fd, GET_ARRAY_INFO, &info) != 0) {
+               fprintf(stderr, Name ": Cannot get array information for %s: %s\n",
+                       devname, strerror(errno));
+               return 1;
+       }
+       info.layout = layout;
+       printf("layout set to %d\n", info.layout);
+       if (ioctl(fd, SET_ARRAY_INFO, &info) != 0) {
+               fprintf(stderr, Name ": Cannot set layout for %s: %s\n",
+                       devname, strerror(errno));
+               return 1;
+       }
+       return 0;
+}
+
 int Manage_subdevs(char *devname, int fd,
                   mddev_dev_t devlist)
 {
@@ -130,6 +168,7 @@ int Manage_subdevs(char *devname, int fd,
        mddev_dev_t dv;
        struct stat stb;
        int j;
+       int tfd;
        int save_errno;
        static char buf[4096];
 
@@ -156,6 +195,14 @@ int Manage_subdevs(char *devname, int fd,
                        return 1;
                case 'a':
                        /* add the device - hot or cold */
+                       /* Make sure it isn' in use (in 2.6 or later) */
+                       tfd = open(dv->devname, O_RDONLY|O_EXCL);
+                       if (tfd < 0) {
+                               fprintf(stderr, Name ": Cannot open %s: %s\n",
+                                       dv->devname, strerror(errno));
+                               return 1;
+                       }
+                       close(tfd);
                        if (ioctl(fd, HOT_ADD_DISK, (unsigned long)stb.st_rdev)==0) {
                                fprintf(stderr, Name ": hot added %s\n",
                                        dv->devname);
@@ -177,6 +224,7 @@ int Manage_subdevs(char *devname, int fd,
                         * in case
                         */
                        for (j=0; j<array.nr_disks; j++) {
+                               disc.number = j;
                                if (ioctl(fd, GET_DISK_INFO, &disc))
                                        break;
                                if (disc.major==0 && disc.minor==0)
@@ -187,8 +235,8 @@ int Manage_subdevs(char *devname, int fd,
                        disc.number =j;
                        disc.raid_disk = j;
                        disc.state = 0;
-                       disc.major = MAJOR(stb.st_rdev);
-                       disc.minor = MINOR(stb.st_rdev);
+                       disc.major = major(stb.st_rdev);
+                       disc.minor = minor(stb.st_rdev);
                        if (ioctl(fd,ADD_NEW_DISK, &disc)) {
                                fprintf(stderr, Name ": add new device failed for %s: %s\n",
                                        dv->devname, strerror(errno));