From 9ba7d6d08b6543c2f4aa58bd0ae4b8ece58c9fa3 Mon Sep 17 00:00:00 2001 From: Christine Caulfield Date: Wed, 23 Apr 2008 09:53:49 +0000 Subject: [PATCH] Simplify locking code by using saLckResourceLock rather than saLckResourceLockAsync. Thanks to Xinwei Hu for the patch. --- WHATS_NEW | 1 + daemons/clvmd/clvmd-openais.c | 81 +++++++---------------------------- 2 files changed, 17 insertions(+), 65 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index 821d41db8..234479fc0 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.36 - ================================= + Simply clvmd-openais by using non-async saLckResourceLock. Check lv_count in vg_validate. Fix internal LV counter when a snapshot is removed. Fix metadata corruption writing lvm1-formatted metadata with snapshots. diff --git a/daemons/clvmd/clvmd-openais.c b/daemons/clvmd/clvmd-openais.c index 9ac72a7f7..e07e04deb 100644 --- a/daemons/clvmd/clvmd-openais.c +++ b/daemons/clvmd/clvmd-openais.c @@ -50,11 +50,6 @@ /* Timeout value for several openais calls */ #define TIMEOUT 10 -static void lck_lock_callback(SaInvocationT invocation, - SaLckLockStatusT lockStatus, - SaAisErrorT error); -static void lck_unlock_callback(SaInvocationT invocation, - SaAisErrorT error); static void cpg_deliver_callback (cpg_handle_t handle, struct cpg_name *groupName, uint32_t nodeid, @@ -92,11 +87,6 @@ cpg_callbacks_t cpg_callbacks = { .cpg_confchg_fn = cpg_confchg_callback, }; -SaLckCallbacksT lck_callbacks = { - .saLckLockGrantCallback = lck_lock_callback, - .saLckResourceUnlockCallback = lck_unlock_callback -}; - struct node_info { enum {NODE_UNKNOWN, NODE_DOWN, NODE_UP, NODE_CLVMD} state; @@ -305,32 +295,6 @@ static void cpg_confchg_callback(cpg_handle_t handle, num_nodes = joined_list_entries; } -static void lck_lock_callback(SaInvocationT invocation, - SaLckLockStatusT lockStatus, - SaAisErrorT error) -{ - struct lock_wait *lwait = (struct lock_wait *)(long)invocation; - - DEBUGLOG("lck_lock_callback, error = %d\n", error); - - lwait->status = error; - pthread_mutex_lock(&lwait->mutex); - pthread_cond_signal(&lwait->cond); - pthread_mutex_unlock(&lwait->mutex); -} - -static void lck_unlock_callback(SaInvocationT invocation, - SaAisErrorT error) -{ - struct lock_wait *lwait = (struct lock_wait *)(long)invocation; - - DEBUGLOG("lck_unlock_callback\n"); - - lwait->status = SA_AIS_OK; - pthread_mutex_lock(&lwait->mutex); - pthread_cond_signal(&lwait->cond); - pthread_mutex_unlock(&lwait->mutex); -} static int lck_dispatch(struct local_client *client, char *buf, int len, const char *csid, struct local_client **new_client) @@ -359,7 +323,7 @@ static int _init_cluster(void) } err = saLckInitialize(&lck_handle, - &lck_callbacks, + NULL, &ver); if (err != SA_AIS_OK) { cpg_initialize(&cpg_handle, &cpg_callbacks); @@ -495,15 +459,11 @@ static int _cluster_do_node_callback(struct local_client *master_client, /* Real locking */ static int _lock_resource(char *resource, int mode, int flags, int *lockid) { - struct lock_wait lwait; struct lock_info *linfo; SaLckResourceHandleT res_handle; SaAisErrorT err; SaLckLockIdT lock_id; - - pthread_cond_init(&lwait.cond, NULL); - pthread_mutex_init(&lwait.mutex, NULL); - pthread_mutex_lock(&lwait.mutex); + SaLckLockStatusT lockStatus; /* This needs to be converted from DLM/LVM2 value for OpenAIS LCK */ if (flags & LCK_NONBLOCK) flags = SA_LCK_LOCK_NO_QUEUE; @@ -526,24 +486,24 @@ static int _lock_resource(char *resource, int mode, int flags, int *lockid) return ais_to_errno(err); } - err = saLckResourceLockAsync(res_handle, - (SaInvocationT)(long)&lwait, - &lock_id, - mode, - flags, - 0); - if (err != SA_AIS_OK) + err = saLckResourceLock( + res_handle, + &lock_id, + mode, + flags, + 0, + SA_TIME_END, + &lockStatus); + if (err != SA_AIS_OK && lockStatus != SA_LCK_LOCK_GRANTED) { free(linfo); saLckResourceClose(res_handle); return ais_to_errno(err); } - + /* Wait for it to complete */ - pthread_cond_wait(&lwait.cond, &lwait.mutex); - pthread_mutex_unlock(&lwait.mutex); - DEBUGLOG("lock_resource returning %d, lock_id=%llx\n", lwait.status, + DEBUGLOG("lock_resource returning %d, lock_id=%llx\n", err, lock_id); linfo->lock_id = lock_id; @@ -551,43 +511,34 @@ static int _lock_resource(char *resource, int mode, int flags, int *lockid) dm_hash_insert(lock_hash, resource, linfo); - return ais_to_errno(lwait.status); + return ais_to_errno(err); } static int _unlock_resource(char *resource, int lockid) { - struct lock_wait lwait; SaAisErrorT err; struct lock_info *linfo; - pthread_cond_init(&lwait.cond, NULL); - pthread_mutex_init(&lwait.mutex, NULL); - pthread_mutex_lock(&lwait.mutex); - DEBUGLOG("unlock_resource %s\n", resource); linfo = dm_hash_lookup(lock_hash, resource); if (!linfo) return 0; DEBUGLOG("unlock_resource: lockid: %llx\n", linfo->lock_id); - err = saLckResourceUnlockAsync((SaInvocationT)(long)&lwait, linfo->lock_id); + err = saLckResourceUnlock(linfo->lock_id, SA_TIME_END); if (err != SA_AIS_OK) { DEBUGLOG("Unlock returned %d\n", err); return ais_to_errno(err); } - /* Wait for it to complete */ - pthread_cond_wait(&lwait.cond, &lwait.mutex); - pthread_mutex_unlock(&lwait.mutex); - /* Release the resource */ dm_hash_remove(lock_hash, resource); saLckResourceClose(linfo->res_handle); free(linfo); - return ais_to_errno(lwait.status); + return ais_to_errno(err); } static int _sync_lock(const char *resource, int mode, int flags, int *lockid)