bcache: gc does not work when triggering by manual command
authorTang Junhui <tang.junhui@zte.com.cn>
Wed, 6 Sep 2017 06:25:55 +0000 (14:25 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 6 Sep 2017 14:17:33 +0000 (08:17 -0600)
I try to execute the following command to trigger gc thread:
[root@localhost internal]# echo 1 > trigger_gc
But it does not work, I debug the code in gc_should_run(), It works only
if in invalidating or sectors_to_gc < 0. So set sectors_to_gc to -1 to
meet the condition when we trigger gc by manual command.

(Code comments aded by Coly Li)

Signed-off-by: Tang Junhui <tang.junhui@zte.com.cn>
Reviewed-by: Coly Li <colyli@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/bcache/sysfs.c

index f90f136..09295c0 100644 (file)
@@ -615,8 +615,21 @@ STORE(__bch_cache_set)
                bch_cache_accounting_clear(&c->accounting);
        }
 
-       if (attr == &sysfs_trigger_gc)
+       if (attr == &sysfs_trigger_gc) {
+               /*
+                * Garbage collection thread only works when sectors_to_gc < 0,
+                * when users write to sysfs entry trigger_gc, most of time
+                * they want to forcibly triger gargage collection. Here -1 is
+                * set to c->sectors_to_gc, to make gc_should_run() give a
+                * chance to permit gc thread to run. "give a chance" means
+                * before going into gc_should_run(), there is still chance
+                * that c->sectors_to_gc being set to other positive value. So
+                * writing sysfs entry trigger_gc won't always make sure gc
+                * thread takes effect.
+                */
+               atomic_set(&c->sectors_to_gc, -1);
                wake_up_gc(c);
+       }
 
        if (attr == &sysfs_prune_cache) {
                struct shrink_control sc;