Replace uuid/type pair with volume object in the device config
It makes it possible to attach/load cache using volume types that have non-standard constructors. Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
This commit is contained in:
parent
54b951fcdf
commit
8858e7344d
@ -361,14 +361,17 @@ void ocf_mngt_cache_stop(ocf_cache_t cache,
|
|||||||
*/
|
*/
|
||||||
struct ocf_mngt_cache_device_config {
|
struct ocf_mngt_cache_device_config {
|
||||||
/**
|
/**
|
||||||
* @brief Cache volume UUID
|
* @brief Cache volume
|
||||||
|
*
|
||||||
|
* The volume ownership is moved to the context of operation that takes
|
||||||
|
* this config. Thus the volume is being effectively moved using
|
||||||
|
* ocf_volume_move(), leaving the original volume uninitialized.
|
||||||
|
*
|
||||||
|
* Note that if the original volume was instantiated using *_create
|
||||||
|
* function, it still needs to be destroyed using ocf_volume_destroy()
|
||||||
|
* to deallocate the memory.
|
||||||
*/
|
*/
|
||||||
struct ocf_volume_uuid uuid;
|
ocf_volume_t volume;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Cache volume type
|
|
||||||
*/
|
|
||||||
uint8_t volume_type;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief If set, cache features (like discard) are tested
|
* @brief If set, cache features (like discard) are tested
|
||||||
|
@ -135,10 +135,6 @@ struct ocf_cache_attach_context {
|
|||||||
* load or recovery
|
* load or recovery
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool uuid_copied : 1;
|
|
||||||
/*!< copied uuid data to context.
|
|
||||||
*/
|
|
||||||
|
|
||||||
bool metadata_frozen : 1;
|
bool metadata_frozen : 1;
|
||||||
/*!< metadata reference counter frozen
|
/*!< metadata reference counter frozen
|
||||||
*/
|
*/
|
||||||
@ -790,7 +786,6 @@ static void _ocf_mngt_attach_cache_device(ocf_pipeline_t pipeline,
|
|||||||
struct ocf_cache_attach_context *context = priv;
|
struct ocf_cache_attach_context *context = priv;
|
||||||
struct ocf_mngt_cache_device_config *device_cfg = &context->cfg.device;
|
struct ocf_mngt_cache_device_config *device_cfg = &context->cfg.device;
|
||||||
ocf_cache_t cache = context->cache;
|
ocf_cache_t cache = context->cache;
|
||||||
ocf_volume_type_t type;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
cache->device = env_vzalloc(sizeof(*cache->device));
|
cache->device = env_vzalloc(sizeof(*cache->device));
|
||||||
@ -799,20 +794,9 @@ static void _ocf_mngt_attach_cache_device(ocf_pipeline_t pipeline,
|
|||||||
|
|
||||||
context->flags.device_alloc = true;
|
context->flags.device_alloc = true;
|
||||||
|
|
||||||
/* Prepare UUID of cache volume */
|
ocf_volume_move(&cache->device->volume, device_cfg->volume);
|
||||||
type = ocf_ctx_get_volume_type(cache->owner, device_cfg->volume_type);
|
|
||||||
if (!type) {
|
|
||||||
OCF_PL_FINISH_RET(pipeline,
|
|
||||||
-OCF_ERR_INVAL_VOLUME_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ocf_volume_init(&cache->device->volume, type,
|
|
||||||
&device_cfg->uuid, true);
|
|
||||||
if (ret)
|
|
||||||
OCF_PL_FINISH_RET(pipeline, ret);
|
|
||||||
|
|
||||||
cache->device->volume.cache = cache;
|
|
||||||
context->flags.volume_inited = true;
|
context->flags.volume_inited = true;
|
||||||
|
cache->device->volume.cache = cache;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open cache device, It has to be done first because metadata service
|
* Open cache device, It has to be done first because metadata service
|
||||||
@ -1279,8 +1263,6 @@ uint64_t _ocf_mngt_calculate_ram_needed(ocf_cache_line_size_t line_size,
|
|||||||
int ocf_mngt_get_ram_needed(ocf_cache_t cache,
|
int ocf_mngt_get_ram_needed(ocf_cache_t cache,
|
||||||
struct ocf_mngt_cache_device_config *cfg, uint64_t *ram_needed)
|
struct ocf_mngt_cache_device_config *cfg, uint64_t *ram_needed)
|
||||||
{
|
{
|
||||||
ocf_volume_t volume;
|
|
||||||
ocf_volume_type_t type;
|
|
||||||
ocf_cache_line_size_t line_size;
|
ocf_cache_line_size_t line_size;
|
||||||
uint64_t volume_size;
|
uint64_t volume_size;
|
||||||
int result;
|
int result;
|
||||||
@ -1289,26 +1271,15 @@ int ocf_mngt_get_ram_needed(ocf_cache_t cache,
|
|||||||
OCF_CHECK_NULL(cfg);
|
OCF_CHECK_NULL(cfg);
|
||||||
OCF_CHECK_NULL(ram_needed);
|
OCF_CHECK_NULL(ram_needed);
|
||||||
|
|
||||||
type = ocf_ctx_get_volume_type(cache->owner, cfg->volume_type);
|
result = ocf_volume_open(cfg->volume, cfg->volume_params);
|
||||||
if (!type)
|
|
||||||
return -OCF_ERR_INVAL_VOLUME_TYPE;
|
|
||||||
|
|
||||||
result = ocf_volume_create(&volume, type, &cfg->uuid);
|
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
result = ocf_volume_open(volume, cfg->volume_params);
|
|
||||||
if (result) {
|
|
||||||
ocf_volume_destroy(volume);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
line_size = ocf_line_size(cache);
|
line_size = ocf_line_size(cache);
|
||||||
volume_size = ocf_volume_get_length(volume);
|
volume_size = ocf_volume_get_length(cfg->volume);
|
||||||
*ram_needed = _ocf_mngt_calculate_ram_needed(line_size, volume_size);
|
*ram_needed = _ocf_mngt_calculate_ram_needed(line_size, volume_size);
|
||||||
|
|
||||||
ocf_volume_close(volume);
|
ocf_volume_close(cfg->volume);
|
||||||
ocf_volume_destroy(volume);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1479,34 +1450,6 @@ static void _ocf_mngt_init_attached_nonpersistent(ocf_pipeline_t pipeline,
|
|||||||
ocf_pipeline_next(pipeline);
|
ocf_pipeline_next(pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _ocf_mngt_copy_uuid_data(ocf_pipeline_t pipeline,
|
|
||||||
void *priv, ocf_pipeline_arg_t arg)
|
|
||||||
{
|
|
||||||
struct ocf_cache_attach_context *context = priv;
|
|
||||||
struct ocf_mngt_cache_device_config *device_cfg = &context->cfg.device;
|
|
||||||
void *data;
|
|
||||||
int result;
|
|
||||||
|
|
||||||
if (device_cfg->uuid.size == 0)
|
|
||||||
OCF_PL_NEXT_RET(pipeline);
|
|
||||||
|
|
||||||
data = env_vmalloc(device_cfg->uuid.size);
|
|
||||||
if (!data)
|
|
||||||
OCF_PL_FINISH_RET(pipeline, -OCF_ERR_NO_MEM);
|
|
||||||
|
|
||||||
result = env_memcpy(data, device_cfg->uuid.size, device_cfg->uuid.data,
|
|
||||||
device_cfg->uuid.size);
|
|
||||||
if (result) {
|
|
||||||
env_vfree(data);
|
|
||||||
OCF_PL_FINISH_RET(pipeline, -OCF_ERR_INVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
device_cfg->uuid.data = data;
|
|
||||||
context->flags.uuid_copied = true;
|
|
||||||
|
|
||||||
ocf_pipeline_next(pipeline);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void _ocf_mngt_attach_check_ram(ocf_pipeline_t pipeline,
|
static void _ocf_mngt_attach_check_ram(ocf_pipeline_t pipeline,
|
||||||
void *priv, ocf_pipeline_arg_t arg)
|
void *priv, ocf_pipeline_arg_t arg)
|
||||||
{
|
{
|
||||||
@ -1799,6 +1742,8 @@ static void _ocf_mngt_attach_handle_error(
|
|||||||
|
|
||||||
if (context->flags.volume_inited)
|
if (context->flags.volume_inited)
|
||||||
ocf_volume_deinit(&cache->device->volume);
|
ocf_volume_deinit(&cache->device->volume);
|
||||||
|
else
|
||||||
|
ocf_volume_deinit(context->cfg.device.volume);
|
||||||
|
|
||||||
if (context->flags.front_volume_opened)
|
if (context->flags.front_volume_opened)
|
||||||
ocf_volume_close(&cache->device->front_volume);
|
ocf_volume_close(&cache->device->front_volume);
|
||||||
@ -1824,16 +1769,12 @@ static void _ocf_mngt_cache_attach_finish(ocf_pipeline_t pipeline,
|
|||||||
void *priv, int error)
|
void *priv, int error)
|
||||||
{
|
{
|
||||||
struct ocf_cache_attach_context *context = priv;
|
struct ocf_cache_attach_context *context = priv;
|
||||||
struct ocf_mngt_cache_device_config *device_cfg = &context->cfg.device;
|
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
_ocf_mngt_attach_handle_error(context);
|
_ocf_mngt_attach_handle_error(context);
|
||||||
|
|
||||||
context->cmpl(context->cache, context->priv1, context->priv2, error);
|
context->cmpl(context->cache, context->priv1, context->priv2, error);
|
||||||
|
|
||||||
if (context->flags.uuid_copied)
|
|
||||||
env_vfree(device_cfg->uuid.data);
|
|
||||||
|
|
||||||
ocf_pipeline_destroy(context->pipeline);
|
ocf_pipeline_destroy(context->pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1841,7 +1782,6 @@ struct ocf_pipeline_properties _ocf_mngt_cache_attach_pipeline_properties = {
|
|||||||
.priv_size = sizeof(struct ocf_cache_attach_context),
|
.priv_size = sizeof(struct ocf_cache_attach_context),
|
||||||
.finish = _ocf_mngt_cache_attach_finish,
|
.finish = _ocf_mngt_cache_attach_finish,
|
||||||
.steps = {
|
.steps = {
|
||||||
OCF_PL_STEP(_ocf_mngt_copy_uuid_data),
|
|
||||||
OCF_PL_STEP(_ocf_mngt_init_attached_nonpersistent),
|
OCF_PL_STEP(_ocf_mngt_init_attached_nonpersistent),
|
||||||
OCF_PL_STEP(_ocf_mngt_attach_cache_device),
|
OCF_PL_STEP(_ocf_mngt_attach_cache_device),
|
||||||
OCF_PL_STEP(_ocf_mngt_init_properties),
|
OCF_PL_STEP(_ocf_mngt_init_properties),
|
||||||
@ -1868,7 +1808,6 @@ struct ocf_pipeline_properties _ocf_mngt_cache_load_pipeline_properties = {
|
|||||||
.priv_size = sizeof(struct ocf_cache_attach_context),
|
.priv_size = sizeof(struct ocf_cache_attach_context),
|
||||||
.finish = _ocf_mngt_cache_attach_finish,
|
.finish = _ocf_mngt_cache_attach_finish,
|
||||||
.steps = {
|
.steps = {
|
||||||
OCF_PL_STEP(_ocf_mngt_copy_uuid_data),
|
|
||||||
OCF_PL_STEP(_ocf_mngt_init_attached_nonpersistent),
|
OCF_PL_STEP(_ocf_mngt_init_attached_nonpersistent),
|
||||||
OCF_PL_STEP(_ocf_mngt_attach_cache_device),
|
OCF_PL_STEP(_ocf_mngt_attach_cache_device),
|
||||||
OCF_PL_STEP(_ocf_mngt_init_properties),
|
OCF_PL_STEP(_ocf_mngt_init_properties),
|
||||||
@ -2265,7 +2204,6 @@ struct ocf_pipeline_properties _ocf_mngt_cache_standby_attach_pipeline_propertie
|
|||||||
.priv_size = sizeof(struct ocf_cache_attach_context),
|
.priv_size = sizeof(struct ocf_cache_attach_context),
|
||||||
.finish = _ocf_mngt_cache_attach_finish,
|
.finish = _ocf_mngt_cache_attach_finish,
|
||||||
.steps = {
|
.steps = {
|
||||||
OCF_PL_STEP(_ocf_mngt_copy_uuid_data),
|
|
||||||
OCF_PL_STEP(_ocf_mngt_init_attached_nonpersistent),
|
OCF_PL_STEP(_ocf_mngt_init_attached_nonpersistent),
|
||||||
OCF_PL_STEP(_ocf_mngt_attach_cache_device),
|
OCF_PL_STEP(_ocf_mngt_attach_cache_device),
|
||||||
OCF_PL_STEP(_ocf_mngt_attach_read_properties),
|
OCF_PL_STEP(_ocf_mngt_attach_read_properties),
|
||||||
@ -2292,7 +2230,6 @@ struct ocf_pipeline_properties _ocf_mngt_cache_standby_load_pipeline_properties
|
|||||||
.priv_size = sizeof(struct ocf_cache_attach_context),
|
.priv_size = sizeof(struct ocf_cache_attach_context),
|
||||||
.finish = _ocf_mngt_cache_attach_finish,
|
.finish = _ocf_mngt_cache_attach_finish,
|
||||||
.steps = {
|
.steps = {
|
||||||
OCF_PL_STEP(_ocf_mngt_copy_uuid_data),
|
|
||||||
OCF_PL_STEP(_ocf_mngt_init_attached_nonpersistent),
|
OCF_PL_STEP(_ocf_mngt_init_attached_nonpersistent),
|
||||||
OCF_PL_STEP(_ocf_mngt_attach_cache_device),
|
OCF_PL_STEP(_ocf_mngt_attach_cache_device),
|
||||||
OCF_PL_STEP(_ocf_mngt_init_cache_front_volume),
|
OCF_PL_STEP(_ocf_mngt_init_cache_front_volume),
|
||||||
@ -2342,20 +2279,9 @@ static void _ocf_mngt_activate_set_cache_device(ocf_pipeline_t pipeline,
|
|||||||
struct ocf_cache_attach_context *context = priv;
|
struct ocf_cache_attach_context *context = priv;
|
||||||
struct ocf_mngt_cache_device_config *device_cfg = &context->cfg.device;
|
struct ocf_mngt_cache_device_config *device_cfg = &context->cfg.device;
|
||||||
ocf_cache_t cache = context->cache;
|
ocf_cache_t cache = context->cache;
|
||||||
ocf_volume_type_t type;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
type = ocf_ctx_get_volume_type(cache->owner, device_cfg->volume_type);
|
ocf_volume_move(&cache->device->volume, device_cfg->volume);
|
||||||
if (!type) {
|
|
||||||
OCF_PL_FINISH_RET(pipeline,
|
|
||||||
-OCF_ERR_INVAL_VOLUME_TYPE);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ocf_volume_init(&cache->device->volume, type,
|
|
||||||
&device_cfg->uuid, true);
|
|
||||||
if (ret)
|
|
||||||
OCF_PL_FINISH_RET(pipeline, ret);
|
|
||||||
|
|
||||||
cache->device->volume.cache = cache;
|
cache->device->volume.cache = cache;
|
||||||
context->flags.volume_inited = true;
|
context->flags.volume_inited = true;
|
||||||
|
|
||||||
@ -2467,6 +2393,8 @@ static void _ocf_mngt_activate_handle_error(
|
|||||||
|
|
||||||
if (context->flags.volume_inited)
|
if (context->flags.volume_inited)
|
||||||
ocf_volume_deinit(&cache->device->volume);
|
ocf_volume_deinit(&cache->device->volume);
|
||||||
|
else
|
||||||
|
ocf_volume_deinit(context->cfg.device.volume);
|
||||||
|
|
||||||
if (context->flags.volume_stored)
|
if (context->flags.volume_stored)
|
||||||
ocf_volume_move(&cache->device->volume, &context->cache_volume);
|
ocf_volume_move(&cache->device->volume, &context->cache_volume);
|
||||||
@ -2479,7 +2407,6 @@ static void _ocf_mngt_cache_activate_finish(ocf_pipeline_t pipeline,
|
|||||||
void *priv, int error)
|
void *priv, int error)
|
||||||
{
|
{
|
||||||
struct ocf_cache_attach_context *context = priv;
|
struct ocf_cache_attach_context *context = priv;
|
||||||
struct ocf_mngt_cache_device_config *device_cfg = &context->cfg.device;
|
|
||||||
ocf_cache_t cache = context->cache;
|
ocf_cache_t cache = context->cache;
|
||||||
ocf_pipeline_t stop_pipeline;
|
ocf_pipeline_t stop_pipeline;
|
||||||
|
|
||||||
@ -2504,12 +2431,9 @@ static void _ocf_mngt_cache_activate_finish(ocf_pipeline_t pipeline,
|
|||||||
ocf_volume_deinit(&context->cache_volume);
|
ocf_volume_deinit(&context->cache_volume);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
context->cmpl(context->cache, context->priv1, context->priv2, error);
|
context->cmpl(context->cache, context->priv1, context->priv2, error);
|
||||||
|
|
||||||
if (context->flags.uuid_copied)
|
|
||||||
env_vfree(device_cfg->uuid.data);
|
|
||||||
ocf_pipeline_destroy(context->pipeline);
|
ocf_pipeline_destroy(context->pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2517,7 +2441,6 @@ struct ocf_pipeline_properties _ocf_mngt_cache_activate_pipeline_properties = {
|
|||||||
.priv_size = sizeof(struct ocf_cache_attach_context),
|
.priv_size = sizeof(struct ocf_cache_attach_context),
|
||||||
.finish = _ocf_mngt_cache_activate_finish,
|
.finish = _ocf_mngt_cache_activate_finish,
|
||||||
.steps = {
|
.steps = {
|
||||||
OCF_PL_STEP(_ocf_mngt_copy_uuid_data),
|
|
||||||
OCF_PL_STEP(_ocf_mngt_activate_set_cache_device),
|
OCF_PL_STEP(_ocf_mngt_activate_set_cache_device),
|
||||||
OCF_PL_STEP(_ocf_mngt_activate_init_properties),
|
OCF_PL_STEP(_ocf_mngt_activate_init_properties),
|
||||||
OCF_PL_STEP(_ocf_mngt_activate_compare_superblock),
|
OCF_PL_STEP(_ocf_mngt_activate_compare_superblock),
|
||||||
@ -2864,10 +2787,7 @@ static int _ocf_mngt_cache_validate_cfg(struct ocf_mngt_cache_config *cfg)
|
|||||||
static int _ocf_mngt_cache_validate_device_cfg(
|
static int _ocf_mngt_cache_validate_device_cfg(
|
||||||
struct ocf_mngt_cache_device_config *device_cfg)
|
struct ocf_mngt_cache_device_config *device_cfg)
|
||||||
{
|
{
|
||||||
if (!device_cfg->uuid.data)
|
if (!device_cfg->volume)
|
||||||
return -OCF_ERR_INVAL;
|
|
||||||
|
|
||||||
if (device_cfg->uuid.size > OCF_VOLUME_UUID_MAX_SIZE)
|
|
||||||
return -OCF_ERR_INVAL;
|
return -OCF_ERR_INVAL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user