int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
{
}
-char *map_dev(int major, int minor)
+char *map_dev(int major, int minor, int create)
{
#if 0
fprintf(stderr, "Warning - fail to map %d,%d to a device name\n",
int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
{
- if ((stb->st_mode&S_IFMT)== S_IFBLK) {
- char *n = strdup(name);
- struct devmap *dm = malloc(sizeof(*dm));
- if (strncmp(n, "/dev/.", 6)==0)
- strcpy(n+4, name+6);
- if (dm) {
- dm->major = major(stb->st_rdev);
- dm->minor = minor(stb->st_rdev);
- dm->name = n;
- dm->next = devlist;
- devlist = dm;
+ struct stat st;
+ if (S_ISLNK(stb->st_mode)) {
+ stat(name, &st);
+ stb = &st;
}
- }
- return 0;
+
+ if ((stb->st_mode&S_IFMT)== S_IFBLK) {
+ char *n = strdup(name);
+ struct devmap *dm = malloc(sizeof(*dm));
+ if (strncmp(n, "/dev/./", 7)==0)
+ strcpy(n+4, name+6);
+ if (dm) {
+ dm->major = major(stb->st_rdev);
+ dm->minor = minor(stb->st_rdev);
+ dm->name = n;
+ dm->next = devlist;
+ devlist = dm;
+ }
+ }
+ return 0;
}
/*
* deliberately so prefer it over a standard name.
* This applies only to names for MD devices.
*/
-char *map_dev(int major, int minor)
+char *map_dev(int major, int minor, int create)
{
struct devmap *p;
char *std = NULL, *nonstd=NULL;
nonstd = p->name;
}
}
+ if (create && !std && !nonstd) {
+ static char buf[30];
+ snprintf(buf, 1024, "%d:%d", major, minor);
+ nonstd = buf;
+ }
+
return nonstd ? nonstd : std;
}
&& (stb.st_rdev == rdev))
return devname;
}
- dn = map_dev(major(rdev), minor(rdev));
+ dn = map_dev(major(rdev), minor(rdev), 0);
if (dn)
return dn;
snprintf(devname, sizeof(devname), "/dev/.tmp.md%d", dev);