summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib.c26
-rw-r--r--mdadm.h1
-rw-r--r--sysfs.c2
3 files changed, 28 insertions, 1 deletions
diff --git a/lib.c b/lib.c
index 8285f346..6808f62d 100644
--- a/lib.c
+++ b/lib.c
@@ -58,6 +58,32 @@ static int mdp_major = -1;
return mdp_major;
}
+char *devid2kname(int devid)
+{
+ char path[30];
+ char link[200];
+ static char devnm[32];
+ char *cp;
+ int n;
+
+ /* Look at the
+ * /sys/dev/block/%d:%d link which must look like
+ * and take the last component.
+ */
+ sprintf(path, "/sys/dev/block/%d:%d", major(devid),
+ minor(devid));
+ n = readlink(path, link, sizeof(link)-1);
+ if (n > 0) {
+ link[n] = 0;
+ cp = strrchr(link, '/');
+ if (cp) {
+ strcpy(devnm, cp+1);
+ return devnm;
+ }
+ }
+ return NULL;
+}
+
char *devid2devnm(int devid)
{
char path[30];
diff --git a/mdadm.h b/mdadm.h
index 5463bfba..c5d9c301 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1349,6 +1349,7 @@ extern void print_r10_layout(int layout);
extern char *find_free_devnm(int use_partitions);
extern void put_md_name(char *name);
+extern char *devid2kname(int devid);
extern char *devid2devnm(int devid);
extern int devnm2devid(char *devnm);
extern char *get_md_name(char *devnm);
diff --git a/sysfs.c b/sysfs.c
index 13558c5f..9a1d8569 100644
--- a/sysfs.c
+++ b/sysfs.c
@@ -682,7 +682,7 @@ int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd, int resume)
return rv;
memset(nm, 0, sizeof(nm));
- dname = devid2devnm(makedev(sd->disk.major, sd->disk.minor));
+ dname = devid2kname(makedev(sd->disk.major, sd->disk.minor));
strcpy(sd->sys_name, "dev-");
strcpy(sd->sys_name+4, dname);