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>
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];
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);
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);