116 lines
2.5 KiB
C
116 lines
2.5 KiB
C
/*
|
|
* Copyright(c) 2012-2018 Intel Corporation
|
|
* SPDX-License-Identifier: BSD-3-Clause-Clear
|
|
*/
|
|
|
|
#include "ocf/ocf.h"
|
|
#include "ocf_mngt_common.h"
|
|
#include "../ocf_priv.h"
|
|
#include "../ocf_core_priv.h"
|
|
#include "../ocf_ctx_priv.h"
|
|
|
|
void ocf_mngt_core_pool_init(ocf_ctx_t ctx)
|
|
{
|
|
OCF_CHECK_NULL(ctx);
|
|
INIT_LIST_HEAD(&ctx->core_pool.core_pool_head);
|
|
}
|
|
|
|
int ocf_mngt_core_pool_get_count(ocf_ctx_t ctx)
|
|
{
|
|
int count;
|
|
OCF_CHECK_NULL(ctx);
|
|
env_mutex_lock(&ctx->lock);
|
|
count = ctx->core_pool.core_pool_count;
|
|
env_mutex_unlock(&ctx->lock);
|
|
return count;
|
|
}
|
|
|
|
int ocf_mngt_core_pool_add(ocf_ctx_t ctx, ocf_uuid_t uuid, uint8_t type)
|
|
{
|
|
ocf_volume_t volume;
|
|
|
|
int result = 0;
|
|
|
|
OCF_CHECK_NULL(ctx);
|
|
|
|
result = ocf_ctx_volume_create(ctx, &volume, uuid, type);
|
|
if (result)
|
|
return result;
|
|
|
|
result = ocf_volume_open(volume, NULL);
|
|
if (result) {
|
|
ocf_volume_deinit(volume);
|
|
return result;
|
|
}
|
|
|
|
env_mutex_lock(&ctx->lock);
|
|
list_add(&volume->core_pool_item, &ctx->core_pool.core_pool_head);
|
|
ctx->core_pool.core_pool_count++;
|
|
env_mutex_unlock(&ctx->lock);
|
|
return result;
|
|
}
|
|
|
|
int ocf_mngt_core_pool_visit(ocf_ctx_t ctx,
|
|
int (*visitor)(ocf_uuid_t, void *), void *visitor_ctx)
|
|
{
|
|
int result = 0;
|
|
ocf_volume_t svolume;
|
|
|
|
OCF_CHECK_NULL(ctx);
|
|
OCF_CHECK_NULL(visitor);
|
|
|
|
env_mutex_lock(&ctx->lock);
|
|
list_for_each_entry(svolume, &ctx->core_pool.core_pool_head,
|
|
core_pool_item) {
|
|
result = visitor(&svolume->uuid, visitor_ctx);
|
|
if (result)
|
|
break;
|
|
}
|
|
env_mutex_unlock(&ctx->lock);
|
|
return result;
|
|
}
|
|
|
|
ocf_volume_t ocf_mngt_core_pool_lookup(ocf_ctx_t ctx, ocf_uuid_t uuid,
|
|
ocf_volume_type_t type)
|
|
{
|
|
ocf_volume_t svolume;
|
|
|
|
OCF_CHECK_NULL(ctx);
|
|
OCF_CHECK_NULL(uuid);
|
|
OCF_CHECK_NULL(uuid->data);
|
|
|
|
list_for_each_entry(svolume, &ctx->core_pool.core_pool_head,
|
|
core_pool_item) {
|
|
if (svolume->type == type && !env_strncmp(svolume->uuid.data,
|
|
uuid->data, OCF_MIN(svolume->uuid.size, uuid->size))) {
|
|
return svolume;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void ocf_mngt_core_pool_remove(ocf_ctx_t ctx, ocf_volume_t volume)
|
|
{
|
|
OCF_CHECK_NULL(ctx);
|
|
OCF_CHECK_NULL(volume);
|
|
env_mutex_lock(&ctx->lock);
|
|
ctx->core_pool.core_pool_count--;
|
|
list_del(&volume->core_pool_item);
|
|
env_mutex_unlock(&ctx->lock);
|
|
ocf_volume_destroy(volume);
|
|
}
|
|
|
|
void ocf_mngt_core_pool_deinit(ocf_ctx_t ctx)
|
|
{
|
|
ocf_volume_t svolume, tvolume;
|
|
|
|
OCF_CHECK_NULL(ctx);
|
|
|
|
list_for_each_entry_safe(svolume, tvolume, &ctx->core_pool.core_pool_head,
|
|
core_pool_item) {
|
|
ocf_volume_close(svolume);
|
|
ocf_mngt_core_pool_remove(ctx, svolume);
|
|
}
|
|
}
|