gfs2: Cease delete work during unmount
authorBob Peterson <rpeterso@redhat.com>
Mon, 5 Dec 2022 23:12:59 +0000 (00:12 +0100)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 31 Jan 2023 21:40:24 +0000 (22:40 +0100)
Add a check to delete_work_func() so that it quits when it finds that
the filesystem is deactivating.  This speeds up the delete workqueue
draining in gfs2_kill_sb().

In addition, make sure that iopen_go_callback() won't queue any new
delete work while the filesystem is deactivating.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/glock.c
fs/gfs2/glops.c

index b184375..5adc7d8 100644 (file)
@@ -1022,6 +1022,8 @@ static void delete_work_func(struct work_struct *work)
                 * step entirely.
                 */
                if (gfs2_try_evict(gl)) {
+                       if (test_bit(SDF_DEACTIVATING, &sdp->sd_flags))
+                               goto out;
                        if (gfs2_queue_verify_evict(gl))
                                return;
                }
@@ -1033,6 +1035,7 @@ static void delete_work_func(struct work_struct *work)
                                            GFS2_BLKST_UNLINKED);
                if (IS_ERR(inode)) {
                        if (PTR_ERR(inode) == -EAGAIN &&
+                           !test_bit(SDF_DEACTIVATING, &sdp->sd_flags) &&
                            gfs2_queue_verify_evict(gl))
                                return;
                } else {
index 007cd59..ad14818 100644 (file)
@@ -648,7 +648,8 @@ static void iopen_go_callback(struct gfs2_glock *gl, bool remote)
        struct gfs2_inode *ip = gl->gl_object;
        struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
 
-       if (!remote || sb_rdonly(sdp->sd_vfs))
+       if (!remote || sb_rdonly(sdp->sd_vfs) ||
+           test_bit(SDF_DEACTIVATING, &sdp->sd_flags))
                return;
 
        if (gl->gl_demote_state == LM_ST_UNLOCKED &&