]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
sysfs: Use the presence of /sys/block/<dev>/md as indicator of valid device
authorJes Sorensen <Jes.Sorensen@gmail.com>
Thu, 30 Mar 2017 20:02:36 +0000 (16:02 -0400)
committerJes Sorensen <Jes.Sorensen@gmail.com>
Thu, 30 Mar 2017 20:02:36 +0000 (16:02 -0400)
Rather than calling ioctl(RAID_VERSION), use the presence of
/sys/block/<dev>/md as indicator of the device being valid and sysfs
being active for it. The ioctl could return valid data, but sysfs
not mounted, which renders sysfs_init() useless anyway.

Signed-off-by: Jes Sorensen <Jes.Sorensen@gmail.com>
sysfs.c

diff --git a/sysfs.c b/sysfs.c
index 2a91ba0a90cff185f8b29a36d721c974ea40052e..93ec3de826c1c491c9f92a6255667683b025c66d 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -86,15 +86,22 @@ void sysfs_init_dev(struct mdinfo *mdi, unsigned long devid)
 
 void sysfs_init(struct mdinfo *mdi, int fd, char *devnm)
 {
 
 void sysfs_init(struct mdinfo *mdi, int fd, char *devnm)
 {
+       struct stat stb;
+       char fname[MAX_SYSFS_PATH_LEN];
+
        mdi->sys_name[0] = 0;
        mdi->sys_name[0] = 0;
-       if (fd >= 0) {
-               mdu_version_t vers;
-               if (ioctl(fd, RAID_VERSION, &vers) != 0)
-                       return;
+       if (fd >= 0)
                devnm = fd2devnm(fd);
                devnm = fd2devnm(fd);
-       }
+
        if (devnm == NULL)
                return;
        if (devnm == NULL)
                return;
+
+       snprintf(fname, MAX_SYSFS_PATH_LEN, "/sys/block/%s/md", devnm);
+
+       if (stat(fname, &stb))
+               return;
+       if (!S_ISDIR(stb.st_mode))
+               return;
        strcpy(mdi->sys_name, devnm);
 }
 
        strcpy(mdi->sys_name, devnm);
 }