From 19bedb98bf93ac67d78cc0606d66e03217e15cbb Mon Sep 17 00:00:00 2001 From: vegbir Date: Sat, 15 Jul 2023 08:15:57 +0000 Subject: [PATCH 15/16] proc fix proc diskstats output format Signed-off-by: vegbir --- src/proc_fuse.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/proc_fuse.c b/src/proc_fuse.c index fa5b055..97bfff8 100644 --- a/src/proc_fuse.c +++ b/src/proc_fuse.c @@ -810,10 +810,10 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, memset(lbuf, 0, 256); if (stats.read || stats.write || stats.read_merged || stats.write_merged || stats.read_sectors || stats.write_sectors || stats.read_ticks || - stats.write_ticks || stats.ios_pgr || stats.total_ticks || stats.rq_ticks || + stats.write_ticks || stats.ios_pgr || stats.total_ticks || stats.rq_ticks || stats.discard || stats.discard_merged || stats.discard_sectors || stats.discard_ticks) { if (need_record_diskstats(stats.major, stats.minor)) { - sscanf(line, "%u %u %71s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", + sscanf(line, "%u %u %71s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", &stats.major, &stats.minor, tmp_dev_name, @@ -828,11 +828,12 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, &stats.ios_pgr, &stats.total_ticks, &stats.rq_ticks, + &stats.discard, &stats.discard_merged, &stats.discard_sectors, &stats.discard_ticks); } - snprintf(lbuf, 256, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", + ret = snprintf(lbuf, 256, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", stats.major, stats.minor, stats.dev_name, @@ -847,11 +848,17 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, stats.ios_pgr, stats.total_ticks, stats.rq_ticks, + stats.discard, stats.discard_merged, stats.discard_sectors, stats.discard_ticks); + if(ret >= 256) { + lxcfs_error("Insufficient buffer for %u:%u %s diskstats", + stats.major, stats.minor, stats.dev_name); + continue; + } } else if (need_record_diskstats(stats.major, stats.minor)) { - sscanf(line, "%u %u %71s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", + sscanf(line, "%u %u %71s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", &stats.major, &stats.minor, tmp_dev_name, @@ -866,10 +873,11 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, &stats.ios_pgr, &stats.total_ticks, &stats.rq_ticks, + &stats.discard, &stats.discard_merged, &stats.discard_sectors, &stats.discard_ticks); - snprintf(lbuf, 256, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", + ret = snprintf(lbuf, 256, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n", stats.major, stats.minor, stats.dev_name, @@ -884,9 +892,15 @@ static int proc_diskstats_read(char *buf, size_t size, off_t offset, stats.ios_pgr, stats.total_ticks, stats.rq_ticks, + stats.discard, stats.discard_merged, stats.discard_sectors, stats.discard_ticks); + if(ret >= 256) { + lxcfs_error("Insufficient buffer for %u:%u %s diskstats", + stats.major, stats.minor, stats.dev_name); + continue; + } } else { continue; } -- 2.41.0