diff --git a/modules/cas_cache/cas_cache.h b/modules/cas_cache/cas_cache.h index 1cc0b22..3ecf554 100644 --- a/modules/cas_cache/cas_cache.h +++ b/modules/cas_cache/cas_cache.h @@ -72,6 +72,7 @@ struct casdsk_functions_mapper { int (*casdsk_exp_obj_destroy)(struct casdsk_disk *dsk); int (*casdsk_exp_obj_create)(struct casdsk_disk *dsk, const char *dev_name, struct module *owner, struct casdsk_exp_obj_ops *ops); + void(*casdsk_exp_obj_free)(struct casdsk_disk *dsk); struct request_queue *(*casdsk_disk_get_queue)(struct casdsk_disk *dsk); void (*casdsk_store_config)(size_t n_blobs, struct casdsk_props_conf *blobs); struct block_device *(*casdsk_disk_get_blkdev)(struct casdsk_disk *dsk); diff --git a/modules/cas_cache/main.c b/modules/cas_cache/main.c index c46dd1d..2c285ec 100644 --- a/modules/cas_cache/main.c +++ b/modules/cas_cache/main.c @@ -79,6 +79,7 @@ int static cas_casdisk_lookup_funtions(void) cas_lookup_symbol(casdsk_disk_dettach); cas_lookup_symbol(casdsk_exp_obj_destroy); cas_lookup_symbol(casdsk_exp_obj_create); + cas_lookup_symbol(casdsk_exp_obj_free); cas_lookup_symbol(casdsk_disk_get_queue); cas_lookup_symbol(casdsk_store_config); cas_lookup_symbol(casdsk_disk_get_blkdev); diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index 4de5bd6..1db0b60 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -884,6 +884,16 @@ int block_dev_activate_exported_object(ocf_core_t core) return ret; } +static int _block_dev_activate_exported_object(ocf_core_t core, void *cntx) +{ + return block_dev_activate_exported_object(core); +} + +int block_dev_activate_all_exported_objects(ocf_cache_t cache) +{ + return ocf_core_visit(cache, _block_dev_activate_exported_object, NULL, + true); +} int block_dev_create_exported_object(ocf_core_t core) { ocf_volume_t obj = ocf_core_get_volume(core); @@ -915,6 +925,15 @@ int block_dev_create_exported_object(ocf_core_t core) return result; } +static int _block_dev_create_exported_object_visitor(ocf_core_t core, void *cntx){ + return block_dev_create_exported_object(core); +} + +int block_dev_create_all_exported_objects(ocf_cache_t cache) +{ + return ocf_core_visit(cache, _block_dev_create_exported_object_visitor, NULL, + true); +} int block_dev_destroy_exported_object(ocf_core_t core) { int ret = 0; @@ -1016,3 +1035,17 @@ int block_dev_destroy_all_exported_objects(ocf_cache_t cache) return 0; } +static int _block_dev_free_exported_object(ocf_core_t core, void *cntx) +{ + struct bd_object *bvol = bd_object( + ocf_core_get_volume(core)); + + casdisk_functions.casdsk_exp_obj_free(bvol->dsk); + return 0; +} + +int block_dev_free_all_exported_objects(ocf_cache_t cache) +{ + return ocf_core_visit(cache, _block_dev_free_exported_object, NULL, + true); +} diff --git a/modules/cas_cache/volume/vol_block_dev_top.h b/modules/cas_cache/volume/vol_block_dev_top.h index aef7b30..dc3a3c2 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.h +++ b/modules/cas_cache/volume/vol_block_dev_top.h @@ -6,12 +6,15 @@ #ifndef __VOL_BLOCK_DEV_TOP_H__ #define __VOL_BLOCK_DEV_TOP_H__ +int block_dev_activate_all_exported_objects(ocf_cache_t cache); int block_dev_activate_exported_object(ocf_core_t core); +int block_dev_create_all_exported_objects(ocf_cache_t cache); int block_dev_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 block_dev_destroy_all_exported_objects(ocf_cache_t cache); +int block_dev_free_all_exported_objects(ocf_cache_t cache); #endif /* __VOL_BLOCK_DEV_TOP_H__ */ diff --git a/modules/cas_disk/exp_obj.c b/modules/cas_disk/exp_obj.c index 0a6608b..a6a4c04 100644 --- a/modules/cas_disk/exp_obj.c +++ b/modules/cas_disk/exp_obj.c @@ -421,6 +421,7 @@ void casdsk_exp_obj_free(struct casdsk_disk *dsk) kobject_put(&exp_obj->kobj); dsk->exp_obj = NULL; } +EXPORT_SYMBOL(casdsk_exp_obj_free); static void __casdsk_exp_obj_release(struct casdsk_exp_obj *exp_obj) {