imsm: add devpath_to_char method
Add method for reading sysfs attributes and propagate it across IMSM code. Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
parent
7c798f8709
commit
fcebeb77b1
|
@ -239,6 +239,29 @@ __u16 devpath_to_vendor(const char *dev_path)
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Description: Read text value of dev_path/entry field
|
||||||
|
* Parameters:
|
||||||
|
* dev_path - sysfs path to the device
|
||||||
|
* entry - entry to be read
|
||||||
|
* buf - buffer for read value
|
||||||
|
* len - size of buf
|
||||||
|
* verbose - error logging level
|
||||||
|
*/
|
||||||
|
int devpath_to_char(const char *dev_path, const char *entry, char *buf, int len,
|
||||||
|
int verbose)
|
||||||
|
{
|
||||||
|
char path[PATH_MAX];
|
||||||
|
|
||||||
|
snprintf(path, sizeof(path), "%s/%s", dev_path, entry);
|
||||||
|
if (load_sys(path, buf, len)) {
|
||||||
|
if (verbose)
|
||||||
|
pr_err("Cannot read %s, aborting\n", path);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct sys_dev *find_intel_devices(void)
|
struct sys_dev *find_intel_devices(void)
|
||||||
{
|
{
|
||||||
struct sys_dev *ahci, *isci, *nvme;
|
struct sys_dev *ahci, *isci, *nvme;
|
||||||
|
|
|
@ -238,6 +238,8 @@ static inline char *guid_str(char *buf, struct efi_guid guid)
|
||||||
|
|
||||||
char *get_nvme_multipath_dev_hw_path(const char *dev_path);
|
char *get_nvme_multipath_dev_hw_path(const char *dev_path);
|
||||||
char *diskfd_to_devpath(int fd, int dev_level, char *buf);
|
char *diskfd_to_devpath(int fd, int dev_level, char *buf);
|
||||||
|
int devpath_to_char(const char *dev_path, const char *entry, char *buf,
|
||||||
|
int len, int verbose);
|
||||||
__u16 devpath_to_vendor(const char *dev_path);
|
__u16 devpath_to_vendor(const char *dev_path);
|
||||||
struct sys_dev *find_driver_devices(const char *bus, const char *driver);
|
struct sys_dev *find_driver_devices(const char *bus, const char *driver);
|
||||||
struct sys_dev *find_intel_devices(void);
|
struct sys_dev *find_intel_devices(void);
|
||||||
|
|
|
@ -2246,7 +2246,7 @@ static int ahci_enumerate_ports(const char *hba_path, int port_count, int host_b
|
||||||
char vendor[64];
|
char vendor[64];
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
int major, minor;
|
int major, minor;
|
||||||
char *device;
|
char device[PATH_MAX];
|
||||||
char *c;
|
char *c;
|
||||||
int port;
|
int port;
|
||||||
int type;
|
int type;
|
||||||
|
@ -2262,20 +2262,15 @@ static int ahci_enumerate_ports(const char *hba_path, int port_count, int host_b
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* retrieve the scsi device type */
|
/* retrieve the scsi device */
|
||||||
if (asprintf(&device, "/sys/dev/block/%d:%d/device/xxxxxxx", major, minor) < 0) {
|
if (!devt_to_devpath(makedev(major, minor), 1, device)) {
|
||||||
if (verbose > 0)
|
if (verbose > 0)
|
||||||
pr_err("failed to allocate 'device'\n");
|
pr_err("failed to get device\n");
|
||||||
err = 2;
|
err = 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sprintf(device, "/sys/dev/block/%d:%d/device/type", major, minor);
|
if (devpath_to_char(device, "type", buf, sizeof(buf), 0)) {
|
||||||
if (load_sys(device, buf, sizeof(buf)) != 0) {
|
|
||||||
if (verbose > 0)
|
|
||||||
pr_err("failed to read device type for %s\n",
|
|
||||||
path);
|
|
||||||
err = 2;
|
err = 2;
|
||||||
free(device);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
type = strtoul(buf, NULL, 10);
|
type = strtoul(buf, NULL, 10);
|
||||||
|
@ -2284,8 +2279,9 @@ static int ahci_enumerate_ports(const char *hba_path, int port_count, int host_b
|
||||||
if (!(type == 0 || type == 7 || type == 14)) {
|
if (!(type == 0 || type == 7 || type == 14)) {
|
||||||
vendor[0] = '\0';
|
vendor[0] = '\0';
|
||||||
model[0] = '\0';
|
model[0] = '\0';
|
||||||
sprintf(device, "/sys/dev/block/%d:%d/device/vendor", major, minor);
|
|
||||||
if (load_sys(device, buf, sizeof(buf)) == 0) {
|
if (devpath_to_char(device, "vendor", buf,
|
||||||
|
sizeof(buf), 0) == 0) {
|
||||||
strncpy(vendor, buf, sizeof(vendor));
|
strncpy(vendor, buf, sizeof(vendor));
|
||||||
vendor[sizeof(vendor) - 1] = '\0';
|
vendor[sizeof(vendor) - 1] = '\0';
|
||||||
c = (char *) &vendor[sizeof(vendor) - 1];
|
c = (char *) &vendor[sizeof(vendor) - 1];
|
||||||
|
@ -2293,8 +2289,9 @@ static int ahci_enumerate_ports(const char *hba_path, int port_count, int host_b
|
||||||
*c-- = '\0';
|
*c-- = '\0';
|
||||||
|
|
||||||
}
|
}
|
||||||
sprintf(device, "/sys/dev/block/%d:%d/device/model", major, minor);
|
|
||||||
if (load_sys(device, buf, sizeof(buf)) == 0) {
|
if (devpath_to_char(device, "model", buf,
|
||||||
|
sizeof(buf), 0) == 0) {
|
||||||
strncpy(model, buf, sizeof(model));
|
strncpy(model, buf, sizeof(model));
|
||||||
model[sizeof(model) - 1] = '\0';
|
model[sizeof(model) - 1] = '\0';
|
||||||
c = (char *) &model[sizeof(model) - 1];
|
c = (char *) &model[sizeof(model) - 1];
|
||||||
|
@ -2319,7 +2316,6 @@ static int ahci_enumerate_ports(const char *hba_path, int port_count, int host_b
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
free(device);
|
|
||||||
|
|
||||||
/* chop device path to 'host%d' and calculate the port number */
|
/* chop device path to 'host%d' and calculate the port number */
|
||||||
c = strchr(&path[hba_len], '/');
|
c = strchr(&path[hba_len], '/');
|
||||||
|
@ -4026,7 +4022,7 @@ static void fd2devname(int fd, char *name)
|
||||||
|
|
||||||
static int nvme_get_serial(int fd, void *buf, size_t buf_len)
|
static int nvme_get_serial(int fd, void *buf, size_t buf_len)
|
||||||
{
|
{
|
||||||
char path[60];
|
char path[PATH_MAX];
|
||||||
char *name = fd2kname(fd);
|
char *name = fd2kname(fd);
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
|
@ -4035,9 +4031,10 @@ static int nvme_get_serial(int fd, void *buf, size_t buf_len)
|
||||||
if (strncmp(name, "nvme", 4) != 0)
|
if (strncmp(name, "nvme", 4) != 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
snprintf(path, sizeof(path) - 1, "/sys/block/%s/device/serial", name);
|
if (!diskfd_to_devpath(fd, 1, path))
|
||||||
|
return 1;
|
||||||
|
|
||||||
return load_sys(path, buf, buf_len);
|
return devpath_to_char(path, "serial", buf, buf_len, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int scsi_get_serial(int fd, void *buf, size_t buf_len);
|
extern int scsi_get_serial(int fd, void *buf, size_t buf_len);
|
||||||
|
|
Loading…
Reference in New Issue