From 8a2f175cbbd9850922fb5bbb96c5a58a4a2d73c0 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 17 Oct 2018 14:10:27 +0200 Subject: lsblk: read queue/discard_granularity only when necessary Signed-off-by: Karel Zak --- misc-utils/lsblk-devtree.c | 1 + misc-utils/lsblk.c | 29 +++++++++++++++++------------ misc-utils/lsblk.h | 3 ++- 3 files changed, 20 insertions(+), 13 deletions(-) (limited to 'misc-utils') diff --git a/misc-utils/lsblk-devtree.c b/misc-utils/lsblk-devtree.c index efc165f54..9a6dba0e1 100644 --- a/misc-utils/lsblk-devtree.c +++ b/misc-utils/lsblk-devtree.c @@ -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); diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c index aacc0e560..46f8f3260 100644 --- a/misc-utils/lsblk.c +++ b/misc-utils/lsblk.c @@ -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")); diff --git a/misc-utils/lsblk.h b/misc-utils/lsblk.h index 7cb4e3eee..6cba502cf 100644 --- a/misc-utils/lsblk.h +++ b/misc-utils/lsblk.h @@ -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 */ -- cgit v1.2.3-55-g7522