sysfs: helper routine to retrieve the scsi id

imsm records this information in its metadata

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2008-06-13 17:27:30 -07:00
parent 90c8b70714
commit f1665f7200
2 changed files with 50 additions and 1 deletions

View File

@ -347,7 +347,7 @@ extern int sysfs_set_array(struct mdinfo *sra,
struct mdinfo *info);
extern int sysfs_add_disk(struct mdinfo *sra, struct mdinfo *sd);
extern int sysfs_disk_to_sg(int fd);
extern int sysfs_disk_to_scsi_id(int fd, __u32 *id);
extern int save_stripes(int *source, unsigned long long *offsets,

49
sysfs.c
View File

@ -464,3 +464,52 @@ int sysfs_disk_to_sg(int fd)
return -1;
}
int sysfs_disk_to_scsi_id(int fd, __u32 *id)
{
/* from an open block device, try to retrieve it scsi_id */
struct stat st;
char path[256];
char *c1, *c2;
DIR *dir;
struct dirent *de;
if (fstat(fd, &st))
return 1;
snprintf(path, sizeof(path), "/sys/dev/block/%d:%d/device",
major(st.st_rdev), minor(st.st_rdev));
dir = opendir(path);
if (!dir)
return 1;
de = readdir(dir);
while (de) {
if (strncmp("scsi_disk:", de->d_name,
strlen("scsi_disk:")) == 0)
break;
de = readdir(dir);
}
closedir(dir);
if (!de)
return 1;
c1 = strchr(de->d_name, ':');
c1++;
c2 = strchr(c1, ':');
*c2 = '\0';
*id = strtol(c1, NULL, 10) << 24; /* host */
c1 = c2 + 1;
c2 = strchr(c1, ':');
*c2 = '\0';
*id |= strtol(c1, NULL, 10) << 16; /* channel */
c1 = c2 + 1;
c2 = strchr(c1, ':');
*c2 = '\0';
*id |= strtol(c1, NULL, 10) << 8; /* lun */
c1 = c2 + 1;
*id |= strtol(c1, NULL, 10); /* id */
return 0;
}