]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - sysfs.c
DDF: fix irregularities with retrieval of 'name' from metadata.
[thirdparty/mdadm.git] / sysfs.c
diff --git a/sysfs.c b/sysfs.c
index 58c84e26339e8014027bcea6d722bf87b73b4030..7f94d5567d95ce2ae036a8595f3104d5b3eb867c 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -82,26 +82,21 @@ int sysfs_open(int devnum, char *devname, char *attr)
 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
@@ -363,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
@@ -410,6 +405,22 @@ int sysfs_set_num(struct mdinfo *sra, struct mdinfo *dev,
        return sysfs_set_str(sra, dev, name, valstr);
 }
 
+int sysfs_uevent(struct mdinfo *sra, char *event)
+{
+       char fname[50];
+       int n;
+       int fd;
+
+       sprintf(fname, "/sys/block/%s/uevent",
+               sra->sys_name);
+       fd = open(fname, O_WRONLY);
+       if (fd < 0)
+               return -1;
+       n = write(fd, event, strlen(event));
+       close(fd);
+       return 0;
+}      
+
 int sysfs_get_ll(struct mdinfo *sra, struct mdinfo *dev,
                       char *name, unsigned long long *val)
 {