[Cluster-devel] [GFS2] Merge drop_bh() into xmote_bh()

Steven Whitehouse swhiteho at redhat.com
Tue Jul 31 10:50:47 UTC 2007


>From 8f034dc615fe13618d42df62dde2137f680f218b Mon Sep 17 00:00:00 2001
From: Steven Whitehouse <swhiteho at redhat.com>
Date: Mon, 30 Jul 2007 20:16:38 +0100
Subject: [PATCH] [GFS2] Merge drop_bh() into xmote_bh()

The xmote_bh() function already does everything which drop_bh()
does and more. The ->go_xmote_bh() callback is protected against
this new caller since the two instances of it both check the
current state against LM_ST_UNLOCKED.

Signed-off-by: Steven Whitehouse <swhiteho at redhat.com>

diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 83cd60b..d564876 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -316,7 +316,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
 	gl->gl_ip = 0;
 	gl->gl_ops = glops;
 	gl->gl_req_gh = NULL;
-	gl->gl_req_bh = NULL;
 	gl->gl_vn = 0;
 	gl->gl_stamp = jiffies;
 	gl->gl_object = NULL;
@@ -730,7 +729,6 @@ static void xmote_bh(struct gfs2_glock *gl, unsigned int ret)
 		} else {
 			spin_lock(&gl->gl_spin);
 			if (gl->gl_state != gl->gl_demote_state) {
-				gl->gl_req_bh = NULL;
 				spin_unlock(&gl->gl_spin);
 				gfs2_glock_xmote_th(gl, NULL);
 				gfs2_glock_put(gl);
@@ -772,7 +770,6 @@ out:
 	if (op_done) {
 		spin_lock(&gl->gl_spin);
 		gl->gl_req_gh = NULL;
-		gl->gl_req_bh = NULL;
 		clear_bit(GLF_LOCK, &gl->gl_flags);
 		run_queue(gl);
 		spin_unlock(&gl->gl_spin);
@@ -785,40 +782,6 @@ out:
 }
 
 /**
- * drop_bh - Called after a lock module unlock completes
- * @gl: the glock
- * @ret: the return status
- *
- * Doesn't wake up the process waiting on the struct gfs2_holder (if any)
- * Doesn't drop the reference on the glock the top half took out
- *
- */
-
-static void drop_bh(struct gfs2_glock *gl, unsigned int ret)
-{
-	struct gfs2_sbd *sdp = gl->gl_sbd;
-	const struct gfs2_glock_operations *glops = gl->gl_ops;
-
-	gfs2_assert_warn(sdp, test_bit(GLF_LOCK, &gl->gl_flags));
-	gfs2_assert_warn(sdp, list_empty(&gl->gl_holders));
-	gfs2_assert_warn(sdp, !ret);
-
-	state_change(gl, LM_ST_UNLOCKED);
-	gfs2_demote_wake(gl);
-
-	if (glops->go_inval)
-		glops->go_inval(gl, DIO_METADATA);
-
-	spin_lock(&gl->gl_spin);
-	gl->gl_req_bh = NULL;
-	clear_bit(GLF_LOCK, &gl->gl_flags);
-	run_queue(gl);
-	spin_unlock(&gl->gl_spin);
-
-	gfs2_glock_put(gl);
-}
-
-/**
  * gfs2_glock_xmote_th - Call into the lock module to acquire or change a glock
  * @gl: The glock in question
  * @state: the requested state
@@ -846,10 +809,8 @@ static void gfs2_glock_xmote_th(struct gfs2_glock *gl, struct gfs2_holder *gh)
 
 	gfs2_glock_hold(gl);
 	if (state != LM_ST_UNLOCKED) {
-		gl->gl_req_bh = xmote_bh;
 		lck_ret = gfs2_lm_lock(sdp, gl->gl_lock, gl->gl_state, state, lck_flags);
 	} else {
-		gl->gl_req_bh = drop_bh;
 		lck_ret = gfs2_lm_unlock(sdp, gl->gl_lock, gl->gl_state);
 	}
 
@@ -857,7 +818,7 @@ static void gfs2_glock_xmote_th(struct gfs2_glock *gl, struct gfs2_holder *gh)
 		return;
 
 	if ((lck_ret & LM_OUT_ASYNC) == 0) {
-		gl->gl_req_bh(gl, lck_ret);
+		xmote_bh(gl, lck_ret);
 		return;
 	}
 
@@ -880,7 +841,7 @@ static void do_cancels(struct gfs2_holder *gh)
 	while (gl->gl_req_gh != gh &&
 	       !test_bit(HIF_HOLDER, &gh->gh_iflags) &&
 	       !list_empty(&gh->gh_list)) {
-		if (gl->gl_req_bh && !(gl->gl_req_gh &&
+		if (gl->gl_req_gh && !(gl->gl_req_gh &&
 				     (gl->gl_req_gh->gh_flags & GL_NOCANCEL))) {
 			spin_unlock(&gl->gl_spin);
 			gfs2_lm_cancel(gl->gl_sbd, gl->gl_lock);
@@ -951,7 +912,6 @@ static int glock_wait_internal(struct gfs2_holder *gh)
 
 		spin_lock(&gl->gl_spin);
 		gl->gl_req_gh = NULL;
-		gl->gl_req_bh = NULL;
 		clear_bit(GLF_LOCK, &gl->gl_flags);
 		run_queue(gl);
 		spin_unlock(&gl->gl_spin);
@@ -1426,8 +1386,7 @@ void gfs2_glock_cb(void *cb_data, unsigned int type, void *data)
 		gl = gfs2_glock_find(sdp, &async->lc_name);
 		if (gfs2_assert_warn(sdp, gl))
 			return;
-		if (!gfs2_assert_warn(sdp, gl->gl_req_bh))
-			gl->gl_req_bh(gl, async->lc_ret);
+		xmote_bh(gl, async->lc_ret);
 		gfs2_glock_put(gl);
 		up_read(&gfs2_umount_flush_sem);
 		return;
@@ -1800,7 +1759,6 @@ static int dump_glock(struct glock_iter *gi, struct gfs2_glock *gl)
 		print_dbg(gi, "  gl_owner = -1\n");
 	print_dbg(gi, "  gl_ip = %lu\n", gl->gl_ip);
 	print_dbg(gi, "  req_gh = %s\n", (gl->gl_req_gh) ? "yes" : "no");
-	print_dbg(gi, "  req_bh = %s\n", (gl->gl_req_bh) ? "yes" : "no");
 	print_dbg(gi, "  lvb_count = %d\n", atomic_read(&gl->gl_lvb_count));
 	print_dbg(gi, "  object = %s\n", (gl->gl_object) ? "yes" : "no");
 	print_dbg(gi, "  le = %s\n",
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index 0eca96a..cda2fba 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -26,8 +26,6 @@ struct gfs2_ail;
 struct gfs2_jdesc;
 struct gfs2_sbd;
 
-typedef void (*gfs2_glop_bh_t) (struct gfs2_glock *gl, unsigned int ret);
-
 struct gfs2_log_header_host {
 	u64 lh_sequence;	/* Sequence number of this transaction */
 	u32 lh_flags;		/* GFS2_LOG_HEAD_... */
@@ -183,7 +181,6 @@ struct gfs2_glock {
 	const struct gfs2_glock_operations *gl_ops;
 
 	struct gfs2_holder *gl_req_gh;
-	gfs2_glop_bh_t gl_req_bh;
 
 	void *gl_lock;
 	char *gl_lvb;
-- 
1.5.1.2






More information about the Cluster-devel mailing list