summaryrefslogtreecommitdiffstats
path: root/misc-utils
diff options
context:
space:
mode:
authorKarel Zak2018-10-17 14:10:27 +0200
committerKarel Zak2018-12-07 12:32:58 +0100
commit8a2f175cbbd9850922fb5bbb96c5a58a4a2d73c0 (patch)
tree0f49a007d9e720c9a0ab0f8eac06f098fc08f9d3 /misc-utils
parentlsblk: reuse 'removable' flag from parent (diff)
downloadkernel-qcow2-util-linux-8a2f175cbbd9850922fb5bbb96c5a58a4a2d73c0.tar.gz
kernel-qcow2-util-linux-8a2f175cbbd9850922fb5bbb96c5a58a4a2d73c0.tar.xz
kernel-qcow2-util-linux-8a2f175cbbd9850922fb5bbb96c5a58a4a2d73c0.zip
lsblk: read queue/discard_granularity only when necessary
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'misc-utils')
-rw-r--r--misc-utils/lsblk-devtree.c1
-rw-r--r--misc-utils/lsblk.c29
-rw-r--r--misc-utils/lsblk.h3
3 files changed, 20 insertions, 13 deletions
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 */