]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Manage.c
Add 'supertype' arg to almost all metadata methods.
[thirdparty/mdadm.git] / Manage.c
index d857c99ea568c0f391c19649897d003f8dfd50fa..5219e6eb8760ec2b287f10f3d6567297bbe72838 100644 (file)
--- a/Manage.c
+++ b/Manage.c
@@ -45,7 +45,7 @@ int Manage_ro(char *devname, int fd, int readonly)
         *
         */
        mdu_array_info_t array;
-       
+
        if (md_get_version(fd) < 9000) {
                fprintf(stderr, Name ": need md driver version 0.90.0 or later\n");
                return 1;
@@ -55,7 +55,7 @@ int Manage_ro(char *devname, int fd, int readonly)
                        devname);
                return 1;
        }
-       
+
        if (readonly>0) {
                if (ioctl(fd, STOP_ARRAY_RO, NULL)) {
                        fprintf(stderr, Name ": failed to set readonly for %s: %s\n",
@@ -69,7 +69,7 @@ int Manage_ro(char *devname, int fd, int readonly)
                        return 1;
                }
        }
-       return 0;                       
+       return 0;
 }
 
 #ifndef MDASSEMBLE
@@ -88,7 +88,7 @@ int Manage_runstop(char *devname, int fd, int runstop, int quiet)
                        return 1;
                }
        }
-       
+
        if (md_get_version(fd) < 9000) {
                fprintf(stderr, Name ": need md driver version 0.90.0 or later\n");
                return 1;
@@ -306,6 +306,7 @@ int Manage_subdevs(char *devname, int fd,
                                        dv->devname, strerror(errno));
                                return 1;
                        }
+                       remove_partitions(tfd);
                        if (array.not_persistent==0)
                                st->ss->load_super(st, tfd, &osuper, NULL);
                        /* will use osuper later */
@@ -341,7 +342,7 @@ int Manage_subdevs(char *devname, int fd,
                                }
 
                                /* need to find a sample superblock to copy, and
-                                * a spare slot to use 
+                                * a spare slot to use
                                 */
                                for (j=0; j<st->max_devs; j++) {
                                        char *dev;
@@ -361,7 +362,6 @@ int Manage_subdevs(char *devname, int fd,
                                                close(dfd);
                                                continue;
                                        }
-                                       remove_partitions(dfd);
                                        close(dfd);
                                        break;
                                }
@@ -373,7 +373,7 @@ int Manage_subdevs(char *devname, int fd,
                                 * and was temporarily removed, and is now being re-added.
                                 * If so, we can simply re-add it.
                                 */
-                               st->ss->uuid_from_super(duuid, dsuper);
+                               st->ss->uuid_from_super(st, duuid, dsuper);
 
                                /* re-add doesn't work for version-1 superblocks
                                 * before 2.6.18 :-(
@@ -382,19 +382,21 @@ int Manage_subdevs(char *devname, int fd,
                                    get_linux_version() <= 2006018)
                                        ;
                                else if (osuper) {
-                                       st->ss->uuid_from_super(ouuid, osuper);
+                                       st->ss->uuid_from_super(st, ouuid, osuper);
                                        if (memcmp(duuid, ouuid, sizeof(ouuid))==0) {
-                                               /* look close enough for now.  Kernel
-                                                * will worry about where a bitmap
-                                                * based reconstruct is possible
+                                               /* looks close enough for now.  Kernel
+                                                * will worry about whether a bitmap
+                                                * based reconstruction is possible.
                                                 */
                                                struct mdinfo mdi;
-                                               st->ss->getinfo_super(&mdi, osuper);
+                                               st->ss->getinfo_super(st, &mdi, osuper);
                                                disc.major = major(stb.st_rdev);
                                                disc.minor = minor(stb.st_rdev);
                                                disc.number = mdi.disk.number;
                                                disc.raid_disk = mdi.disk.raid_disk;
                                                disc.state = mdi.disk.state;
+                                               if (dv->writemostly)
+                                                       disc.state |= 1 << MD_DISK_WRITEMOSTLY;
                                                if (ioctl(fd, ADD_NEW_DISK, &disc) == 0) {
                                                        if (verbose >= 0)
                                                                fprintf(stderr, Name ": re-added %s\n", dv->devname);
@@ -434,7 +436,7 @@ int Manage_subdevs(char *devname, int fd,
                        if (array.not_persistent==0) {
                                if (dv->writemostly)
                                        disc.state |= 1 << MD_DISK_WRITEMOSTLY;
-                               st->ss->add_to_super(dsuper, &disc);
+                               st->ss->add_to_super(st, dsuper, &disc);
                                if (st->ss->write_init_super(st, dsuper, &disc, dv->devname))
                                        return 1;
                        } else if (dv->re_add) {
@@ -505,7 +507,7 @@ int Manage_subdevs(char *devname, int fd,
                }
        }
        return 0;
-       
+
 }
 
 int autodetect(void)