Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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);
}
Exemplo n.º 3
0
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);
}