diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index b3dbb2a..83e5014 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -1344,11 +1344,11 @@ int cache_mngt_add_core_to_cache(const char *cache_name, size_t name_len, if (result) goto error_affter_lock; - result = block_dev_create_exported_object(core); + result = kcas_core_create_exported_object(core); if (result) goto error_after_add_core; - result = block_dev_activate_exported_object(core); + result = kcas_core_activate_exported_object(core); if (result) goto error_after_create_exported_object; @@ -1366,7 +1366,7 @@ int cache_mngt_add_core_to_cache(const char *cache_name, size_t name_len, return 0; error_after_create_exported_object: - block_dev_destroy_exported_object(core); + kcas_core_destroy_exported_object(core); error_after_add_core: init_completion(&remove_context.cmpl); @@ -1386,11 +1386,11 @@ static int _cache_mngt_create_exported_object(ocf_core_t core, void *cntx) { int result; - result = block_dev_create_exported_object(core); + result = kcas_core_create_exported_object(core); if (result) return result; - result = block_dev_activate_exported_object(core); + result = kcas_core_activate_exported_object(core); return result; } @@ -1485,7 +1485,7 @@ static int _cache_mngt_remove_core_prepare(ocf_cache_t cache, ocf_core_t core, if (!core_active) return -OCF_ERR_CORE_IN_INACTIVE_STATE; - result = block_dev_destroy_exported_object(core); + result = kcas_core_destroy_exported_object(core); if (result) return result; @@ -1589,7 +1589,7 @@ int cache_mngt_remove_inactive_core(struct kcas_remove_inactive *cmd) * exported object, instead of trying rolling this back we rather * inform user about error. */ - result = block_dev_destroy_exported_object(core); + result = kcas_core_destroy_exported_object(core); if (result) goto unlock; @@ -1728,7 +1728,7 @@ out_get: static int _cache_mngt_destroy_exported_object(ocf_core_t core, void *cntx) { - if (block_dev_destroy_exported_object(core)) { + if (kcas_core_destroy_exported_object(core)) { ocf_cache_t cache = ocf_core_get_cache(core); printk(KERN_ERR "Cannot to destroy exported object, %s.%s\n", @@ -2491,7 +2491,7 @@ int cache_mngt_exit_instance(const char *cache_name, size_t name_len, int flush) } /* Destroy cache devices */ - status = block_dev_destroy_all_exported_objects(cache); + status = kcas_cache_destroy_all_core_exported_objects(cache); if (status != 0) { printk(KERN_WARNING "Failed to remove all cached devices\n"); diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index d50f78d..5cd0cb6 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -448,27 +448,10 @@ static struct casdsk_exp_obj_ops _blockdev_exp_obj_ops = { .submit_bio = _blockdev_submit_bio, }; -/** - * @brief this routine actually adds /dev/casM-N inode - */ -int block_dev_activate_exported_object(ocf_core_t core) -{ - int ret; - ocf_volume_t obj = ocf_core_get_volume(core); - ocf_cache_t cache = ocf_core_get_cache(core); - struct bd_object *bvol = bd_object(obj); +/**************************************** + * Exported object management functions * + ****************************************/ - ret = casdisk_functions.casdsk_exp_obj_activate(bvol->dsk); - if (ret) { - if (-EEXIST == ret) - ret = KCAS_ERR_FILE_EXISTS; - printk(KERN_ERR "Cannot activate exported object, %s.%s. " - "Error code %d\n", ocf_cache_get_name(cache), - ocf_core_get_name(core), ret); - } - - return ret; -} static const char *get_cache_id_string(ocf_cache_t cache) { @@ -480,37 +463,31 @@ static const char *get_core_id_string(ocf_core_t core) return ocf_core_get_name(core) + sizeof("core") - 1; } -int block_dev_create_exported_object(ocf_core_t core) +static int kcas_volume_create_exported_object(ocf_volume_t volume, + const char *name, void *priv, struct casdsk_exp_obj_ops *ops) { - ocf_volume_t obj = ocf_core_get_volume(core); - ocf_cache_t cache = ocf_core_get_cache(core); - struct bd_object *bvol = bd_object(obj); - const struct ocf_volume_uuid *uuid = ocf_volume_get_uuid(obj); + struct bd_object *bvol = bd_object(volume); + const struct ocf_volume_uuid *uuid = ocf_volume_get_uuid(volume); char dev_name[DISK_NAME_LEN]; struct casdsk_disk *dsk; int result; - snprintf(dev_name, DISK_NAME_LEN, "cas%s-%s", - get_cache_id_string(cache), - get_core_id_string(core)); - - dsk = casdisk_functions.casdsk_disk_claim(uuid->data, core); + dsk = casdisk_functions.casdsk_disk_claim(uuid->data, priv); if (dsk != bvol->dsk) { result = -KCAS_ERR_SYSTEM; goto end; } - bvol->expobj_wq = alloc_workqueue("expobj_wq%s-%s", + bvol->expobj_wq = alloc_workqueue("expobj_wq_%s", WQ_MEM_RECLAIM | WQ_HIGHPRI, 0, - get_cache_id_string(cache), - get_core_id_string(core)); + name); if (!bvol->expobj_wq) { result = -ENOMEM; goto end; } - result = casdisk_functions.casdsk_exp_obj_create(dsk, dev_name, - THIS_MODULE, &_blockdev_exp_obj_ops); + result = casdisk_functions.casdsk_exp_obj_create(dsk, name, + THIS_MODULE, ops); if (result) { destroy_workqueue(bvol->expobj_wq); goto end; @@ -526,34 +503,87 @@ end: return result; } -int block_dev_destroy_exported_object(ocf_core_t core) +static int kcas_volume_destroy_exported_object(ocf_volume_t volume) { - int ret = 0; - ocf_volume_t obj = ocf_core_get_volume(core); - struct bd_object *bvol = bd_object(obj); + struct bd_object *bvol = bd_object(volume); + int result; if (!bvol->expobj_valid) return 0; - ret = casdisk_functions.casdsk_exp_obj_lock(bvol->dsk); - if (ret) { - if (-EBUSY == ret) - ret = -KCAS_ERR_DEV_PENDING; - return ret; - } + result = casdisk_functions.casdsk_exp_obj_lock(bvol->dsk); + if (result == -EBUSY) + return -KCAS_ERR_DEV_PENDING; + else if (result) + return result; - ret = casdisk_functions.casdsk_exp_obj_destroy(bvol->dsk); - if (!ret) + result = casdisk_functions.casdsk_exp_obj_destroy(bvol->dsk); + if (!result) bvol->expobj_valid = false; destroy_workqueue(bvol->expobj_wq); casdisk_functions.casdsk_exp_obj_unlock(bvol->dsk); - return ret; + return result; } -static int _block_dev_lock_exported_object(ocf_core_t core, void *cntx) +/** + * @brief this routine actually adds /dev/casM-N inode + */ +static int kcas_volume_activate_exported_object(ocf_volume_t volume, + struct casdsk_exp_obj_ops *ops) +{ + struct bd_object *bvol = bd_object(volume); + int result; + + result = casdisk_functions.casdsk_exp_obj_activate(bvol->dsk); + if (result == -EEXIST) + result = -KCAS_ERR_FILE_EXISTS; + + return result; +} + +int kcas_core_create_exported_object(ocf_core_t core) +{ + ocf_cache_t cache = ocf_core_get_cache(core); + ocf_volume_t volume = ocf_core_get_volume(core); + char dev_name[DISK_NAME_LEN]; + + snprintf(dev_name, DISK_NAME_LEN, "cas%s-%s", + get_cache_id_string(cache), + get_core_id_string(core)); + + return kcas_volume_create_exported_object(volume, dev_name, core, + &_blockdev_exp_obj_ops); +} + +int kcas_core_destroy_exported_object(ocf_core_t core) +{ + ocf_volume_t volume = ocf_core_get_volume(core); + + return kcas_volume_destroy_exported_object(volume); +} + +int kcas_core_activate_exported_object(ocf_core_t core) +{ + ocf_cache_t cache = ocf_core_get_cache(core); + ocf_volume_t volume = ocf_core_get_volume(core); + int result; + + result = kcas_volume_activate_exported_object(volume, + &_blockdev_exp_obj_ops); + + if (result) { + printk(KERN_ERR "Cannot activate exported object, %s.%s. " + "Error code %d\n", ocf_cache_get_name(cache), + ocf_core_get_name(core), result); + } + + return result; +} + +static int kcas_core_lock_exported_object(ocf_core_t core, void *cntx) { int result; struct bd_object *bvol = bd_object( @@ -575,7 +605,7 @@ static int _block_dev_lock_exported_object(ocf_core_t core, void *cntx) return 0; } -static int _block_dev_unlock_exported_object(ocf_core_t core, void *cntx) +static int kcas_core_unlock_exported_object(ocf_core_t core, void *cntx) { struct bd_object *bvol = bd_object( ocf_core_get_volume(core)); @@ -588,7 +618,7 @@ static int _block_dev_unlock_exported_object(ocf_core_t core, void *cntx) return 0; } -static int _block_dev_stop_exported_object(ocf_core_t core, void *cntx) +static int kcas_core_stop_exported_object(ocf_core_t core, void *cntx) { struct bd_object *bvol = bd_object( ocf_core_get_volume(core)); @@ -613,31 +643,31 @@ static int _block_dev_stop_exported_object(ocf_core_t core, void *cntx) return 0; } -static int _block_dev_free_exported_object(ocf_core_t core, void *cntx) +static int kcas_core_free_exported_object(ocf_core_t core, void *cntx) { - struct bd_object *bvol = bd_object( - ocf_core_get_volume(core)); + struct bd_object *bvol = bd_object(ocf_core_get_volume(core)); casdisk_functions.casdsk_exp_obj_free(bvol->dsk); + return 0; } -int block_dev_destroy_all_exported_objects(ocf_cache_t cache) +int kcas_cache_destroy_all_core_exported_objects(ocf_cache_t cache) { int result; /* Try lock exported objects */ - result = ocf_core_visit(cache, _block_dev_lock_exported_object, NULL, + result = ocf_core_visit(cache, kcas_core_lock_exported_object, NULL, true); if (result) { /* Failure, unlock already locked exported objects */ - ocf_core_visit(cache, _block_dev_unlock_exported_object, NULL, + ocf_core_visit(cache, kcas_core_unlock_exported_object, NULL, true); return result; } - ocf_core_visit(cache, _block_dev_stop_exported_object, NULL, true); + ocf_core_visit(cache, kcas_core_stop_exported_object, NULL, true); + ocf_core_visit(cache, kcas_core_free_exported_object, NULL, true); - return ocf_core_visit(cache, _block_dev_free_exported_object, NULL, - true); + return 0; } diff --git a/modules/cas_cache/volume/vol_block_dev_top.h b/modules/cas_cache/volume/vol_block_dev_top.h index e16bb8f..ab3e9c2 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.h +++ b/modules/cas_cache/volume/vol_block_dev_top.h @@ -6,11 +6,11 @@ #ifndef __VOL_BLOCK_DEV_TOP_H__ #define __VOL_BLOCK_DEV_TOP_H__ -int block_dev_activate_exported_object(ocf_core_t core); +int kcas_core_activate_exported_object(ocf_core_t core); -int block_dev_create_exported_object(ocf_core_t core); +int kcas_core_create_exported_object(ocf_core_t core); -int block_dev_destroy_all_exported_objects(ocf_cache_t cache); -int block_dev_destroy_exported_object(ocf_core_t core); +int kcas_cache_destroy_all_core_exported_objects(ocf_cache_t cache); +int kcas_core_destroy_exported_object(ocf_core_t core); #endif /* __VOL_BLOCK_DEV_TOP_H__ */