void gfs2_glock_dq(struct gfs2_holder *gh)
 {
        struct gfs2_glock *gl = gh->gh_gl;
-       const struct gfs2_glock_operations *glops = gl->gl_ops;
        unsigned delay = 0;
        int fast_path = 0;
 
        list_del_init(&gh->gh_list);
        clear_bit(HIF_HOLDER, &gh->gh_iflags);
        if (find_first_holder(gl) == NULL) {
-               if (glops->go_unlock) {
-                       GLOCK_BUG_ON(gl, test_and_set_bit(GLF_LOCK, &gl->gl_flags));
-                       spin_unlock(&gl->gl_lockref.lock);
-                       glops->go_unlock(gh);
-                       spin_lock(&gl->gl_lockref.lock);
-                       clear_bit(GLF_LOCK, &gl->gl_flags);
-               }
                if (list_empty(&gl->gl_holders) &&
                    !test_bit(GLF_PENDING_DEMOTE, &gl->gl_flags) &&
                    !test_bit(GLF_DEMOTE, &gl->gl_flags))
 
 {
        struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
        struct address_space *mapping = &sdp->sd_aspace;
-       struct gfs2_rgrpd *rgd;
+       struct gfs2_rgrpd *rgd = gfs2_glock2rgrp(gl);
        int error;
 
-       spin_lock(&gl->gl_lockref.lock);
-       rgd = gl->gl_object;
-       if (rgd)
-               gfs2_rgrp_brelse(rgd);
-       spin_unlock(&gl->gl_lockref.lock);
-
        if (!test_and_clear_bit(GLF_DIRTY, &gl->gl_flags))
                return;
        GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE);
        .go_sync = rgrp_go_sync,
        .go_inval = rgrp_go_inval,
        .go_lock = gfs2_rgrp_go_lock,
-       .go_unlock = gfs2_rgrp_go_unlock,
        .go_dump = gfs2_rgrp_dump,
        .go_type = LM_TYPE_RGRP,
        .go_flags = GLOF_LVB,
 
        void (*go_inval) (struct gfs2_glock *gl, int flags);
        int (*go_demote_ok) (const struct gfs2_glock *gl);
        int (*go_lock) (struct gfs2_holder *gh);
-       void (*go_unlock) (struct gfs2_holder *gh);
        void (*go_dump)(struct seq_file *seq, struct gfs2_glock *gl,
                        const char *fs_id_buf);
        void (*go_callback)(struct gfs2_glock *gl, bool remote);
 
                rb_erase(n, &sdp->sd_rindex_tree);
 
                if (gl) {
-                       glock_clear_object(gl, rgd);
+                       if (gl->gl_state != LM_ST_UNLOCKED) {
+                               gfs2_glock_cb(gl, LM_ST_UNLOCKED);
+                               flush_delayed_work(&gl->gl_work);
+                       }
                        gfs2_rgrp_brelse(rgd);
+                       glock_clear_object(gl, rgd);
                        gfs2_glock_put(gl);
                }
 
                        bi->bi_bh = NULL;
                }
        }
-
-}
-
-/**
- * gfs2_rgrp_go_unlock - Unlock a rgrp glock
- * @gh: The glock holder for the resource group
- *
- */
-
-void gfs2_rgrp_go_unlock(struct gfs2_holder *gh)
-{
-       struct gfs2_rgrpd *rgd = gh->gh_gl->gl_object;
-       int demote_requested = test_bit(GLF_DEMOTE, &gh->gh_gl->gl_flags) |
-               test_bit(GLF_PENDING_DEMOTE, &gh->gh_gl->gl_flags);
-
-       if (rgd && demote_requested)
-               gfs2_rgrp_brelse(rgd);
 }
 
 int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset,
 
 extern void gfs2_free_clones(struct gfs2_rgrpd *rgd);
 extern int gfs2_rgrp_go_lock(struct gfs2_holder *gh);
 extern void gfs2_rgrp_brelse(struct gfs2_rgrpd *rgd);
-extern void gfs2_rgrp_go_unlock(struct gfs2_holder *gh);
 
 extern struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip);