]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsblk: read queue/discard_granularity only when necessary
authorKarel Zak <kzak@redhat.com>
Wed, 17 Oct 2018 12:10:27 +0000 (14:10 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 7 Dec 2018 11:32:58 +0000 (12:32 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
misc-utils/lsblk-devtree.c
misc-utils/lsblk.c
misc-utils/lsblk.h

index efc165f54a84765348d7199973c8819be0bd38b3..9a6dba0e18ba3cca7da0758801ba98ef4c5f0c28 100644 (file)
@@ -22,6 +22,7 @@ struct lsblk_device *lsblk_new_device(struct lsblk_devtree *tree)
 
        dev->refcount = 1;
        dev->removable = -1;
+       dev->discard_granularity = (uint64_t) -1;
        dev->tree = tree;
 
         INIT_LIST_HEAD(&dev->deps);
index aacc0e560506127dc9b2061d8c47533e84d2e4de..46f8f3260b93741d8a014407c2fb297e677c9374 100644 (file)
@@ -702,6 +702,17 @@ done:
        return dev->removable;
 }
 
+static uint64_t device_get_discard_granularity(struct lsblk_device *dev)
+{
+       if (dev->discard_granularity == (uint64_t) -1
+           && ul_path_read_u64(dev->sysfs, &dev->discard_granularity,
+                               "queue/discard_granularity") != 0)
+               dev->discard_granularity = 0;
+
+       return dev->discard_granularity;
+}
+
+
 /*
  * Generates data (string) for column specified by column ID for specified device
  */
@@ -941,7 +952,7 @@ static void set_scols_data(
                str = get_subsystems(dev);
                break;
        case COL_DALIGN:
-               if (dev->discard)
+               if (device_get_discard_granularity(dev) > 0)
                        ul_path_read_string(dev->sysfs, &str, "discard_alignment");
                if (!str)
                        str = xstrdup("0");
@@ -954,12 +965,10 @@ static void set_scols_data(
                        if (sort)
                                set_sortdata_u64_from_string(ln, col, str);
                } else {
-                       uint64_t x;
-                       if (ul_path_read_u64(dev->sysfs, &x, "queue/discard_granularity") == 0) {
-                               str = size_to_human_string(SIZE_SUFFIX_1LETTER, x);
-                               if (sort)
-                                       set_sortdata_u64(ln, col, x);
-                       }
+                       uint64_t x = device_get_discard_granularity(dev);
+                       str = size_to_human_string(SIZE_SUFFIX_1LETTER, x);
+                       if (sort)
+                               set_sortdata_u64(ln, col, x);
                }
                break;
        case COL_DMAX:
@@ -977,7 +986,7 @@ static void set_scols_data(
                }
                break;
        case COL_DZERO:
-               if (dev->discard)
+               if (device_get_discard_granularity(dev) > 0)
                        ul_path_read_string(dev->sysfs, &str, "queue/discard_zeroes_data");
                if (!str)
                        str = xstrdup("0");
@@ -1095,10 +1104,6 @@ static int initialize_device(struct lsblk_device *dev,
        if (ul_path_read_u64(dev->sysfs, &dev->size, "size") == 0)      /* in sectors */
                dev->size <<= 9;                                        /* in bytes */
 
-       if (ul_path_read_s32(dev->sysfs, &dev->discard,
-                          "queue/discard_granularity") != 0)
-               dev->discard = 0;
-
        /* Ignore devices of zero size */
        if (!lsblk->all_devices && dev->size == 0) {
                DBG(DEV, ul_debugobj(dev, "zero size device -- ignore"));
index 7cb4e3eeef572f684bb2bfd9247fd9afca5d5dd5..6cba502cff5a9d10bfe9ce72ab83bab0b3e850da 100644 (file)
@@ -106,7 +106,8 @@ struct lsblk_device {
                                 * /sys/block/.../holders */
        int nslaves;            /* # of devices this device maps to */
        int maj, min;           /* devno */
-       int discard;            /* supports discard */
+
+       uint64_t discard_granularity;   /* sunknown:-1, yes:1, not:0 */
 
        uint64_t size;          /* device size */
        int removable;          /* unknown:-1, yes:1, not:0 */