diff options
author | NeilBrown <neilb@suse.de> | 2013-08-01 14:32:04 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2013-08-01 14:32:04 +1000 |
commit | bc17158dcc9eac6eed4b84d1f41d1dcaa108cb9b (patch) | |
tree | 31d02887a1d5f157272385af8015efbb35c7ee5b | |
parent | 879982efa90c8cf6b7afc708316cf47c4247bfe3 (diff) |
Introduce devid2kname - slightly different to devid2devnm.
The purpose od devid2devnm is to return a kernel name of an
md device, whether that device is a whole device or a partition,
we want the whole device. md4, never md4p2.
In one place I was using devid2devnm where I really wanted the
partition if there was one ... and wasn't really interested in it
being an md device.
So introduce a new 'devid2kname' for that case.
Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r-- | lib.c | 26 | ||||
-rw-r--r-- | mdadm.h | 1 | ||||
-rw-r--r-- | sysfs.c | 2 |
3 files changed, 28 insertions, 1 deletions
@@ -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]; @@ -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); @@ -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); |