]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - misc-utils/lsblk.c
Update email.
[thirdparty/util-linux.git] / misc-utils / lsblk.c
index d9c4ee982595de9f3ca20f43bf4008a678fa73dd..99a966bdd5f25d9bd07863da20939282429d71ad 100644 (file)
@@ -2,7 +2,7 @@
  * lsblk(8) - list block devices
  *
  * Copyright (C) 2010-2018 Red Hat, Inc. All rights reserved.
- * Written by Milan Broz <mbroz@redhat.com>
+ * Written by Milan Broz <gmazyland@gmail.com>
  *            Karel Zak <kzak@redhat.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -71,6 +71,7 @@ enum {
        COL_DALIGN,
        COL_DAX,
        COL_DGRAN,
+       COL_DISKSEQ,
        COL_DMAX,
        COL_DZERO,
        COL_FSAVAIL,
@@ -96,6 +97,7 @@ enum {
        COL_OWNER,
        COL_PARTFLAGS,
        COL_PARTLABEL,
+       COL_PARTN,
        COL_PARTTYPE,
        COL_PARTTYPENAME,
        COL_PARTUUID,
@@ -171,6 +173,7 @@ static struct colinfo infos[] = {
        [COL_DALIGN] = { "DISC-ALN", 6, SCOLS_FL_RIGHT, N_("discard alignment offset"), COLTYPE_NUM },
        [COL_DAX] = { "DAX", 1, SCOLS_FL_RIGHT, N_("dax-capable device"), COLTYPE_BOOL },
        [COL_DGRAN] = { "DISC-GRAN", 6, SCOLS_FL_RIGHT, N_("discard granularity"), COLTYPE_SIZE },
+       [COL_DISKSEQ] = { "DISK-SEQ", 1, SCOLS_FL_RIGHT, N_("disk sequence number"), COLTYPE_NUM },
        [COL_DMAX] = { "DISC-MAX", 6, SCOLS_FL_RIGHT, N_("discard max bytes"), COLTYPE_SIZE },
        [COL_DZERO] = { "DISC-ZERO", 1, SCOLS_FL_RIGHT, N_("discard zeroes data"), COLTYPE_BOOL },
        [COL_FSAVAIL] = { "FSAVAIL", 5, SCOLS_FL_RIGHT, N_("filesystem size available"), COLTYPE_SIZE },
@@ -196,6 +199,7 @@ static struct colinfo infos[] = {
        [COL_OWNER] = { "OWNER", 0.1, SCOLS_FL_TRUNC, N_("user name"), },
        [COL_PARTFLAGS] = { "PARTFLAGS", 36,  0, N_("partition flags") },
        [COL_PARTLABEL] = { "PARTLABEL", 0.1, 0, N_("partition LABEL") },
+       [COL_PARTN] = { "PARTN", 2, SCOLS_FL_RIGHT, N_("partition number as read from the partition table"), COLTYPE_NUM },
        [COL_PARTTYPENAME]  = { "PARTTYPENAME",  0.1,  0, N_("partition type name") },
        [COL_PARTTYPE] = { "PARTTYPE", 36,  0, N_("partition type code or UUID") },
        [COL_PARTUUID] = { "PARTUUID", 36,  0, N_("partition UUID") },
@@ -217,8 +221,8 @@ static struct colinfo infos[] = {
        [COL_START] = { "START", 5, SCOLS_FL_RIGHT, N_("partition start offset"), COLTYPE_NUM },
        [COL_STATE] = { "STATE", 7, SCOLS_FL_TRUNC, N_("state of the device") },
        [COL_SUBSYS] = { "SUBSYSTEMS", 0.1, SCOLS_FL_NOEXTREMES, N_("de-duplicated chain of subsystems") },
-       [COL_TARGETS] = { "MOUNTPOINTS", 0.10, SCOLS_FL_WRAP,  N_("all locations where device is mounted") },
-       [COL_TARGET] = { "MOUNTPOINT", 0.10, SCOLS_FL_TRUNC, N_("where the device is mounted") },
+       [COL_TARGETS] = { "MOUNTPOINTS", 0.10, SCOLS_FL_WRAP | SCOLS_FL_NOEXTREMES,  N_("all locations where device is mounted") },
+       [COL_TARGET] = { "MOUNTPOINT", 0.10, SCOLS_FL_TRUNC | SCOLS_FL_NOEXTREMES, N_("where the device is mounted") },
        [COL_TRANSPORT] = { "TRAN", 6, 0, N_("device transport type") },
        [COL_TYPE] = { "TYPE", 4, 0, N_("device type") },
        [COL_UUID] = { "UUID", 36,  0, N_("filesystem UUID") },
@@ -467,7 +471,7 @@ static char *get_type(struct lsblk_device *dev)
 }
 
 /* Thanks to lsscsi code for idea of detection logic used here */
-static char *get_transport(struct lsblk_device *dev)
+static const char *get_transport(struct lsblk_device *dev)
 {
        struct path_cxt *sysfs = dev->sysfs;
        char *attr = NULL;
@@ -521,7 +525,7 @@ static char *get_transport(struct lsblk_device *dev)
        } else if (strncmp(dev->name, "vd", 2) == 0)
                trans = "virtio";
 
-       return trans ? xstrdup(trans) : NULL;
+       return trans;
 }
 
 static char *get_subsystems(struct lsblk_device *dev)
@@ -750,28 +754,17 @@ static void device_read_bytes(struct lsblk_device *dev, char *path, char **str,
 
 static void process_mq(struct lsblk_device *dev, char **str)
 {
-       DIR *dir;
-       struct dirent *d;
        unsigned int queues = 0;
 
        DBG(DEV, ul_debugobj(dev, "%s: process mq", dev->name));
 
-       dir = ul_path_opendir(dev->sysfs, "mq");
-       if (!dir) {
+       queues = ul_path_count_dirents(dev->sysfs, "mq");
+       if (!queues) {
                *str = xstrdup("1");
                DBG(DEV, ul_debugobj(dev, "%s: no mq supported, use a single queue", dev->name));
                return;
        }
 
-       while ((d = xreaddir(dir))) {
-               if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
-                       continue;
-
-               queues++;
-       }
-
-       closedir(dir);
-
        DBG(DEV, ul_debugobj(dev, "%s: has %d queues", dev->name, queues));
        xasprintf(str, "%3u", queues);
 }
@@ -958,6 +951,11 @@ static char *device_get_data(
                if (prop && prop->partflags)
                        str = xstrdup(prop->partflags);
                break;
+       case COL_PARTN:
+               prop = lsblk_device_get_properties(dev);
+               if (prop && prop->partn)
+                       str = xstrdup(prop->partn);
+               break;
        case COL_WWN:
                prop = lsblk_device_get_properties(dev);
                if (prop && prop->wwn)
@@ -1015,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)
@@ -1088,8 +1091,12 @@ static char *device_get_data(
                break;
        }
        case COL_TRANSPORT:
-               str = get_transport(dev);
+       {
+               const char *trans = get_transport(dev);
+               if (trans)
+                       str = xstrdup(trans);
                break;
+       }
        case COL_SUBSYS:
                str = get_subsystems(dev);
                break;
@@ -1176,6 +1183,11 @@ static char *device_get_data(
        case COL_MQ:
                process_mq(dev, &str);
                break;
+       case COL_DISKSEQ:
+               ul_path_read_string(dev->sysfs, &str, "diskseq");
+               if (sortdata)
+                       str2u64(str, sortdata);
+               break;
        };
 
        return str;
@@ -1386,7 +1398,7 @@ static int initialize_device(struct lsblk_device *dev,
 
        /* ignore non-NVMe devices */
        if (lsblk->nvme) {
-               char *transport = get_transport(dev);
+               const char *transport = get_transport(dev);
 
                if (!transport || strcmp(transport, "nvme")) {
                        DBG(DEV, ul_debugobj(dev, "non-nvme device -- ignore"));
@@ -1396,7 +1408,7 @@ static int initialize_device(struct lsblk_device *dev,
 
        /* ignore non-virtio devices */
        if (lsblk->virtio) {
-               char *transport = get_transport(dev);
+               const char *transport = get_transport(dev);
 
                if (!transport || strcmp(transport, "virtio")) {
                        DBG(DEV, ul_debugobj(dev, "non-virtio device -- ignore"));
@@ -2231,8 +2243,10 @@ int main(int argc, char *argv[])
                        add_uniq_column(COL_TYPE);
                        add_uniq_column(COL_MODEL);
                        add_uniq_column(COL_SERIAL);
+                       add_uniq_column(COL_REV);
                        add_uniq_column(COL_TRANSPORT);
                        add_uniq_column(COL_RQ_SIZE);
+                       add_uniq_column(COL_MQ);
                        break;
                case 'v':
                        lsblk->nodeps = 1;
@@ -2242,6 +2256,7 @@ int main(int argc, char *argv[])
                        add_uniq_column(COL_TRANSPORT);
                        add_uniq_column(COL_SIZE);
                        add_uniq_column(COL_RQ_SIZE);
+                       add_uniq_column(COL_MQ);
                        break;
                case 'T':
                        force_tree = 1;