static int _unlock_resource(const char *resource, int lockid) { struct lock *lck; if (lockid < 0) { DEBUGLOG("Not tracking unlock of lockid -1: %s, lockid=%d\n", resource, lockid); return 0; } DEBUGLOG("Unlocking resource %s, lockid=%d\n", resource, lockid); pthread_mutex_lock(&_lock_mutex); if (!(lck = dm_hash_lookup(_locks, resource))) { pthread_mutex_unlock(&_lock_mutex); DEBUGLOG("Resource %s, lockid=%d is not locked.\n", resource, lockid); return 1; } if (lck->lockid != lockid) { pthread_mutex_unlock(&_lock_mutex); DEBUGLOG("Resource %s has wrong lockid %d, expected %d.\n", resource, lck->lockid, lockid); return 1; } dm_hash_remove(_locks, resource); dm_free(lck); pthread_cond_broadcast(&_lock_cond); /* wakeup waiters */ pthread_mutex_unlock(&_lock_mutex); return 0; }
static void remove_info(const char *resource) { int num_open; pthread_mutex_lock(&lv_hash_lock); dm_hash_remove(lv_hash, resource); /* When last lock is remove, validate there are not left opened devices */ if (!dm_hash_get_first(lv_hash)) { if (critical_section()) log_error(INTERNAL_ERROR "No volumes are locked however clvmd is in activation mode critical section."); if ((num_open = dev_cache_check_for_open_devices())) log_error(INTERNAL_ERROR "No volumes are locked however %d devices are still open.", num_open); } pthread_mutex_unlock(&lv_hash_lock); }
static void remove_info(const char *resource) { pthread_mutex_lock(&lv_hash_lock); dm_hash_remove(lv_hash, resource); pthread_mutex_unlock(&lv_hash_lock); }