Use reduce_timer() to shorten the garbage collector timeout instead of
checking the old timeout and overwriting it without using a lock.  This
should avoid timeout-updating races causing timeouts to get extended.

Signed-off-by: David Howells <[email protected]>
---

 security/keys/gc.c |    7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/security/keys/gc.c b/security/keys/gc.c
index c99700e82ad6..4e3407c16e5d 100644
--- a/security/keys/gc.c
+++ b/security/keys/gc.c
@@ -32,7 +32,6 @@ DECLARE_WORK(key_gc_work, key_garbage_collector);
 static void key_gc_timer_func(unsigned long);
 static DEFINE_TIMER(key_gc_timer, key_gc_timer_func, 0, 0);
 
-static time64_t key_gc_next_run = TIME64_MAX;
 static struct key_type *key_gc_dead_keytype;
 
 static unsigned long key_gc_flags;
@@ -63,11 +62,10 @@ void key_schedule_gc(time64_t gc_at)
        if (gc_at <= now || test_bit(KEY_GC_REAP_KEYTYPE, &key_gc_flags)) {
                kdebug("IMMEDIATE");
                schedule_work(&key_gc_work);
-       } else if (gc_at < key_gc_next_run) {
+       } else {
                kdebug("DEFERRED");
-               key_gc_next_run = gc_at;
                expires = jiffies + (gc_at - now) * HZ;
-               mod_timer(&key_gc_timer, expires);
+               reduce_timer(&key_gc_timer, expires);
        }
 }
 
@@ -87,7 +85,6 @@ void key_schedule_gc_links(void)
 static void key_gc_timer_func(unsigned long data)
 {
        kenter("");
-       key_gc_next_run = TIME64_MAX;
        key_schedule_gc_links();
 }
 

Reply via email to