[Ocfs2-commits] khackel commits r1946 - trunk/fs/ocfs2/dlm

svn-commits at oss.oracle.com svn-commits at oss.oracle.com
Sun Mar 6 18:19:44 CST 2005


Author: khackel
Signed-off-by: zab
Date: 2005-03-06 18:19:42 -0600 (Sun, 06 Mar 2005)
New Revision: 1946

Modified:
   trunk/fs/ocfs2/dlm/dlmmaster.c
Log:
* Merged 1920 from dlm-reco-mig branch:
	- [1920] reordered dlmmaster.c

Signed-off-by: zab



Modified: trunk/fs/ocfs2/dlm/dlmmaster.c
===================================================================
--- trunk/fs/ocfs2/dlm/dlmmaster.c	2005-03-07 00:11:09 UTC (rev 1945)
+++ trunk/fs/ocfs2/dlm/dlmmaster.c	2005-03-07 00:19:42 UTC (rev 1946)
@@ -67,7 +67,11 @@
 		       int idx, void *data);
 
 static int dlm_do_master_request(dlm_master_list_entry *mle, int to);
+static int dlm_do_master_request_resp(dlm_ctxt *dlm, char *name,
+				      unsigned int namelen,
+				      int response, int to);
 static int dlm_do_assert_master(dlm_master_list_entry *mle);
+
 static dlm_lock_resource *dlm_new_lockres(dlm_ctxt *dlm,
 					  const char *name,
 					  unsigned int namelen);
@@ -76,33 +80,12 @@
 			     const char *name,
 			     unsigned int namelen);
 
-static inline void dlm_set_lockres_owner(dlm_ctxt *dlm, dlm_lock_resource *res,
-					 u8 owner, int init)
-{
-	if (!init) {
-		if (owner == res->owner)
-			return;
 
-		if (res->owner == dlm->group_index)
-			atomic_dec(&dlm->local_resources);
-		else if (res->owner == DLM_LOCK_RES_OWNER_UNKNOWN)
-			atomic_dec(&dlm->unknown_resources);
-		else
-			atomic_dec(&dlm->remote_resources);
-	}
 
-	if (owner == dlm->group_index)
-		atomic_inc(&dlm->local_resources);
-	else if (owner == DLM_LOCK_RES_OWNER_UNKNOWN)
-		atomic_inc(&dlm->unknown_resources);
-	else
-		atomic_inc(&dlm->remote_resources);
+/*
+ * MASTER LIST FUNCTIONS
+ */
 
-	res->owner = owner;
-}
-
-
-
 /* remove from list and free */
 static void dlm_put_mle(dlm_master_list_entry *mle)
 {
@@ -196,45 +179,113 @@
 	return 0;
 }
 
+static void dlm_mle_node_down(struct inode *group, struct inode *node, 
+		       int idx, void *data)
+{
+	//int ret;
+	//struct inode *node = ptr2;
 
+	dlm_master_list_entry *mle;
+	dlm_ctxt *dlm;
 
-/////////////////////////////////////////////////
-//
-// TODO: change these comments to reflect reality
-// 
-//    master_request(target=me)
-//    wait for all responses
-//    if maybe_map is 0 there are no others in progress
-//        assert_master(me)
-//    else (maybe_map has some nodes in it)
-//        (nodes in maybe_map had better be < my node num)
-//        wait for assert_master
-//    endif     
-//
-//    
-//    receive:
-//        master_request(target):
-//            if i own it, return YES
-//            if i dont know anything about it, return NO
-//            if i have it in progress
-//                if my node number is lower
-//                    return MAYBE
-//                else
-//                    if target < lowest_so_far, lowest_so_far=target
-//                    return NO
-//
-//        assert_master(master):
-//            if i own it, BUG()!!!
-//            if i have it, but owner!=master, BUG()!!!
-//            if i dont know anything about it, ignore
-//            if i have it in progress
-//                if lowest_so_far != master
-//                    BUG()!!!
-//                else
-//                    set the owner, DONE
-//
-/////////////////////////////////////////////////
+	mle = data;
+	if (!mle) {
+		dlmprintk0("eek! NULL mle!\n");
+		return;
+	}
+	if (!mle->dlm) {
+		dlmprintk0("eek! NULL dlm\n");
+		return;
+	}
+       	dlm = mle->dlm;
+	if (dlm->group != group)
+		return;
 
+	spin_lock(&mle->spinlock);
+
+	if (!test_bit(idx, mle->node_map))
+		dlmprintk("node %u already removed from nodemap!\n", idx);
+	else
+		clear_bit(idx, mle->node_map);
+
+#if 0	
+	if (test_bit(idx, mle->recovery_map))
+		dlmprintk("node %u already added to recovery map!\n", idx);
+	else
+		set_bit(idx, mle->recovery_map);
+#endif
+	spin_unlock(&mle->spinlock);
+}
+
+static void dlm_mle_node_up(struct inode *group, struct inode *node, 
+		     int idx, void *data)
+{
+	//struct inode *node = ptr2;
+	dlm_master_list_entry *mle;
+	dlm_ctxt *dlm;
+
+	mle = data;
+	if (!mle) {
+		dlmprintk0("eek! NULL mle!\n");
+		return;
+	}
+	if (!mle->dlm) {
+		dlmprintk0("eek! NULL dlm\n");
+		return;
+	}
+       	dlm = mle->dlm;
+	if (dlm->group != group)
+		return;
+
+	spin_lock(&mle->spinlock);
+
+#if 0	
+	if (test_bit(idx, mle->recovery_map))
+		dlmprintk("BUG!!! node up message on node "
+			  "in recovery (%u)!!!\n", idx);
+	else 
+#endif
+	{
+		if (test_bit(idx, mle->node_map))
+			dlmprintk("node %u already in node map!!!\n", idx);
+		else 
+			set_bit(idx, mle->node_map);
+	}
+
+	spin_unlock(&mle->spinlock);
+}
+
+
+/*
+ * LOCK RESOURCE FUNCTIONS
+ */
+
+static inline void dlm_set_lockres_owner(dlm_ctxt *dlm, dlm_lock_resource *res,
+					 u8 owner, int init)
+{
+	if (!init) {
+		if (owner == res->owner)
+			return;
+
+		if (res->owner == dlm->group_index)
+			atomic_dec(&dlm->local_resources);
+		else if (res->owner == DLM_LOCK_RES_OWNER_UNKNOWN)
+			atomic_dec(&dlm->unknown_resources);
+		else
+			atomic_dec(&dlm->remote_resources);
+	}
+
+	if (owner == dlm->group_index)
+		atomic_inc(&dlm->local_resources);
+	else if (owner == DLM_LOCK_RES_OWNER_UNKNOWN)
+		atomic_inc(&dlm->unknown_resources);
+	else
+		atomic_inc(&dlm->remote_resources);
+
+	res->owner = owner;
+}
+
+
 static void dlm_lockres_release(struct kref *kref)
 {
 	dlm_lock_resource *res;
@@ -632,7 +683,80 @@
 	return res;
 }
 
+
 /*
+ * DLM_MASTER_REQUEST_MSG
+ */
+
+static int dlm_do_master_request(dlm_master_list_entry *mle, int to)
+{
+	struct inode *inode = NULL;
+	dlm_ctxt *dlm = mle->dlm;
+	dlm_master_request request;
+	int ret, response=0;
+
+	memset(&request, 0, sizeof(request));
+	request.node_idx = dlm->group_index;
+	if (mle->type == DLM_MLE_BLOCK) {
+		request.namelen = mle->u.name.len;
+		strncpy(request.name, mle->u.name.name, request.namelen);
+	} else {
+		request.namelen = mle->u.res->lockname.len;
+		strncpy(request.name, mle->u.res->lockname.name, 
+			request.namelen);
+	}
+
+	ret = -EINVAL;
+	inode = nm_get_group_node_by_index(dlm->group, to);
+	if (inode) {
+		dlm_master_request_to_net(&request);
+		ret = net_send_message(DLM_MASTER_REQUEST_MSG, dlm->key, 
+				       &request, sizeof(request), 
+				       inode, &response);
+		iput(inode);
+		if (ret >= 0) {
+			spin_lock(&mle->spinlock);
+			switch (response) {
+				case DLM_MASTER_RESP_YES:
+					set_bit(to, mle->response_map);
+					// dlmprintk("woot!  node %u is the "
+					// "master!\n", to);
+					mle->master = to;
+					break;
+				case DLM_MASTER_RESP_NO:
+					// dlmprintk("node %u is not the "
+					// "master, not in-progress\n", to);
+					set_bit(to, mle->response_map);
+					break;
+				case DLM_MASTER_RESP_MAYBE:
+					// dlmprintk("node %u is not the "
+					// "master, but IS in-progress\n", to);
+					set_bit(to, mle->response_map);
+					set_bit(to, mle->maybe_map);
+					break;
+				case DLM_MASTER_RESP_ERROR:
+					dlmprintk("node %u hit an -ENOMEM!  "
+						  "try everything again\n", to);
+					mle->error = 1;
+					break;
+				default:
+					dlmprintk("bad response! %u\n", 
+						  response);
+					ret = -EINVAL;
+					break;
+			}
+			spin_unlock(&mle->spinlock);
+		} else {
+			dlmprintk("net_send_message returned %d!\n", ret);
+		}
+	} else {
+		dlmprintk("nm_get_group_node_by_index failed to find inode "
+			  "for node %d!\n", to);
+	}	
+	return ret;
+}
+
+/*
  * locks that can be taken here:
  * dlm->spinlock
  * res->spinlock
@@ -785,6 +909,46 @@
 	return response;
 }
 
+
+
+/*
+ * DLM_MASTER_REQUEST_RESP_MSG
+ */
+
+static int dlm_do_master_request_resp(dlm_ctxt *dlm, char *name, 
+				      unsigned int namelen, 
+				      int response, int to)
+{
+	struct inode *inode = NULL;
+	dlm_master_request_resp resp;
+	int ret;
+
+	memset(&resp, 0, sizeof(resp));
+	resp.node_idx = dlm->group_index;
+	resp.response = response;
+	resp.namelen = namelen;
+	strncpy(resp.name, name, namelen);
+
+	ret = -EINVAL;
+	inode = nm_get_group_node_by_index(dlm->group, to);
+	if (!inode) {
+		dlmprintk("nm_get_group_node_by_index failed to find inode "
+			  "for node %d!\n", to);
+		goto leave;
+	}
+
+	dlm_master_request_resp_to_net(&resp);
+	ret = net_send_message(DLM_MASTER_REQUEST_RESP_MSG, dlm->key, 
+			       &resp, sizeof(resp), inode, NULL);
+	iput(inode);
+	if (ret < 0)
+		dlmprintk("net_send_message returned %d!\n", ret);
+leave:
+	return ret;
+}
+
+
+
 /* NOTE: when doing node recovery, run the dlm->master_list looking for the 
  * dead node in any maybe_map... clear that bit, and if now empty, clear the 
  * whole thing */
@@ -880,7 +1044,70 @@
 	return 0;
 }
 
+
 /*
+ * DLM_ASSERT_MASTER_MSG
+ */
+
+
+/*
+ * NOTE: this can be used for debugging
+ * can periodically run all locks owned by this node
+ * and re-assert across the cluster...
+ */
+static int dlm_do_assert_master(dlm_master_list_entry *mle)
+{
+	struct inode *inode = NULL;
+	dlm_ctxt *dlm = mle->dlm;
+	dlm_assert_master assert;
+	int to, start = 0, ret = 0, tmpret;
+
+	while (1) {
+		to = find_next_bit (mle->vote_map, NM_MAX_NODES, start);
+		if (to >= NM_MAX_NODES) {
+			// dlmprintk0("no more nodes\n");
+			break;
+		}
+		// dlmprintk("sending assert master to %d\n", to);
+
+		memset(&assert, 0, sizeof(assert));
+		assert.node_idx = dlm->group_index;
+		if (mle->type == DLM_MLE_BLOCK) {
+			assert.namelen = mle->u.name.len;
+			strncpy(assert.name, mle->u.name.name, assert.namelen);
+		} else {
+			assert.namelen = mle->u.res->lockname.len;
+			strncpy(assert.name, mle->u.res->lockname.name, 
+				assert.namelen);
+		}
+
+		inode = nm_get_group_node_by_index(dlm->group, to);
+		if (!inode) {
+			tmpret = -EINVAL;
+			dlmprintk("could not get nm info for node %d!  "
+				  "need to retry this whole thing\n", to);
+			ret = tmpret;
+			break;
+		}
+
+		dlm_assert_master_to_net(&assert);
+		tmpret = net_send_message(DLM_MASTER_REQUEST_MSG, dlm->key, 
+					  &assert, sizeof(assert), inode, NULL);
+		iput(inode);
+
+		if (tmpret < 0) {
+			// TODO
+			// dlmprintk("assert_master returned %d!\n", tmpret);
+			ret = tmpret;
+			break;
+		}
+		start = to+1;
+	}
+
+	return ret;
+}
+
+/*
  * locks that can be taken here:
  * dlm->spinlock
  * res->spinlock
@@ -981,204 +1208,3 @@
 	dlm_put(dlm);
 	return 0;
 }
-
-static int dlm_do_master_request(dlm_master_list_entry *mle, int to)
-{
-	struct inode *inode = NULL;
-	dlm_ctxt *dlm = mle->dlm;
-	dlm_master_request request;
-	int ret, response=0;
-
-	memset(&request, 0, sizeof(request));
-	request.node_idx = dlm->group_index;
-	if (mle->type == DLM_MLE_BLOCK) {
-		request.namelen = mle->u.name.len;
-		strncpy(request.name, mle->u.name.name, request.namelen);
-	} else {
-		request.namelen = mle->u.res->lockname.len;
-		strncpy(request.name, mle->u.res->lockname.name, 
-			request.namelen);
-	}
-
-	ret = -EINVAL;
-	inode = nm_get_group_node_by_index(dlm->group, to);
-	if (inode) {
-		dlm_master_request_to_net(&request);
-		ret = net_send_message(DLM_MASTER_REQUEST_MSG, dlm->key, 
-				       &request, sizeof(request), 
-				       inode, &response);
-		iput(inode);
-		if (ret >= 0) {
-			spin_lock(&mle->spinlock);
-			switch (response) {
-				case DLM_MASTER_RESP_YES:
-					set_bit(to, mle->response_map);
-					// dlmprintk("woot!  node %u is the "
-					// "master!\n", to);
-					mle->master = to;
-					break;
-				case DLM_MASTER_RESP_NO:
-					// dlmprintk("node %u is not the "
-					// "master, not in-progress\n", to);
-					set_bit(to, mle->response_map);
-					break;
-				case DLM_MASTER_RESP_MAYBE:
-					// dlmprintk("node %u is not the "
-					// "master, but IS in-progress\n", to);
-					set_bit(to, mle->response_map);
-					set_bit(to, mle->maybe_map);
-					break;
-				case DLM_MASTER_RESP_ERROR:
-					dlmprintk("node %u hit an -ENOMEM!  "
-						  "try everything again\n", to);
-					mle->error = 1;
-					break;
-				default:
-					dlmprintk("bad response! %u\n", 
-						  response);
-					ret = -EINVAL;
-					break;
-			}
-			spin_unlock(&mle->spinlock);
-		} else {
-			dlmprintk("net_send_message returned %d!\n", ret);
-		}
-	} else {
-		dlmprintk("nm_get_group_node_by_index failed to find inode "
-			  "for node %d!\n", to);
-	}	
-	return ret;
-}
-
-/*
- * NOTE: this can be used for debugging
- * can periodically run all locks owned by this node
- * and re-assert across the cluster...
- */
-static int dlm_do_assert_master(dlm_master_list_entry *mle)
-{
-	struct inode *inode = NULL;
-	dlm_ctxt *dlm = mle->dlm;
-	dlm_assert_master assert;
-	int to, start = 0, ret = 0, tmpret;
-
-	while (1) {
-		to = find_next_bit (mle->vote_map, NM_MAX_NODES, start);
-		if (to >= NM_MAX_NODES) {
-			// dlmprintk0("no more nodes\n");
-			break;
-		}
-		// dlmprintk("sending assert master to %d\n", to);
-
-		memset(&assert, 0, sizeof(assert));
-		assert.node_idx = dlm->group_index;
-		if (mle->type == DLM_MLE_BLOCK) {
-			assert.namelen = mle->u.name.len;
-			strncpy(assert.name, mle->u.name.name, assert.namelen);
-		} else {
-			assert.namelen = mle->u.res->lockname.len;
-			strncpy(assert.name, mle->u.res->lockname.name, 
-				assert.namelen);
-		}
-
-		inode = nm_get_group_node_by_index(dlm->group, to);
-		if (!inode) {
-			tmpret = -EINVAL;
-			dlmprintk("could not get nm info for node %d!  "
-				  "need to retry this whole thing\n", to);
-			ret = tmpret;
-			break;
-		}
-
-		dlm_assert_master_to_net(&assert);
-		tmpret = net_send_message(DLM_MASTER_REQUEST_MSG, dlm->key, 
-					  &assert, sizeof(assert), inode, NULL);
-		iput(inode);
-
-		if (tmpret < 0) {
-			// TODO
-			// dlmprintk("assert_master returned %d!\n", tmpret);
-			ret = tmpret;
-			break;
-		}
-		start = to+1;
-	}
-
-	return ret;
-}
-
-static void dlm_mle_node_down(struct inode *group, struct inode *node, 
-		       int idx, void *data)
-{
-	//int ret;
-	//struct inode *node = ptr2;
-
-	dlm_master_list_entry *mle;
-	dlm_ctxt *dlm;
-
-	mle = data;
-	if (!mle) {
-		dlmprintk0("eek! NULL mle!\n");
-		return;
-	}
-	if (!mle->dlm) {
-		dlmprintk0("eek! NULL dlm\n");
-		return;
-	}
-       	dlm = mle->dlm;
-	if (dlm->group != group)
-		return;
-
-	spin_lock(&mle->spinlock);
-
-	if (!test_bit(idx, mle->node_map))
-		dlmprintk("node %u already removed from nodemap!\n", idx);
-	else
-		clear_bit(idx, mle->node_map);
-
-#if 0	
-	if (test_bit(idx, mle->recovery_map))
-		dlmprintk("node %u already added to recovery map!\n", idx);
-	else
-		set_bit(idx, mle->recovery_map);
-#endif
-	spin_unlock(&mle->spinlock);
-}
-
-static void dlm_mle_node_up(struct inode *group, struct inode *node, 
-		     int idx, void *data)
-{
-	//struct inode *node = ptr2;
-	dlm_master_list_entry *mle;
-	dlm_ctxt *dlm;
-
-	mle = data;
-	if (!mle) {
-		dlmprintk0("eek! NULL mle!\n");
-		return;
-	}
-	if (!mle->dlm) {
-		dlmprintk0("eek! NULL dlm\n");
-		return;
-	}
-       	dlm = mle->dlm;
-	if (dlm->group != group)
-		return;
-
-	spin_lock(&mle->spinlock);
-
-#if 0	
-	if (test_bit(idx, mle->recovery_map))
-		dlmprintk("BUG!!! node up message on node "
-			  "in recovery (%u)!!!\n", idx);
-	else 
-#endif
-	{
-		if (test_bit(idx, mle->node_map))
-			dlmprintk("node %u already in node map!!!\n", idx);
-		else 
-			set_bit(idx, mle->node_map);
-	}
-
-	spin_unlock(&mle->spinlock);
-}



More information about the Ocfs2-commits mailing list