From: Milan Broz Date: Thu, 22 Dec 2022 22:18:38 +0000 (+0100) Subject: lsblk: read firmware revision from udev X-Git-Tag: v2.39-rc1~355^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8e89dd8bacbd110cd6fea9baab176993fe5270b9;p=thirdparty%2Futil-linux.git lsblk: read firmware revision from udev This supports more device types like NVMEs. Signed-off-by: Milan Broz --- diff --git a/misc-utils/lsblk-properties.c b/misc-utils/lsblk-properties.c index 8acaad7a81..dc6f2896c9 100644 --- a/misc-utils/lsblk-properties.c +++ b/misc-utils/lsblk-properties.c @@ -38,6 +38,7 @@ void lsblk_device_free_properties(struct lsblk_devprop *p) free(p->model); free(p->partflags); free(p->idlink); + free(p->revision); free(p->mode); 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); } + 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"))) { prop->model = xstrdup(data); 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_SERIAL_SHORT", &prop->serial)) ; else if (lookup(buf, "ID_SERIAL", &prop->serial)) ; + else if (lookup(buf, "ID_REVISION", &prop->revision)) ; /* lsblk specific */ else if (lookup(buf, "MODE", &prop->mode)) ; diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c index ea06afcd10..bcd6441b0d 100644 --- a/misc-utils/lsblk.c +++ b/misc-utils/lsblk.c @@ -1013,8 +1013,13 @@ static char *device_get_data( } break; case COL_REV: - if (!device_is_partition(dev) && dev->nslaves == 0) - ul_path_read_string(dev->sysfs, &str, "device/rev"); + if (!device_is_partition(dev) && dev->nslaves == 0) { + 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; case COL_VENDOR: if (!device_is_partition(dev) && dev->nslaves == 0) diff --git a/misc-utils/lsblk.h b/misc-utils/lsblk.h index c00723f1ae..e3e89e2860 100644 --- a/misc-utils/lsblk.h +++ b/misc-utils/lsblk.h @@ -79,6 +79,7 @@ struct lsblk_devprop { char *serial; /* disk serial number */ char *model; /* disk model */ char *idlink; /* /dev/disk/by-id/ */ + char *revision; /* firmware revision/version */ /* lsblk specific (for --sysroot only) */ char *owner; /* user name */