GFS2: skip dlm_unlock calls in unmount
authorDavid Teigland <teigland@redhat.com>
Tue, 13 Nov 2012 15:58:56 +0000 (10:58 -0500)
committerSteven Whitehouse <swhiteho@redhat.com>
Wed, 14 Nov 2012 09:37:04 +0000 (09:37 +0000)
When unmounting, gfs2 does a full dlm_unlock operation on every
cached lock.  This can create a very large amount of work and can
take a long time to complete.  However, the vast majority of these
dlm unlock operations are unnecessary because after all the unlocks
are done, gfs2 leaves the dlm lockspace, which automatically clears
the locks of the leaving node, without unlocking each one individually.
So, gfs2 can skip explicit dlm unlocks, and use dlm_release_lockspace to
remove the locks implicitly.  The one exception is when the lock's lvb is
being used.  In this case, dlm_unlock is called because it may update the
lvb of the resource.

Signed-off-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/glock.c
fs/gfs2/incore.h
fs/gfs2/lock_dlm.c

index 6114571a979a9d972e041952b08778f1e4647d8d..9d29a5167d342a74fd99ad664352121f01242a84 100644 (file)
@@ -1526,6 +1526,7 @@ static void dump_glock_func(struct gfs2_glock *gl)
 
 void gfs2_gl_hash_clear(struct gfs2_sbd *sdp)
 {
+       set_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags);
        glock_hash_walk(clear_glock, sdp);
        flush_workqueue(glock_workqueue);
        wait_event(sdp->sd_glock_wait, atomic_read(&sdp->sd_glock_disposal) == 0);
index a46f0348593647e4cb33612364a00239382a0a62..a35ef5cd14800c998f1e38c3dd5b292173e9b73b 100644 (file)
@@ -539,6 +539,7 @@ enum {
        SDF_DEMOTE              = 5,
        SDF_NOJOURNALID         = 6,
        SDF_RORECOVERY          = 7, /* read only recovery */
+       SDF_SKIP_DLM_UNLOCK     = 8,
 };
 
 #define GFS2_FSNAME_LEN                256
index 0fb6539b0c8cc0d64bbce7ff047eae815f1bafe3..f6504d3fadb310420cfd5e66263adb41e7a4ac80 100644 (file)
@@ -289,6 +289,14 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
        gfs2_glstats_inc(gl, GFS2_LKS_DCOUNT);
        gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
        gfs2_update_request_times(gl);
+
+       /* don't want to skip dlm_unlock writing the lvb when lock is ex */
+       if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) &&
+           gl->gl_state != LM_ST_EXCLUSIVE) {
+               gfs2_glock_free(gl);
+               return;
+       }
+
        error = dlm_unlock(ls->ls_dlm, gl->gl_lksb.sb_lkid, DLM_LKF_VALBLK,
                           NULL, gl);
        if (error) {