]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - sysfs.c
tests/06name: adjust for homehost
[thirdparty/mdadm.git] / sysfs.c
diff --git a/sysfs.c b/sysfs.c
index 8bcdaa59cbac61f093025f4aea876bf2c7815844..b9fd3da95d37a80bb303583cf4bf0eb78ebf34e2 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -81,50 +81,23 @@ int sysfs_open(int devnum, char *devname, char *attr)
 
 void sysfs_init(struct mdinfo *mdi, int fd, int devnum)
 {
+       mdi->sys_name[0] = 0;
        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) == MD_MAJOR)
-                       sprintf(mdi->sys_name, "md%d", (int)minor(stb.st_rdev));
-               else if (major(stb.st_rdev) == get_mdp_major())
-                       sprintf(mdi->sys_name, "md_d%d",
-                               (int)minor(stb.st_rdev)>>MdpMinorShift);
-               else {
-                       /* must be an extended-minor partition. Look at the
-                        * /sys/dev/block/%d:%d link which must look like
-                        * ../../block/mdXXX/mdXXXpYY
-                        */
-                       char path[30];
-                       char link[200];
-                       char *cp;
-                       int n;
-                       sprintf(path, "/sys/dev/block/%d:%d", major(stb.st_rdev),
-                               minor(stb.st_rdev));
-                       n = readlink(path, link, sizeof(link)-1);
-                       if (n <= 0)
-                               return;
-                       link[n] = 0;
-                       cp = strrchr(link, '/');
-                       if (cp) *cp = 0;
-                       cp = strchr(link, '/');
-                       if (cp && strncmp(cp, "/md", 3) == 0)
-                               strcpy(mdi->sys_name, cp+1);
-                       else
-                               return;
-               }
-       } 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
@@ -146,6 +119,10 @@ struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options)
                return sra;
        memset(sra, 0, sizeof(*sra));
        sysfs_init(sra, fd, devnum);
+       if (sra->sys_name[0] == 0) {
+               free(sra);
+               return NULL;
+       }
 
        sprintf(fname, "/sys/block/%s/md/", sra->sys_name);
        base = fname + strlen(fname);
@@ -433,6 +410,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)
 {