]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - sysfs.c
util: make env checking more generic
[thirdparty/mdadm.git] / sysfs.c
diff --git a/sysfs.c b/sysfs.c
index 291a1dc3467b3ea2e165ac85e640db265e60fa74..00f42ea65722704c14b32e3e888b2a950ea09e83 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -61,8 +61,12 @@ int sysfs_open(int devnum, char *devname, char *attr)
 {
        char fname[50];
        int fd;
+       char *mdname = devnum2devname(devnum);
 
-       sprintf(fname, "/sys/block/%s/md/", devnum2devname(devnum));
+       if (!mdname)
+               return -1;
+
+       sprintf(fname, "/sys/block/%s/md/", mdname);
        if (devname) {
                strcat(fname, devname);
                strcat(fname, "/");
@@ -71,32 +75,28 @@ int sysfs_open(int devnum, char *devname, char *attr)
        fd = open(fname, O_RDWR);
        if (fd < 0 && errno == EACCES)
                fd = open(fname, O_RDONLY);
+       free(mdname);
        return fd;
 }
 
 void sysfs_init(struct mdinfo *mdi, int fd, int devnum)
 {
        if (fd >= 0) {
-               struct stat stb;
                mdu_version_t vers;
-               if (fstat(fd, &stb))
-                       return;
                if (ioctl(fd, RAID_VERSION, &vers) != 0)
                        return;
-               if (major(stb.st_rdev)==9)
-                       sprintf(mdi->sys_name, "md%d", (int)minor(stb.st_rdev));
-               else
-                       sprintf(mdi->sys_name, "md_d%d",
-                               (int)minor(stb.st_rdev)>>MdpMinorShift);
-       } else {
-               if (devnum >= 0)
-                       sprintf(mdi->sys_name, "md%d", devnum);
-               else
-                       sprintf(mdi->sys_name, "md_d%d",
-                               -1-devnum);
+               devnum = fd2devnum(fd);
        }
+       if (devnum == NoMdDev)
+               return;
+       if (devnum >= 0)
+               sprintf(mdi->sys_name, "md%d", devnum);
+       else
+               sprintf(mdi->sys_name, "md_d%d",
+                       -1-devnum);
 }
 
+
 struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options)
 {
        /* Longest possible name in sysfs, mounted at /sys, is
@@ -358,7 +358,7 @@ unsigned long long get_component_size(int fd)
        char fname[50];
        int n;
        if (fstat(fd, &stb)) return 0;
-       if (major(stb.st_rdev) == 9)
+       if (major(stb.st_rdev) != get_mdp_major())
                sprintf(fname, "/sys/block/md%d/md/component_size",
                        (int)minor(stb.st_rdev));
        else
@@ -436,9 +436,10 @@ int sysfs_set_safemode(struct mdinfo *sra, unsigned long ms)
        char delay[30];
 
        sec = ms / 1000;
-       msec = ms - (sec * 1000);
+       msec = ms % 1000;
 
-       sprintf(delay, "%ld.%ld", sec, msec);
+       sprintf(delay, "%ld.%03ld\n", sec, msec);
+       /*             this '\n' ^ needed for kernels older than 2.6.28 */
        return sysfs_set_str(sra, NULL, "safe_mode_delay", delay);
 }