[Cluster-devel] cluster/dlm-kernel/src dlm_internal.h lockspac ...
teigland at sourceware.org
teigland at sourceware.org
Thu Sep 14 21:50:52 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Branch: STABLE
Changes by: teigland at sourceware.org 2006-09-14 21:50:50
Modified files:
dlm-kernel/src : dlm_internal.h lockspace.c nodes.c recoverd.c
Log message:
Add a spinlock around the ls_nodes_gone list. The list is modified
during mounting/unmounting and traversed by dlm_recvd when a request
is received. This should fix bz 206463.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/dlm_internal.h.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.36.2.5&r2=1.36.2.5.6.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/lockspace.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.19.2.6.6.3&r2=1.19.2.6.6.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/nodes.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.10.2.2.4.1.2.2&r2=1.10.2.2.4.1.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm-kernel/src/recoverd.c.diff?cvsroot=cluster&only_with_tag=STABLE&r1=1.19.2.4&r2=1.19.2.4.6.1
--- cluster/dlm-kernel/src/Attic/dlm_internal.h 2005/03/29 08:01:59 1.36.2.5
+++ cluster/dlm-kernel/src/Attic/dlm_internal.h 2006/09/14 21:50:50 1.36.2.5.6.1
@@ -259,6 +259,7 @@
struct list_head ls_nodes; /* current nodes in ls */
struct list_head ls_nodes_gone; /* dead node list, recovery */
+ spinlock_t ls_nodes_gone_spin;
uint32_t ls_num_nodes; /* number of nodes in ls */
uint32_t ls_low_nodeid;
uint32_t * ls_node_array;
--- cluster/dlm-kernel/src/Attic/lockspace.c 2006/04/18 14:55:28 1.19.2.6.6.3
+++ cluster/dlm-kernel/src/Attic/lockspace.c 2006/09/14 21:50:50 1.19.2.6.6.4
@@ -322,6 +322,7 @@
INIT_LIST_HEAD(&ls->ls_nodes);
INIT_LIST_HEAD(&ls->ls_nodes_gone);
+ spin_lock_init(&ls->ls_nodes_gone_spin);
ls->ls_num_nodes = 0;
ls->ls_node_array = NULL;
ls->ls_recoverd_task = NULL;
--- cluster/dlm-kernel/src/Attic/nodes.c 2005/06/22 05:40:00 1.10.2.2.4.1.2.2
+++ cluster/dlm-kernel/src/Attic/nodes.c 2006/09/14 21:50:50 1.10.2.2.4.1.2.3
@@ -228,8 +228,10 @@
if (!found) {
neg++;
csb->gone_event = rv->event_id;
+ spin_lock(&ls->ls_nodes_gone_spin);
list_del(&csb->list);
list_add_tail(&csb->list, &ls->ls_nodes_gone);
+ spin_unlock(&ls->ls_nodes_gone_spin);
ls->ls_num_nodes--;
log_debug(ls, "remove node %u", csb->node->nodeid);
}
@@ -296,7 +298,19 @@
void ls_nodes_gone_clear(struct dlm_ls *ls)
{
- nodes_clear_list(&ls->ls_nodes_gone);
+ struct dlm_csb *csb;
+
+ retry:
+ spin_lock(&ls->ls_nodes_gone_spin);
+ if (list_empty(&ls->ls_nodes_gone))
+ goto out;
+ csb = list_entry(ls->ls_nodes_gone.next, struct dlm_csb, list);
+ list_del(&csb->list);
+ spin_unlock(&ls->ls_nodes_gone_spin);
+ release_csb(csb);
+ goto retry;
+ out:
+ spin_unlock(&ls->ls_nodes_gone_spin);
}
int ls_nodes_init(struct dlm_ls *ls, struct dlm_recover *rv)
@@ -339,9 +353,14 @@
{
struct dlm_csb *csb;
+ spin_lock(&ls->ls_nodes_gone_spin);
list_for_each_entry(csb, &ls->ls_nodes_gone, list) {
- if (csb->node->nodeid == nodeid)
+ if (csb->node->nodeid == nodeid) {
+ spin_unlock(&ls->ls_nodes_gone_spin);
return TRUE;
+ }
}
+ spin_unlock(&ls->ls_nodes_gone_spin);
return FALSE;
}
+
--- cluster/dlm-kernel/src/Attic/recoverd.c 2005/01/27 09:25:41 1.19.2.4
+++ cluster/dlm-kernel/src/Attic/recoverd.c 2006/09/14 21:50:50 1.19.2.4.6.1
@@ -226,12 +226,17 @@
{
struct dlm_csb *csb, *safe;
+ restart:
+ spin_lock(&ls->ls_nodes_gone_spin);
list_for_each_entry_safe(csb, safe, &ls->ls_nodes_gone, list) {
if (csb->gone_event <= finish_event) {
list_del(&csb->list);
+ spin_unlock(&ls->ls_nodes_gone_spin);
release_csb(csb);
+ goto restart;
}
}
+ spin_unlock(&ls->ls_nodes_gone_spin);
}
/*
More information about the Cluster-devel
mailing list