[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