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>
This commit is contained in:
NeilBrown 2013-08-01 14:32:04 +10:00
parent 879982efa9
commit bc17158dcc
3 changed files with 28 additions and 1 deletions

26
lib.c
View File

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

View File

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

View File

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