diff options
author | Andreas Gruenbacher <agruenba@redhat.com> | 2023-08-25 11:18:38 +0200 |
---|---|---|
committer | Andreas Gruenbacher <agruenba@redhat.com> | 2023-09-05 15:58:17 +0200 |
commit | fe0690f0a6f190a9ec0736c01ddeba7a729cf30d (patch) | |
tree | be579cb6b52703667dda859700f46ff23a97d794 /fs/gfs2/quota.c | |
parent | e4a8b5481c59a3f1252f595330c2d2cd038886b2 (diff) |
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 <agruenba@redhat.com>
Diffstat (limited to 'fs/gfs2/quota.c')
-rw-r--r-- | fs/gfs2/quota.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 5201bb403fc6..3a3189f5104a 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) |