]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Honor safemode_delay at Create() and Incremental() time
authorDan Williams <dan.j.williams@intel.com>
Tue, 16 Sep 2008 03:58:42 +0000 (20:58 -0700)
committerDan Williams <dan.j.williams@intel.com>
Tue, 16 Sep 2008 03:58:42 +0000 (20:58 -0700)
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Create.c
Incremental.c
mdadm.h
sysfs.c

index 9058af1837bef34de8dc0ec776174bfb8c6c689f..c9c64b845aff4e7c447bd9404314e6055970820d 100644 (file)
--- a/Create.c
+++ b/Create.c
@@ -78,6 +78,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
        struct mdinfo *sra;
        struct mdinfo info, *infos;
        int did_default = 0;
+       unsigned long safe_mode_delay = 0;
 
        int major_num = BITMAP_MAJOR_HI;
 
@@ -703,6 +704,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                                st->ss->add_to_super(st, &inf->disk,
                                                     fd, dv->devname);
                                st->ss->getinfo_super(st, inf);
+                               safe_mode_delay = inf->safe_mode_delay;
 
                                /* getinfo_super might have lost these ... */
                                inf->disk.major = major(stb.st_rdev);
@@ -757,6 +759,7 @@ int Create(struct supertype *st, char *mddev, int mdfd,
                                              "readonly");
                                break;
                        }
+                       sysfs_set_safemode(sra, safe_mode_delay);
                } else {
                        mdu_param_t param;
                        if (ioctl(mdfd, RUN_ARRAY, &param)) {
index 9b22220604fc463f9fbba2ebc7fb493ac7d41ac7..6f21a63e3767aa3dae9a8e48e19d6897c9876e30 100644 (file)
@@ -841,6 +841,7 @@ int Incremental_container(struct supertype *st, char *devname, int verbose,
                                ping_monitor(devnum2devname(st->container_dev));
                                break;
                        }
+                       sysfs_set_safemode(sra, ra->safe_mode_delay);
                        if (verbose >= 0)
                                printf("Started %s with %d devices\n",
                                       chosen_name, working);
diff --git a/mdadm.h b/mdadm.h
index 3d31576a8eb5147523283be2b0e400f5526f3d6c..3eee61a5adad7de5fc7e32d313c0421a5d911a78 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -346,6 +346,7 @@ extern int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
                         char *name, unsigned long long val);
 extern int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
                        char *name, unsigned long long *val);
+extern int sysfs_set_safemode(struct mdinfo *sra, unsigned long ms);
 extern int sysfs_set_array(struct mdinfo *sra,
                           struct mdinfo *info);
 extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd);
diff --git a/sysfs.c b/sysfs.c
index 7ca40c3ada149df49ce873caf9fdb074f837105e..dced322f7a3d36669b065832065ccad101c52a0b 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -346,6 +346,19 @@ int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
        return 0;
 }
 
+int sysfs_set_safemode(struct mdinfo *sra, unsigned long ms)
+{
+       unsigned long sec;
+       unsigned long msec;
+       char delay[30];
+
+       sec = ms / 1000;
+       msec = ms - (sec * 1000);
+
+       sprintf(delay, "%ld.%ld", sec, msec);
+       return sysfs_set_str(sra, NULL, "safe_mode_delay", delay);
+}
+
 int sysfs_set_array(struct mdinfo *sra,
                    struct mdinfo *info)
 {