From: Karel Zak Date: Wed, 17 Oct 2018 12:10:27 +0000 (+0200) Subject: lsblk: read queue/discard_granularity only when necessary X-Git-Tag: v2.34-rc1~212 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8a2f175cbbd9850922fb5bbb96c5a58a4a2d73c0;p=thirdparty%2Futil-linux.git lsblk: read queue/discard_granularity only when necessary Signed-off-by: Karel Zak --- diff --git a/misc-utils/lsblk-devtree.c b/misc-utils/lsblk-devtree.c index efc165f54a..9a6dba0e18 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 aacc0e5605..46f8f3260b 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 7cb4e3eeef..6cba502cff 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 */