lsblk: Improve discard printing Use atol() instead of atoi() when extracting discard_max_bytes. Only print discard_alignment and discard_zeroes_data if the device supports discard. This prevents printing of undefined values with older kernels. Signed-off-by: Martin K. Petersen diff --git a/misc-utils/lsblk.c b/misc-utils/lsblk.c index 2110113..e4f2cde 100644 --- a/misc-utils/lsblk.c +++ b/misc-utils/lsblk.c @@ -160,6 +160,7 @@ struct blkdev_cxt { * /sys/block/.../holders + number of partition */ int nslaves; /* # of devices this device maps to */ int maj, min; /* devno */ + int discard; /* supports discard */ uint64_t size; /* device size */ }; @@ -712,8 +713,10 @@ static void set_tt_data(struct blkdev_cxt *cxt, int col, int id, struct tt_line break; case COL_DALIGN: p = sysfs_strdup(cxt, "discard_alignment"); - if (p) + if (cxt->discard && p) tt_line_set_data(ln, col, p); + else + tt_line_set_data(ln, col, "0"); break; case COL_DGRAN: p = sysfs_strdup(cxt, "queue/discard_granularity"); @@ -726,14 +729,16 @@ static void set_tt_data(struct blkdev_cxt *cxt, int col, int id, struct tt_line p = sysfs_strdup(cxt, "queue/discard_max_bytes"); if (!lsblk->bytes) - p = size_to_human_string(atoi(p)); + p = size_to_human_string(atol(p)); if (p) tt_line_set_data(ln, col, p); break; case COL_DZERO: p = sysfs_strdup(cxt, "queue/discard_zeroes_data"); - if (p) + if (cxt->discard && p) tt_line_set_data(ln, col, p); + else + tt_line_set_data(ln, col, "0"); break; }; } @@ -772,6 +777,7 @@ static int set_cxt(struct blkdev_cxt *cxt, return -1; cxt->size = sysfs_read_u64(cxt, "size") << 9; + cxt->discard = sysfs_read_int(cxt, "queue/discard_granularity"); /* Ignore devices of zero size */ if (!lsblk->all_devices && cxt->size == 0)