When writeback is not running, writeback rate should be 0, other value is
misleading. And the following dyanmic writeback rate debug parameters
should be 0 too,
        rate, proportional, integral, change
otherwise they are misleading when writeback is not running.

Signed-off-by: Coly Li <col...@suse.de>
---
 drivers/md/bcache/sysfs.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c
index 225b15aa0340..3e9d3459a224 100644
--- a/drivers/md/bcache/sysfs.c
+++ b/drivers/md/bcache/sysfs.c
@@ -149,6 +149,7 @@ SHOW(__bch_cached_dev)
        struct cached_dev *dc = container_of(kobj, struct cached_dev,
                                             disk.kobj);
        const char *states[] = { "no cache", "clean", "dirty", "inconsistent" };
+       int wb = dc->writeback_running;
 
 #define var(stat)              (dc->stat)
 
@@ -170,7 +171,7 @@ SHOW(__bch_cached_dev)
        var_printf(writeback_running,   "%i");
        var_print(writeback_delay);
        var_print(writeback_percent);
-       sysfs_hprint(writeback_rate,    dc->writeback_rate.rate << 9);
+       sysfs_hprint(writeback_rate,    wb ? dc->writeback_rate.rate << 9 : 0);
        sysfs_hprint(io_errors,         atomic_read(&dc->io_errors));
        sysfs_printf(io_error_limit,    "%i", dc->error_limit);
        sysfs_printf(io_disable,        "%i", dc->io_disable);
@@ -188,15 +189,20 @@ SHOW(__bch_cached_dev)
                char change[20];
                s64 next_io;
 
-               bch_hprint(rate,        dc->writeback_rate.rate << 9);
-               bch_hprint(dirty,       bcache_dev_sectors_dirty(&dc->disk) << 
9);
-               bch_hprint(target,      dc->writeback_rate_target << 9);
-               bch_hprint(proportional,dc->writeback_rate_proportional << 9);
-               bch_hprint(integral,    dc->writeback_rate_integral_scaled << 
9);
-               bch_hprint(change,      dc->writeback_rate_change << 9);
-
-               next_io = div64_s64(dc->writeback_rate.next - local_clock(),
-                                   NSEC_PER_MSEC);
+               /*
+                * Except for dirty and target, other values should
+                * be 0 if writeback is not running.
+                */
+               bch_hprint(rate, wb ? dc->writeback_rate.rate << 9 : 0);
+               bch_hprint(dirty, bcache_dev_sectors_dirty(&dc->disk) << 9);
+               bch_hprint(target, dc->writeback_rate_target << 9);
+               bch_hprint(proportional,
+                          wb ? dc->writeback_rate_proportional << 9 : 0);
+               bch_hprint(integral,
+                          wb ? dc->writeback_rate_integral_scaled << 9 : 0);
+               bch_hprint(change, wb ? dc->writeback_rate_change << 9 : 0);
+               next_io = wb ? div64_s64(dc->writeback_rate.next-local_clock(),
+                                        NSEC_PER_MSEC) : 0;
 
                return sprintf(buf,
                               "rate:\t\t%s/sec\n"
-- 
2.18.0

Reply via email to