4.12-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Jaegeuk Kim <jaeg...@kernel.org>

commit 1d7be2708277edfef95171d52fb65ee26eaa076b upstream.

This allows to freeze gc and discard threads.

Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 fs/f2fs/gc.c      |    9 +++++----
 fs/f2fs/segment.c |   25 ++++++++++++++++---------
 2 files changed, 21 insertions(+), 13 deletions(-)

--- a/fs/f2fs/gc.c
+++ b/fs/f2fs/gc.c
@@ -32,13 +32,14 @@ static int gc_thread_func(void *data)
 
        wait_ms = gc_th->min_sleep_time;
 
+       set_freezable();
        do {
+               wait_event_interruptible_timeout(*wq,
+                               kthread_should_stop() || freezing(current),
+                               msecs_to_jiffies(wait_ms));
+
                if (try_to_freeze())
                        continue;
-               else
-                       wait_event_interruptible_timeout(*wq,
-                                               kthread_should_stop(),
-                                               msecs_to_jiffies(wait_ms));
                if (kthread_should_stop())
                        break;
 
--- a/fs/f2fs/segment.c
+++ b/fs/f2fs/segment.c
@@ -16,6 +16,7 @@
 #include <linux/kthread.h>
 #include <linux/swap.h>
 #include <linux/timer.h>
+#include <linux/freezer.h>
 
 #include "f2fs.h"
 #include "segment.h"
@@ -1060,18 +1061,24 @@ static int issue_discard_thread(void *da
        struct f2fs_sb_info *sbi = data;
        struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info;
        wait_queue_head_t *q = &dcc->discard_wait_queue;
-repeat:
-       if (kthread_should_stop())
-               return 0;
 
-       __issue_discard_cmd(sbi, true);
-       __wait_discard_cmd(sbi, true);
+       set_freezable();
 
-       congestion_wait(BLK_RW_SYNC, HZ/50);
+       do {
+               wait_event_interruptible(*q, kthread_should_stop() ||
+                                       freezing(current) ||
+                                       atomic_read(&dcc->discard_cmd_cnt));
+               if (try_to_freeze())
+                       continue;
+               if (kthread_should_stop())
+                       return 0;
 
-       wait_event_interruptible(*q, kthread_should_stop() ||
-                               atomic_read(&dcc->discard_cmd_cnt));
-       goto repeat;
+               __issue_discard_cmd(sbi, true);
+               __wait_discard_cmd(sbi, true);
+
+               congestion_wait(BLK_RW_SYNC, HZ/50);
+       } while (!kthread_should_stop());
+       return 0;
 }
 
 #ifdef CONFIG_BLK_DEV_ZONED


Reply via email to