lsblk: read firmware revision from udev

This supports more device types like NVMEs.

Signed-off-by: Milan Broz <gmazyland@gmail.com>
This commit is contained in:
Milan Broz 2022-12-22 23:18:38 +01:00
parent 0dfba752af
commit 8e89dd8bac
3 changed files with 13 additions and 2 deletions

View file

@ -38,6 +38,7 @@ void lsblk_device_free_properties(struct lsblk_devprop *p)
free(p->model); free(p->model);
free(p->partflags); free(p->partflags);
free(p->idlink); free(p->idlink);
free(p->revision);
free(p->mode); free(p->mode);
free(p->owner); free(p->owner);
@ -130,6 +131,9 @@ static struct lsblk_devprop *get_properties_by_udev(struct lsblk_device *ld)
normalize_whitespace((unsigned char *) prop->serial); normalize_whitespace((unsigned char *) prop->serial);
} }
if ((data = udev_device_get_property_value(dev, "ID_REVISION")))
prop->revision = xstrdup(data);
if ((data = udev_device_get_property_value(dev, "ID_MODEL_ENC"))) { if ((data = udev_device_get_property_value(dev, "ID_MODEL_ENC"))) {
prop->model = xstrdup(data); prop->model = xstrdup(data);
unhexmangle_string(prop->model); unhexmangle_string(prop->model);
@ -254,6 +258,7 @@ static struct lsblk_devprop *get_properties_by_file(struct lsblk_device *ld)
else if (lookup(buf, "ID_SCSI_SERIAL", &prop->serial)) ; else if (lookup(buf, "ID_SCSI_SERIAL", &prop->serial)) ;
else if (lookup(buf, "ID_SERIAL_SHORT", &prop->serial)) ; else if (lookup(buf, "ID_SERIAL_SHORT", &prop->serial)) ;
else if (lookup(buf, "ID_SERIAL", &prop->serial)) ; else if (lookup(buf, "ID_SERIAL", &prop->serial)) ;
else if (lookup(buf, "ID_REVISION", &prop->revision)) ;
/* lsblk specific */ /* lsblk specific */
else if (lookup(buf, "MODE", &prop->mode)) ; else if (lookup(buf, "MODE", &prop->mode)) ;

View file

@ -1013,8 +1013,13 @@ static char *device_get_data(
} }
break; break;
case COL_REV: case COL_REV:
if (!device_is_partition(dev) && dev->nslaves == 0) if (!device_is_partition(dev) && dev->nslaves == 0) {
ul_path_read_string(dev->sysfs, &str, "device/rev"); prop = lsblk_device_get_properties(dev);
if (prop && prop->revision)
str = xstrdup(prop->revision);
else
ul_path_read_string(dev->sysfs, &str, "device/rev");
}
break; break;
case COL_VENDOR: case COL_VENDOR:
if (!device_is_partition(dev) && dev->nslaves == 0) if (!device_is_partition(dev) && dev->nslaves == 0)

View file

@ -79,6 +79,7 @@ struct lsblk_devprop {
char *serial; /* disk serial number */ char *serial; /* disk serial number */
char *model; /* disk model */ char *model; /* disk model */
char *idlink; /* /dev/disk/by-id/<name> */ char *idlink; /* /dev/disk/by-id/<name> */
char *revision; /* firmware revision/version */
/* lsblk specific (for --sysroot only) */ /* lsblk specific (for --sysroot only) */
char *owner; /* user name */ char *owner; /* user name */