From 47a150644cb60b9ad670fb29134d2e85566588a8 Mon Sep 17 00:00:00 2001 From: Michal Rakowski Date: Thu, 11 Jul 2019 13:59:19 +0200 Subject: [PATCH 1/3] Doxygen fixup Signed-off-by: Michal Rakowski --- modules/cas_cache/layer_cache_management.c | 6 ++---- modules/cas_cache/volume/vol_block_dev_bottom.c | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index 7a032b4..0c4d128 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -1565,13 +1565,11 @@ out: } /** - * @brief routine implements --remove-cache command. - * @param[in] device caching device to be removed + * @brief routine implements --stop-cache command. + * @param[in] cache_id caching device id to be removed * @param[in] flush Boolean: shall we flush dirty data before removing cache. * if yes, flushing may still be interrupted by user (in which case * device won't be actually removed and error will be returned) - * @param[in] allow_interruption shall we allow interruption of dirty - * data flushing */ int cache_mngt_exit_instance(ocf_cache_id_t id, int flush) { diff --git a/modules/cas_cache/volume/vol_block_dev_bottom.c b/modules/cas_cache/volume/vol_block_dev_bottom.c index 756a74b..7978fc0 100644 --- a/modules/cas_cache/volume/vol_block_dev_bottom.c +++ b/modules/cas_cache/volume/vol_block_dev_bottom.c @@ -29,7 +29,7 @@ int block_dev_open_object(ocf_volume_t vol, void *volume_params) struct casdsk_disk *dsk; if (bdobj->opened_by_bdev) { - /* Bdev has beed set manually, so there is nothing to do. */ + /* Bdev has been set manually, so there is nothing to do. */ return 0; } From ee6cba515aeaf65020050cd898bda0d2568a5116 Mon Sep 17 00:00:00 2001 From: Michal Rakowski Date: Tue, 16 Jul 2019 16:09:50 +0200 Subject: [PATCH 2/3] Added create/activate/free all exported objects methods Signed-off-by: Michal Rakowski --- modules/cas_cache/cas_cache.h | 1 + modules/cas_cache/main.c | 1 + modules/cas_cache/volume/vol_block_dev_top.c | 33 ++++++++++++++++++++ modules/cas_cache/volume/vol_block_dev_top.h | 5 ++- modules/cas_disk/exp_obj.c | 1 + 5 files changed, 40 insertions(+), 1 deletion(-) 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) { From eee7a0e220f77519a1ad857818372a2c56f32e07 Mon Sep 17 00:00:00 2001 From: Michal Rakowski Date: Tue, 16 Jul 2019 16:12:43 +0200 Subject: [PATCH 3/3] Fix exported object cleanup in case of cache stop failure In case of error during cache stop exported object is not being restored after destroying. This may result in bug in case of calling stop once more. This commit fixes this issue - exported objects are restored. Signed-off-by: Michal Rakowski --- modules/cas_cache/layer_cache_management.c | 20 +++++++++++++++++++- modules/cas_cache/volume/vol_block_dev_top.c | 7 ++++++- modules/cas_disk/exp_obj.c | 5 ++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index 0c4d128..b88972d 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -1646,7 +1646,7 @@ int cache_mngt_exit_instance(ocf_cache_id_t id, int flush) /* Stop cache device */ status = _cache_mngt_cache_stop_sync(cache); if (status && status != -OCF_ERR_WRITE_CACHE) - goto unlock; + goto restore_exp_obj; if (!status && flush_status) status = -KCAS_ERR_STOPPED_DIRTY; @@ -1658,6 +1658,24 @@ int cache_mngt_exit_instance(ocf_cache_id_t id, int flush) ocf_queue_put(cache_priv->mngt_queue); vfree(cache_priv); + ocf_mngt_cache_unlock(cache); + ocf_mngt_cache_put(cache); + + return status; + +restore_exp_obj: + if (block_dev_create_all_exported_objects(cache)) { + /* Print error msg but do not change return err code to inform user why + * stop failed originally. */ + printk(KERN_WARNING + "Failed to restore (create) all exported objects!\n"); + goto unlock; + } + if (block_dev_activate_all_exported_objects(cache)) { + block_dev_destroy_all_exported_objects(cache); + printk(KERN_WARNING + "Failed to restore (activate) all exported objects!\n"); + } unlock: ocf_mngt_cache_unlock(cache); put: diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index 1db0b60..98480fa 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -894,6 +894,7 @@ 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); @@ -925,7 +926,8 @@ 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){ +static int _block_dev_create_exported_object_visitor(ocf_core_t core, void *cntx) +{ return block_dev_create_exported_object(core); } @@ -934,6 +936,7 @@ 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; @@ -1033,8 +1036,10 @@ int block_dev_destroy_all_exported_objects(ocf_cache_t cache) ocf_core_visit(cache, _block_dev_stop_exported_object, NULL, true); + block_dev_free_all_exported_objects(cache); return 0; } + static int _block_dev_free_exported_object(ocf_core_t core, void *cntx) { struct bd_object *bvol = bd_object( diff --git a/modules/cas_disk/exp_obj.c b/modules/cas_disk/exp_obj.c index a6a4c04..17202f8 100644 --- a/modules/cas_disk/exp_obj.c +++ b/modules/cas_disk/exp_obj.c @@ -724,7 +724,10 @@ int casdsk_exp_obj_destroy(struct casdsk_disk *dsk) struct casdsk_exp_obj *exp_obj; BUG_ON(!dsk); - BUG_ON(!dsk->exp_obj); + + if (!dsk->exp_obj) + return -ENODEV; + BUG_ON(!dsk->exp_obj->locked_bd); CASDSK_DEBUG_DISK_TRACE(dsk);