From fe0690f0a6f190a9ec0736c01ddeba7a729cf30d Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 25 Aug 2023 11:18:38 +0200 Subject: [PATCH] gfs2: Sanitize kthread stopping Immediately stop the logd and quotad kernel threads when a filesystem withdraw is detected: those threads aren't doing anything useful after a withdraw. (Depends on the extra logd and quotad task struct references held since commit 7a109f383fa3 ("gfs2: Fix asynchronous thread destruction").) In addition, check for kthread_should_stop() in the wait condition in gfs2_quotad() to stop immediately when kthread_stop() is called. Signed-off-by: Andreas Gruenbacher --- fs/gfs2/log.c | 9 ++++----- fs/gfs2/quota.c | 9 +++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c index addf4ce..e5271ae 100644 --- a/fs/gfs2/log.c +++ b/fs/gfs2/log.c @@ -1298,11 +1298,9 @@ int gfs2_logd(void *data) unsigned long t = 1; while (!kthread_should_stop()) { + if (gfs2_withdrawn(sdp)) + break; - if (gfs2_withdrawn(sdp)) { - msleep_interruptible(HZ); - continue; - } /* Check for errors writing to the journal */ if (sdp->sd_log_error) { gfs2_lm(sdp, @@ -1311,7 +1309,7 @@ int gfs2_logd(void *data) "prevent further damage.\n", sdp->sd_fsname, sdp->sd_log_error); gfs2_withdraw(sdp); - continue; + break; } if (gfs2_jrnl_flush_reqd(sdp) || t == 0) { @@ -1339,6 +1337,7 @@ int gfs2_logd(void *data) gfs2_ail_flush_reqd(sdp) || gfs2_jrnl_flush_reqd(sdp) || sdp->sd_log_error || + gfs2_withdrawn(sdp) || kthread_should_stop(), t); } diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 5201bb4..3a3189f 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c @@ -1559,9 +1559,9 @@ int gfs2_quotad(void *data) unsigned long t = 0; while (!kthread_should_stop()) { - if (gfs2_withdrawn(sdp)) - goto bypass; + break; + /* Update the master statfs file */ if (sdp->sd_statfs_force_sync) { int error = gfs2_statfs_sync(sdp->sd_vfs, 0); @@ -1579,11 +1579,12 @@ int gfs2_quotad(void *data) try_to_freeze(); -bypass: t = min(quotad_timeo, statfs_timeo); t = wait_event_interruptible_timeout(sdp->sd_quota_wait, - sdp->sd_statfs_force_sync, + sdp->sd_statfs_force_sync || + gfs2_withdrawn(sdp) || + kthread_should_stop(), t); if (sdp->sd_statfs_force_sync) -- 2.7.4