[Cluster-devel] cluster/magma-plugins dumb/dumb.c gulm/gulm-lo ...
lhh at sourceware.org
lhh at sourceware.org
Fri Jun 16 19:54:58 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL4
Changes by: lhh at sourceware.org 2006-06-16 19:54:57
Modified files:
magma-plugins/dumb: dumb.c
magma-plugins/gulm: gulm-lock.c gulm.c
magma-plugins/sm: sm.c
Log message:
Allow support for NULL locks in sm module. Set errno accordingly on gulm/dumb modules (#193128)
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma-plugins/dumb/dumb.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.2&r2=1.2.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma-plugins/gulm/gulm-lock.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.5.2.3&r2=1.5.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma-plugins/gulm/gulm.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.6.2.6&r2=1.6.2.7
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/magma-plugins/sm/sm.c.diff?cvsroot=cluster&only_with_tag=RHEL4&r1=1.9.2.8&r2=1.9.2.9
--- cluster/magma-plugins/dumb/Attic/dumb.c 2004/06/29 20:25:49 1.2
+++ cluster/magma-plugins/dumb/Attic/dumb.c 2006/06/16 19:54:56 1.2.2.1
@@ -35,7 +35,7 @@
#include <netinet/in.h>
#include <assert.h>
-#define MODULE_DESCRIPTION "Dumb Plugin v1.1"
+#define MODULE_DESCRIPTION "Dumb Plugin v1.1.1"
#define MODULE_AUTHOR "Lon Hohberger"
#define DUMB_LOCK_PATH "/tmp/magma-dumb"
@@ -158,6 +158,12 @@
//printf("DUMB: %s called\n", __FUNCTION__);
+ if ((flags & CLK_EX) == 0) {
+ /* NULL lock not supported */
+ errno = EINVAL;
+ return -1;
+ }
+
fdp = malloc(sizeof(int));
if (!fdp)
return -1;
--- cluster/magma-plugins/gulm/Attic/gulm-lock.c 2006/01/27 20:55:06 1.5.2.3
+++ cluster/magma-plugins/gulm/Attic/gulm-lock.c 2006/06/16 19:54:57 1.5.2.4
@@ -269,13 +269,14 @@
*lockpp = NULL;
- if (flags & CLK_EX) {
+ if ((flags & CLK_EX) == CLK_EX) {
state = lg_lock_state_Exclusive;
} else if (flags & CLK_READ) {
state = lg_lock_state_Shared;
} else if (flags & CLK_WRITE) {
state = lg_lock_state_Exclusive;
} else {
+ /* NULL Locks not supported on GULM */
errno = EINVAL;
return -1;
}
--- cluster/magma-plugins/gulm/Attic/gulm.c 2006/01/24 19:30:44 1.6.2.6
+++ cluster/magma-plugins/gulm/Attic/gulm.c 2006/06/16 19:54:57 1.6.2.7
@@ -34,7 +34,7 @@
#include <sys/types.h>
#include <linux/unistd.h>
-#define MODULE_DESCRIPTION "GuLM Plugin v1.0.4"
+#define MODULE_DESCRIPTION "GuLM Plugin v1.0.5"
#define MODULE_AUTHOR "Lon Hohberger"
--- cluster/magma-plugins/sm/Attic/sm.c 2006/05/15 16:59:11 1.9.2.8
+++ cluster/magma-plugins/sm/Attic/sm.c 2006/06/16 19:54:57 1.9.2.9
@@ -35,7 +35,7 @@
#include <sys/types.h>
#include <sys/select.h>
-#define MODULE_DESCRIPTION "CMAN/SM Plugin v1.1.6"
+#define MODULE_DESCRIPTION "CMAN/SM Plugin v1.1.7.1"
#define MODULE_AUTHOR "Lon Hohberger"
#define DLM_LS_NAME "Magma"
@@ -47,6 +47,7 @@
/* Internal */
static inline int _dlm_release_lockspace(sm_priv_t *p);
+static inline int _dlm_unlock(sm_priv_t *p, struct dlm_lksb *lksb);
/*
@@ -560,24 +561,13 @@
{
int ret;
- /*
- * per pjc: create/open lockspace when first lock is taken
- */
- ret = dlm_ls_lock(p->ls, mode, lksb, options, resource,
- strlen(resource), 0, ast_function, lksb,
- NULL, NULL);
-
- if (ret < 0) {
-#if 0
- if (errno == ENOENT) {
- /* This should not happen if we have a lock
- ref open in the LS ! */A
- assert(0);
- }
-#endif
+ /* Ok, we have the NL lock. Now convert it. */
+ ret = dlm_ls_lock(p->ls, mode, lksb, options,
+ resource, strlen(resource), 0, ast_function,
+ lksb, NULL, NULL);
+ if (ret < 0)
return -1;
- }
if ((ret = (wait_for_dlm_event(p->ls) < 0))) {
fprintf(stderr, "wait_for_dlm_event: %d / %d\n",
@@ -585,6 +575,7 @@
return -1;
}
+ /* Got the lock ! */
return 0;
}
@@ -760,42 +751,64 @@
p = (sm_priv_t *)self->cp_private.p_data;
assert(p);
- *lockpp = NULL;
- if (flags & CLK_EX) {
+
+ if ((flags & CLK_EX) == CLK_EX) {
mode = LKM_EXMODE;
} else if (flags & CLK_READ) {
mode = LKM_PRMODE;
} else if (flags & CLK_WRITE) {
mode = LKM_PWMODE;
- } else {
- errno = EINVAL;
- return -1;
+ } else if ((flags & CLK_EX) == 0){
+ mode = LKM_NLMODE;
}
if (flags & CLK_NOWAIT)
options = LKF_NOQUEUE;
+ if (flags & CLK_CONVERT)
+ flags &= ~CLK_HOLDER; /* CLK_HOLDER mutually exclusive with
+ CLK_CONVERT */
/* Allocate our lock structure. */
sz = (sizeof(*lksb) > sizeof(uint64_t) ? sizeof(*lksb) :
sizeof(uint64_t));
- lksb = malloc(sz);
- assert(lksb);
- memset(lksb, 0, sz);
-
- while(!p->ls) {
+ while(!p->ls)
_dlm_acquire_lockspace(p, DLM_LS_NAME);
- }
assert(p->ls);
+ /* If we've got a non-zero pointer and we're being called with
+ the CLK_CONVERT flag, then assume it's a previous lksb with
+ a held lock. */
+ if ((flags & CLK_CONVERT) && *lockpp) {
+ lksb = (struct lksb *)*lockpp;
+ options |= LKF_CONVERT;
+ } else {
+ lksb = malloc(sz);
+ assert(lksb);
+ memset(lksb, 0, sz);
+ }
+
+ /* Take the real lock, or at least, try to. */
ret = _dlm_lock(p, mode, lksb, options, resource);
- switch(lksb->sb_status) {
- case 0:
- *lockpp = (void *)lksb;
- return 0;
+ /* Got the lock? */
+ if (ret == 0) {
+ if (lksb->sb_status == 0) {
+ *lockpp = (void *)lksb;
+ return 0;
+ }
+
+ /* Flip errno so we only have one switch statement */
+ errno = lksb->sb_status;
+ }
+
+ switch(errno) {
case EAGAIN:
- if ((flags & CLK_HOLDER) &&
+ if (flags & CLK_CONVERT) {
+ *lockpp = (void *)lksb;
+ /* Nothing special here */
+ /* Lock is busy */
+ } else if ((flags & CLK_HOLDER) &&
(_get_holder(resource, p, mode, &holder) == 0)) {
memset(lksb, 0, sz);
*((uint64_t *)lksb) = holder;
@@ -806,7 +819,7 @@
errno = EAGAIN;
return -1;
default:
- fprintf(stderr, "_dlm_lock: %d / %d\n", ret, lksb->sb_status);
+ fprintf(stderr, "_dlm_lock: %d / %d\n", ret, errno);
ret = lksb->sb_status;
free(lksb);
errno = ret;
More information about the Cluster-devel
mailing list