imsm: debug environment variable to use 'device name' as 'serial number'

Facilitate using loopback devices for the imsm regression suite

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2008-07-24 17:26:23 -07:00
parent e9d82038f8
commit 0030e8d690
1 changed files with 46 additions and 3 deletions

View File

@ -167,6 +167,17 @@ struct imsm_update_create_array {
int dev_idx;
};
static int imsm_env_devname_as_serial(void)
{
char *val = getenv("IMSM_DEVNAME_AS_SERIAL");
if (val && atoi(val) == 1)
return 1;
return 0;
}
static struct supertype *match_metadata_desc_imsm(char *arg)
{
struct supertype *st;
@ -668,6 +679,31 @@ static int compare_super_imsm(struct supertype *st, struct supertype *tst)
return 0;
}
static void fd2devname(int fd, char *name)
{
struct stat st;
char path[256];
char dname[100];
char *nm;
int rv;
name[0] = '\0';
if (fstat(fd, &st) != 0)
return;
sprintf(path, "/sys/dev/block/%d:%d",
major(st.st_rdev), minor(st.st_rdev));
rv = readlink(path, dname, sizeof(dname));
if (rv <= 0)
return;
dname[rv] = '\0';
nm = strrchr(dname, '/');
nm++;
snprintf(name, MAX_RAID_SERIAL_LEN, "/dev/%s", nm);
}
extern int scsi_get_serial(int fd, void *buf, size_t buf_len);
static int imsm_read_serial(int fd, char *devname,
@ -690,6 +726,14 @@ static int imsm_read_serial(int fd, char *devname,
return 1;
}
if (imsm_env_devname_as_serial()) {
char name[MAX_RAID_SERIAL_LEN];
fd2devname(fd, name);
strcpy((char *) serial, name);
return 0;
}
rv = scsi_get_serial(sg_fd, scsi_serial, sizeof(scsi_serial));
close(sg_fd);
@ -1271,9 +1315,8 @@ static void add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
rv = imsm_read_serial(fd, devname, dd->serial);
if (rv) {
fprintf(stderr,
Name ": failed to retrieve scsi serial "
"using \'%s\' instead\n", devname);
strcpy((char *) dd->serial, devname);
Name ": failed to retrieve scsi serial, aborting\n");
abort();
}
if (mpb->num_disks <= dk->number)