From 6d2266f7ee5bb04b4852b8155ca0b35f8dda48aa Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 17:03:31 +0200 Subject: [PATCH 01/11] Remove cas_disk_claim() Signed-off-by: Robert Baldyga --- modules/cas_cache/cas_cache.h | 1 - modules/cas_cache/disk.c | 27 -------------------- modules/cas_cache/disk.h | 10 -------- modules/cas_cache/exp_obj.c | 5 +++- modules/cas_cache/exp_obj.h | 3 ++- modules/cas_cache/volume/vol_block_dev_top.c | 12 ++------- 6 files changed, 8 insertions(+), 50 deletions(-) diff --git a/modules/cas_cache/cas_cache.h b/modules/cas_cache/cas_cache.h index 23b3eb4..14bd124 100644 --- a/modules/cas_cache/cas_cache.h +++ b/modules/cas_cache/cas_cache.h @@ -51,7 +51,6 @@ enum { }; struct cas_module { - struct list_head disk_list; uint32_t next_disk_id; int disk_major; int next_minor; diff --git a/modules/cas_cache/disk.c b/modules/cas_cache/disk.c index 37d38db..75ca842 100644 --- a/modules/cas_cache/disk.c +++ b/modules/cas_cache/disk.c @@ -55,7 +55,6 @@ int __init cas_init_disks(void) CAS_DEBUG_TRACE(); cas_module.next_disk_id = 1; - INIT_LIST_HEAD(&cas_module.disk_list); cas_module.disk_major = register_blkdev(cas_module.disk_major, "cas"); @@ -131,7 +130,6 @@ struct cas_disk *cas_disk_open(const char *path, void *private) dsk->private = private; dsk->id = cas_module.next_disk_id++; - list_add(&dsk->list, &cas_module.disk_list); result = _cas_disk_init_kobject(dsk); if (result) @@ -142,7 +140,6 @@ struct cas_disk *cas_disk_open(const char *path, void *private) return dsk; error_kobject: - list_del(&dsk->list); close_bdev_exclusive(dsk->bd, CAS_DISK_OPEN_FMODE); error_open_bdev: kfree(dsk->path); @@ -152,28 +149,6 @@ error_kmem: return ERR_PTR(result); } -static void _cas_disk_claim(struct cas_disk *dsk, void *private) -{ - dsk->private = private; -} - -struct cas_disk *cas_disk_claim(const char *path, void *private) -{ - struct list_head *item; - struct cas_disk *dsk = NULL; - - BUG_ON(!path); - - list_for_each(item, &cas_module.disk_list) { - dsk = list_entry(item, struct cas_disk, list); - if (strncmp(path, dsk->path, PATH_MAX) == 0) { - _cas_disk_claim(dsk, private); - return dsk; - } - } - return NULL; -} - static void __cas_disk_close(struct cas_disk *dsk) { close_bdev_exclusive(dsk->bd, CAS_DISK_OPEN_FMODE); @@ -189,8 +164,6 @@ void cas_disk_close(struct cas_disk *dsk) CAS_DEBUG_DISK(dsk, "Destroying (%p)", dsk); - list_del(&dsk->list); - __cas_disk_close(dsk); } diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index a2bab73..475b11a 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -31,7 +31,6 @@ struct cas_disk { struct cas_exp_obj *exp_obj; struct kobject kobj; - struct list_head list; void *private; }; @@ -49,15 +48,6 @@ int cas_disk_allocate_minors(int count); */ struct cas_disk *cas_disk_open(const char *path, void *private); -/** - * @brief Claim previously opened block device - * @param path Path to block device - * @param private Private data - * @return Pointer to cas_disk structure related to block device, or NULL - * if device is not opened. - */ -struct cas_disk *cas_disk_claim(const char *path, void *private); - /** * @brief Close block device and remove from cas * @param dsk Pointer to cas_disk structure related to block device diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 4d2895f..07954f3 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -407,7 +407,7 @@ static int _cas_init_tag_set(struct cas_disk *dsk, struct blk_mq_tag_set *set) } int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, - struct module *owner, struct cas_exp_obj_ops *ops) + struct module *owner, struct cas_exp_obj_ops *ops, void *priv) { struct cas_exp_obj *exp_obj; struct request_queue *queue; @@ -469,6 +469,8 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, queue->queuedata = dsk; exp_obj->queue = queue; + dsk->private = priv; + _cas_init_queues(dsk); gd->fops = &_cas_exp_obj_ops; @@ -486,6 +488,7 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, return 0; error_set_geometry: + dsk->private = NULL; _cas_exp_obj_clear_dev_t(dsk); error_exp_obj_set_dev_t: cas_cleanup_mq_disk(exp_obj); diff --git a/modules/cas_cache/exp_obj.h b/modules/cas_cache/exp_obj.h index dfe4ecc..58843b0 100644 --- a/modules/cas_cache/exp_obj.h +++ b/modules/cas_cache/exp_obj.h @@ -56,10 +56,11 @@ void cas_exp_obj_free(struct cas_disk *dsk); * @param dev_name Name of exported object (top device) * @param owner Pointer to cas module * @param ops Pointer to structure with callback functions + * @param priv Private data * @return 0 if success, errno if failure */ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, - struct module *owner, struct cas_exp_obj_ops *ops); + struct module *owner, struct cas_exp_obj_ops *ops, void *priv); /** * @brief Get request queue of exported object (top) block device diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index c265742..679d880 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -533,17 +533,9 @@ static int kcas_volume_create_exported_object(ocf_volume_t volume, const char *name, void *priv, struct cas_exp_obj_ops *ops) { 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 cas_disk *dsk; int result; - dsk = cas_disk_claim(uuid->data, priv); - if (dsk != bvol->dsk) { - result = -KCAS_ERR_SYSTEM; - goto end; - } - bvol->expobj_wq = alloc_workqueue("expobj_wq_%s", WQ_MEM_RECLAIM | WQ_HIGHPRI, 0, name); @@ -552,8 +544,8 @@ static int kcas_volume_create_exported_object(ocf_volume_t volume, goto end; } - result = cas_exp_obj_create(dsk, name, - THIS_MODULE, ops); + result = cas_exp_obj_create(bvol->dsk, name, + THIS_MODULE, ops, priv); if (result) { destroy_workqueue(bvol->expobj_wq); goto end; From 8945b482cedb2b8d7abc7c403d2d9adc7a832d6e Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 18:31:22 +0200 Subject: [PATCH 02/11] Remove private parameter from cas_disk_open() Signed-off-by: Robert Baldyga --- modules/cas_cache/disk.c | 4 +--- modules/cas_cache/disk.h | 3 +-- modules/cas_cache/volume/vol_block_dev_bottom.c | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/cas_cache/disk.c b/modules/cas_cache/disk.c index 75ca842..81b8f5e 100644 --- a/modules/cas_cache/disk.c +++ b/modules/cas_cache/disk.c @@ -96,7 +96,7 @@ static int _cas_disk_init_kobject(struct cas_disk *dsk) return result; } -struct cas_disk *cas_disk_open(const char *path, void *private) +struct cas_disk *cas_disk_open(const char *path) { struct cas_disk *dsk; int result = 0; @@ -127,8 +127,6 @@ struct cas_disk *cas_disk_open(const char *path, void *private) goto error_open_bdev; } - dsk->private = private; - dsk->id = cas_module.next_disk_id++; result = _cas_disk_init_kobject(dsk); diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index 475b11a..b554e9d 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -43,10 +43,9 @@ int cas_disk_allocate_minors(int count); /** * @brief Open block device * @param path Path to block device - * @param private Private data * @return Pointer to cas_disk related to opened block device */ -struct cas_disk *cas_disk_open(const char *path, void *private); +struct cas_disk *cas_disk_open(const char *path); /** * @brief Close block device and remove from cas diff --git a/modules/cas_cache/volume/vol_block_dev_bottom.c b/modules/cas_cache/volume/vol_block_dev_bottom.c index 528dd79..4321d26 100644 --- a/modules/cas_cache/volume/vol_block_dev_bottom.c +++ b/modules/cas_cache/volume/vol_block_dev_bottom.c @@ -35,7 +35,7 @@ int block_dev_open_object(ocf_volume_t vol, void *volume_params) return 0; } - dsk = cas_disk_open(uuid->data, NULL); + dsk = cas_disk_open(uuid->data); if (IS_ERR_OR_NULL(dsk)) { int error = PTR_ERR(dsk) ?: -EINVAL; From 1fe83b49720c959f827d1ac23133b9f9c0c910b1 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 21:21:22 +0200 Subject: [PATCH 03/11] Manage lifetime of exported object in top adapter Signed-off-by: Robert Baldyga --- modules/cas_cache/disk.c | 3 ++- modules/cas_cache/volume/vol_block_dev_top.c | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/cas_cache/disk.c b/modules/cas_cache/disk.c index 81b8f5e..801572d 100644 --- a/modules/cas_cache/disk.c +++ b/modules/cas_cache/disk.c @@ -149,9 +149,10 @@ error_kmem: static void __cas_disk_close(struct cas_disk *dsk) { + BUG_ON(dsk->exp_obj); + close_bdev_exclusive(dsk->bd, CAS_DISK_OPEN_FMODE); - cas_exp_obj_free(dsk); kobject_put(&dsk->kobj); } diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index 679d880..184ce6f 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -582,12 +582,17 @@ static int kcas_volume_destroy_exported_object(ocf_volume_t volume) result = cas_exp_obj_destroy(bvol->dsk); if (result) - goto out; + goto err; bvol->expobj_valid = false; destroy_workqueue(bvol->expobj_wq); -out: + cas_exp_obj_unlock(bvol->dsk); + cas_exp_obj_free(bvol->dsk); + + return 0; + +err: cas_exp_obj_unlock(bvol->dsk); return result; From ad783917d024a3c6d41bb30207e5eff7c4c6a722 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 21:28:57 +0200 Subject: [PATCH 04/11] Remove one-liner helper functions Those were not very helpful. Mostly made the code harder to read. Signed-off-by: Robert Baldyga --- modules/cas_cache/exp_obj.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 07954f3..78d554a 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -66,12 +66,6 @@ void cas_deinit_exp_objs(void) kmem_cache_destroy(cas_module.exp_obj_cache); } -static inline void _cas_exp_obj_handle_bio(struct cas_disk *dsk, - struct bio *bio) -{ - dsk->exp_obj->ops->submit_bio(dsk, bio, dsk->private); -} - static MAKE_RQ_RET_TYPE _cas_exp_obj_submit_bio(struct bio *bio) { struct cas_disk *dsk; @@ -79,7 +73,7 @@ static MAKE_RQ_RET_TYPE _cas_exp_obj_submit_bio(struct bio *bio) BUG_ON(!bio); dsk = CAS_BIO_GET_GENDISK(bio)->private_data; - _cas_exp_obj_handle_bio(dsk, bio); + dsk->exp_obj->ops->submit_bio(dsk, bio, dsk->private); KRETURN(0); } @@ -320,7 +314,6 @@ static void __cas_exp_obj_release(struct cas_exp_obj *exp_obj) { kmem_cache_free(cas_module.exp_obj_cache, exp_obj); } - static void _cas_exp_obj_release(struct kobject *kobj) { struct cas_exp_obj *exp_obj; @@ -593,12 +586,6 @@ error_bd_claim: return result; } -bool cas_exp_obj_activated(struct cas_disk *dsk) -{ - BUG_ON(!dsk); - return dsk->exp_obj->activated; -} - int cas_exp_obj_lock(struct cas_disk *dsk) { struct cas_exp_obj *exp_obj; @@ -647,7 +634,7 @@ int cas_exp_obj_destroy(struct cas_disk *dsk) exp_obj = dsk->exp_obj; - if (cas_exp_obj_activated(dsk)) { + if (dsk->exp_obj->activated) { sysfs_remove_link(&exp_obj->kobj, "blockdev"); bd_release_from_disk(dsk->bd, exp_obj->gd); _cas_exp_obj_clear_dev_t(dsk); From 2f54aea87dad6ff819fbb6b5228718fb2aa43e90 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 22:38:10 +0200 Subject: [PATCH 05/11] Remove exported object kobj Simplify exported object lifecycle. Signed-off-by: Robert Baldyga --- modules/cas_cache/exp_obj.c | 181 +++++++------------ modules/cas_cache/exp_obj.h | 4 +- modules/cas_cache/volume/vol_block_dev_top.c | 8 +- 3 files changed, 69 insertions(+), 124 deletions(-) diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 78d554a..694182e 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -19,11 +19,6 @@ #define CAS_DEV_MINORS 16 #define KMEM_CACHE_MIN_SIZE sizeof(void *) -static inline struct cas_exp_obj *cas_kobj_to_exp_obj(struct kobject *kobj) -{ - return container_of(kobj, struct cas_exp_obj, kobj); -} - static inline int bd_claim_by_disk(struct block_device *bdev, void *holder, struct gendisk *disk) { @@ -295,64 +290,15 @@ static int cas_exp_obj_alloc(struct cas_disk *dsk) return 0; } -void cas_exp_obj_free(struct cas_disk *dsk) +static void cas_exp_obj_free(struct cas_disk *dsk) { - struct cas_exp_obj *exp_obj; - - CAS_DEBUG_DISK_TRACE(dsk); - - exp_obj = dsk->exp_obj; - - if (!exp_obj) + if (!dsk->exp_obj) return; - kobject_put(&exp_obj->kobj); + kmem_cache_free(cas_module.exp_obj_cache, dsk->exp_obj); dsk->exp_obj = NULL; } -static void __cas_exp_obj_release(struct cas_exp_obj *exp_obj) -{ - kmem_cache_free(cas_module.exp_obj_cache, exp_obj); -} -static void _cas_exp_obj_release(struct kobject *kobj) -{ - struct cas_exp_obj *exp_obj; - struct module *owner; - - BUG_ON(!kobj); - - exp_obj = cas_kobj_to_exp_obj(kobj); - BUG_ON(!exp_obj); - - CAS_DEBUG_TRACE(); - - owner = exp_obj->owner; - - kfree(exp_obj->dev_name); - __cas_exp_obj_release(exp_obj); - - if (owner) - module_put(owner); -} - -static struct kobj_type cas_exp_obj_ktype = { - .release = _cas_exp_obj_release -}; - -static int _cas_exp_obj_init_kobject(struct cas_disk *dsk) -{ - int result = 0; - struct cas_exp_obj *exp_obj = dsk->exp_obj; - - kobject_init(&exp_obj->kobj, &cas_exp_obj_ktype); - result = kobject_add(&exp_obj->kobj, &dsk->kobj, - "%s", exp_obj->dev_name); - if (result) - CAS_DEBUG_DISK_ERROR(dsk, "Cannot register kobject"); - - return result; -} - static CAS_BLK_STATUS_T _cas_exp_obj_queue_rq(struct blk_mq_hw_ctx *hctx, const struct blk_mq_queue_data *bd) { @@ -437,11 +383,6 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, exp_obj->owner = owner; exp_obj->ops = ops; - result = _cas_exp_obj_init_kobject(dsk); - if (result) { - goto error_init_kobject; - } - result = _cas_init_tag_set(dsk, &dsk->tag_set); if (result) { goto error_init_tag_set; @@ -489,36 +430,17 @@ error_exp_obj_set_dev_t: error_alloc_mq_disk: blk_mq_free_tag_set(&dsk->tag_set); error_init_tag_set: - kobject_put(&exp_obj->kobj); - /* kobject put does all the cleanup below internally */ - return result; -error_init_kobject: module_put(owner); dsk->exp_obj->owner = NULL; error_module_get: kfree(exp_obj->dev_name); error_kstrdup: - __cas_exp_obj_release(exp_obj); - dsk->exp_obj = NULL; + cas_exp_obj_free(dsk); error_exp_obj_alloc: return result; } -struct request_queue *cas_exp_obj_get_queue(struct cas_disk *dsk) -{ - BUG_ON(!dsk); - BUG_ON(!dsk->exp_obj); - return dsk->exp_obj->queue; -} - -struct gendisk *cas_exp_obj_get_gendisk(struct cas_disk *dsk) -{ - BUG_ON(!dsk); - BUG_ON(!dsk->exp_obj); - return dsk->exp_obj->gd; -} - static bool _cas_exp_obj_exists(const char *path) { struct file *exported; @@ -568,24 +490,66 @@ int cas_exp_obj_activate(struct cas_disk *dsk) if (result) goto error_bd_claim; - result = sysfs_create_link(&dsk->exp_obj->kobj, - &disk_to_dev(dsk->exp_obj->gd)->kobj, - "blockdev"); - if (result) - goto error_sysfs_link; - CAS_DEBUG_DISK(dsk, "Activated exp object %s", dsk->exp_obj->dev_name); return 0; -error_sysfs_link: - bd_release_from_disk(dsk->bd, dsk->exp_obj->gd); error_bd_claim: del_gendisk(dsk->exp_obj->gd); dsk->exp_obj->activated = false; return result; } +int cas_exp_obj_destroy(struct cas_disk *dsk) +{ + struct cas_exp_obj *exp_obj; + + BUG_ON(!dsk); + + if (!dsk->exp_obj) + return -ENODEV; + + CAS_DEBUG_DISK_TRACE(dsk); + + exp_obj = dsk->exp_obj; + + if (dsk->exp_obj->activated) { + bd_release_from_disk(dsk->bd, exp_obj->gd); + _cas_exp_obj_clear_dev_t(dsk); + del_gendisk(exp_obj->gd); + } + + if (exp_obj->queue) + blk_cleanup_queue(exp_obj->queue); + + blk_mq_free_tag_set(&dsk->tag_set); + + put_disk(exp_obj->gd); + + return 0; +} + +void cas_exp_obj_cleanup(struct cas_disk *dsk) +{ + struct cas_exp_obj *exp_obj; + struct module *owner; + + CAS_DEBUG_DISK_TRACE(dsk); + + exp_obj = dsk->exp_obj; + + if (!exp_obj) + return; + + owner = exp_obj->owner; + + kfree(exp_obj->dev_name); + cas_exp_obj_free(dsk); + + if (owner) + module_put(owner); +} + int cas_exp_obj_lock(struct cas_disk *dsk) { struct cas_exp_obj *exp_obj; @@ -621,33 +585,16 @@ int cas_exp_obj_unlock(struct cas_disk *dsk) return 0; } -int cas_exp_obj_destroy(struct cas_disk *dsk) +struct request_queue *cas_exp_obj_get_queue(struct cas_disk *dsk) { - struct cas_exp_obj *exp_obj; - BUG_ON(!dsk); - - if (!dsk->exp_obj) - return -ENODEV; - - CAS_DEBUG_DISK_TRACE(dsk); - - exp_obj = dsk->exp_obj; - - if (dsk->exp_obj->activated) { - sysfs_remove_link(&exp_obj->kobj, "blockdev"); - bd_release_from_disk(dsk->bd, exp_obj->gd); - _cas_exp_obj_clear_dev_t(dsk); - del_gendisk(exp_obj->gd); - } - - if (exp_obj->queue) - blk_cleanup_queue(exp_obj->queue); - - blk_mq_free_tag_set(&dsk->tag_set); - - put_disk(exp_obj->gd); - - return 0; - + BUG_ON(!dsk->exp_obj); + return dsk->exp_obj->queue; +} + +struct gendisk *cas_exp_obj_get_gendisk(struct cas_disk *dsk) +{ + BUG_ON(!dsk); + BUG_ON(!dsk->exp_obj); + return dsk->exp_obj->gd; } diff --git a/modules/cas_cache/exp_obj.h b/modules/cas_cache/exp_obj.h index 58843b0..cf2c24b 100644 --- a/modules/cas_cache/exp_obj.h +++ b/modules/cas_cache/exp_obj.h @@ -5,7 +5,6 @@ #ifndef __CASDISK_EXP_OBJ_H__ #define __CASDISK_EXP_OBJ_H__ -#include #include struct cas_disk; @@ -39,7 +38,6 @@ struct cas_exp_obj { struct cas_exp_obj_ops *ops; const char *dev_name; - struct kobject kobj; atomic_t pt_ios; atomic_t *pending_rqs; @@ -48,7 +46,7 @@ struct cas_exp_obj { int __init cas_init_exp_objs(void); void cas_deinit_exp_objs(void); -void cas_exp_obj_free(struct cas_disk *dsk); +void cas_exp_obj_cleanup(struct cas_disk *dsk); /** * @brief Create exported object (top device) diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index 184ce6f..eb92efa 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -588,7 +588,7 @@ static int kcas_volume_destroy_exported_object(ocf_volume_t volume) destroy_workqueue(bvol->expobj_wq); cas_exp_obj_unlock(bvol->dsk); - cas_exp_obj_free(bvol->dsk); + cas_exp_obj_cleanup(bvol->dsk); return 0; @@ -759,11 +759,11 @@ static int kcas_core_stop_exported_object(ocf_core_t core, void *cntx) return 0; } -static int kcas_core_free_exported_object(ocf_core_t core, void *cntx) +static int kcas_core_cleanup_exported_object(ocf_core_t core, void *cntx) { struct bd_object *bvol = bd_object(ocf_core_get_volume(core)); - cas_exp_obj_free(bvol->dsk); + cas_exp_obj_cleanup(bvol->dsk); return 0; } @@ -783,7 +783,7 @@ int kcas_cache_destroy_all_core_exported_objects(ocf_cache_t cache) } ocf_core_visit(cache, kcas_core_stop_exported_object, NULL, true); - ocf_core_visit(cache, kcas_core_free_exported_object, NULL, true); + ocf_core_visit(cache, kcas_core_cleanup_exported_object, NULL, true); return 0; } From 67ed36ae0e47abe3274b9102e561f8f1c0f011bd Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 21:58:57 +0200 Subject: [PATCH 06/11] Remove disk kobj Simplify disk life cycle. Signed-off-by: Robert Baldyga --- modules/cas_cache/cas_cache.h | 3 -- modules/cas_cache/disk.c | 62 +++-------------------------------- modules/cas_cache/disk.h | 4 --- 3 files changed, 4 insertions(+), 65 deletions(-) diff --git a/modules/cas_cache/cas_cache.h b/modules/cas_cache/cas_cache.h index 14bd124..ac27681 100644 --- a/modules/cas_cache/cas_cache.h +++ b/modules/cas_cache/cas_cache.h @@ -51,14 +51,11 @@ enum { }; struct cas_module { - uint32_t next_disk_id; int disk_major; int next_minor; struct kmem_cache *disk_cache; struct kmem_cache *exp_obj_cache; - - struct kobject kobj; }; extern struct cas_module cas_module; diff --git a/modules/cas_cache/disk.c b/modules/cas_cache/disk.c index 801572d..9ec7b4a 100644 --- a/modules/cas_cache/disk.c +++ b/modules/cas_cache/disk.c @@ -13,11 +13,6 @@ #define CAS_DISK_OPEN_FMODE (FMODE_READ | FMODE_WRITE) -static inline struct cas_disk *cas_kobj_to_disk(struct kobject *kobj) -{ - return container_of(kobj, struct cas_disk, kobj); -} - static inline struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *holder) @@ -30,32 +25,10 @@ static inline void close_bdev_exclusive(struct block_device *bdev, fmode_t mode) blkdev_put(bdev, mode | FMODE_EXCL); } -static void _cas_disk_release(struct kobject *kobj) -{ - struct cas_disk *dsk; - - BUG_ON(!kobj); - - dsk = cas_kobj_to_disk(kobj); - BUG_ON(!dsk); - - CAS_DEBUG_DISK_TRACE(dsk); - - kfree(dsk->path); - - kmem_cache_free(cas_module.disk_cache, dsk); -} - -static struct kobj_type cas_disk_ktype = { - .release = _cas_disk_release, -}; - int __init cas_init_disks(void) { CAS_DEBUG_TRACE(); - cas_module.next_disk_id = 1; - cas_module.disk_major = register_blkdev(cas_module.disk_major, "cas"); if (cas_module.disk_major <= 0) { @@ -83,19 +56,6 @@ void cas_deinit_disks(void) unregister_blkdev(cas_module.disk_major, "cas"); } -static int _cas_disk_init_kobject(struct cas_disk *dsk) -{ - int result = 0; - - kobject_init(&dsk->kobj, &cas_disk_ktype); - result = kobject_add(&dsk->kobj, &disk_to_dev(dsk->bd->bd_disk)->kobj, - "cas%d", dsk->id); - if (result) - CAS_DEBUG_DISK_ERROR(dsk, "Cannot register kobject"); - - return result; -} - struct cas_disk *cas_disk_open(const char *path) { struct cas_disk *dsk; @@ -127,18 +87,10 @@ struct cas_disk *cas_disk_open(const char *path) goto error_open_bdev; } - dsk->id = cas_module.next_disk_id++; - - result = _cas_disk_init_kobject(dsk); - if (result) - goto error_kobject; - CAS_DEBUG_DISK(dsk, "Created (%p)", dsk); return dsk; -error_kobject: - close_bdev_exclusive(dsk->bd, CAS_DISK_OPEN_FMODE); error_open_bdev: kfree(dsk->path); error_kstrdup: @@ -147,15 +99,6 @@ error_kmem: return ERR_PTR(result); } -static void __cas_disk_close(struct cas_disk *dsk) -{ - BUG_ON(dsk->exp_obj); - - close_bdev_exclusive(dsk->bd, CAS_DISK_OPEN_FMODE); - - kobject_put(&dsk->kobj); -} - void cas_disk_close(struct cas_disk *dsk) { BUG_ON(!dsk); @@ -163,7 +106,10 @@ void cas_disk_close(struct cas_disk *dsk) CAS_DEBUG_DISK(dsk, "Destroying (%p)", dsk); - __cas_disk_close(dsk); + close_bdev_exclusive(dsk->bd, CAS_DISK_OPEN_FMODE); + + kfree(dsk->path); + kmem_cache_free(cas_module.disk_cache, dsk); } struct block_device *cas_disk_get_blkdev(struct cas_disk *dsk) diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index b554e9d..80c7e3a 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -5,7 +5,6 @@ #ifndef __CASDISK_DISK_H__ #define __CASDISK_DISK_H__ -#include #include #include #include @@ -15,7 +14,6 @@ struct cas_exp_obj; struct cas_disk { - uint32_t id; char *path; struct mutex openers_lock; @@ -30,8 +28,6 @@ struct cas_disk { struct blk_mq_tag_set tag_set; struct cas_exp_obj *exp_obj; - struct kobject kobj; - void *private; }; From 72cf855355747489688c9c70eda038a7205d7467 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 22:09:08 +0200 Subject: [PATCH 07/11] Move openers_lock to struct cas_exp_obj Signed-off-by: Robert Baldyga --- modules/cas_cache/disk.c | 2 -- modules/cas_cache/disk.h | 4 ---- modules/cas_cache/exp_obj.c | 40 ++++++++++++++++++++++--------------- modules/cas_cache/exp_obj.h | 4 ++++ 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/modules/cas_cache/disk.c b/modules/cas_cache/disk.c index 9ec7b4a..8ca6056 100644 --- a/modules/cas_cache/disk.c +++ b/modules/cas_cache/disk.c @@ -72,8 +72,6 @@ struct cas_disk *cas_disk_open(const char *path) goto error_kmem; } - mutex_init(&dsk->openers_lock); - dsk->path = kstrdup(path, GFP_KERNEL); if (!dsk->path) { result = -ENOMEM; diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index 80c7e3a..7ba1257 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -16,10 +16,6 @@ struct cas_exp_obj; struct cas_disk { char *path; - struct mutex openers_lock; - unsigned int openers; - bool claimed; - struct block_device *bd; int gd_flags; diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 694182e..c08b70f 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -234,32 +234,34 @@ static void _cas_exp_obj_clear_dev_t(struct cas_disk *dsk) static int _cas_exp_obj_open(struct block_device *bdev, fmode_t mode) { struct cas_disk *dsk = bdev->bd_disk->private_data; + struct cas_exp_obj *exp_obj = dsk->exp_obj; int result = -ENAVAIL; - mutex_lock(&dsk->openers_lock); + mutex_lock(&exp_obj->openers_lock); - if (!dsk->claimed) { - if (unlikely(dsk->openers == UINT_MAX)) { + if (!exp_obj->claimed) { + if (unlikely(exp_obj->openers == UINT_MAX)) { result = -EBUSY; } else { - dsk->openers++; + exp_obj->openers++; result = 0; } } - mutex_unlock(&dsk->openers_lock); + mutex_unlock(&dsk->exp_obj->openers_lock); return result; } static void _cas_exp_obj_close(struct gendisk *gd, fmode_t mode) { struct cas_disk *dsk = gd->private_data; + struct cas_exp_obj *exp_obj = dsk->exp_obj; - BUG_ON(dsk->openers == 0); + BUG_ON(exp_obj->openers == 0); - mutex_lock(&dsk->openers_lock); - dsk->openers--; - mutex_unlock(&dsk->openers_lock); + mutex_lock(&exp_obj->openers_lock); + exp_obj->openers--; + mutex_unlock(&exp_obj->openers_lock); } @@ -369,6 +371,8 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, exp_obj = dsk->exp_obj; + mutex_init(&exp_obj->openers_lock); + exp_obj->dev_name = kstrdup(dev_name, GFP_KERNEL); if (!exp_obj->dev_name) { result = -ENOMEM; @@ -562,25 +566,29 @@ int cas_exp_obj_lock(struct cas_disk *dsk) exp_obj = dsk->exp_obj; - mutex_lock(&dsk->openers_lock); + mutex_lock(&exp_obj->openers_lock); - if (dsk->openers == 0) { - dsk->claimed = true; + if (exp_obj->openers == 0) { + exp_obj->claimed = true; result = 0; } - mutex_unlock(&dsk->openers_lock); + mutex_unlock(&exp_obj->openers_lock); return result; } int cas_exp_obj_unlock(struct cas_disk *dsk) { + struct cas_exp_obj *exp_obj; + BUG_ON(!dsk); CAS_DEBUG_DISK_TRACE(dsk); - mutex_lock(&dsk->openers_lock); - dsk->claimed = false; - mutex_unlock(&dsk->openers_lock); + exp_obj = dsk->exp_obj; + + mutex_lock(&exp_obj->openers_lock); + exp_obj->claimed = false; + mutex_unlock(&exp_obj->openers_lock); return 0; } diff --git a/modules/cas_cache/exp_obj.h b/modules/cas_cache/exp_obj.h index cf2c24b..2a280fc 100644 --- a/modules/cas_cache/exp_obj.h +++ b/modules/cas_cache/exp_obj.h @@ -39,6 +39,10 @@ struct cas_exp_obj { const char *dev_name; + struct mutex openers_lock; + unsigned int openers; + bool claimed; + atomic_t pt_ios; atomic_t *pending_rqs; }; From dc390adf49d48318c2004344fb6ae19b690a53e9 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 22:18:57 +0200 Subject: [PATCH 08/11] Move exported object specific properties to struct cas_exp_obj Signed-off-by: Robert Baldyga --- modules/cas_cache/disk.h | 4 ---- modules/cas_cache/exp_obj.c | 21 ++++++++++++--------- modules/cas_cache/exp_obj.h | 5 +++++ 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index 7ba1257..4b8dd33 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -18,10 +18,6 @@ struct cas_disk { struct block_device *bd; - int gd_flags; - int gd_minors; - - struct blk_mq_tag_set tag_set; struct cas_exp_obj *exp_obj; void *private; diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index c08b70f..453ddf3 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -156,6 +156,7 @@ static int _cas_flags = GENHD_FL_EXT_DEVT; static int _cas_exp_obj_hide_parts(struct cas_disk *dsk) { + struct cas_exp_obj *exp_obj = dsk->exp_obj; struct block_device *bd = cas_disk_get_blkdev(dsk); struct gendisk *gdsk = cas_disk_get_gendisk(dsk); @@ -175,8 +176,8 @@ static int _cas_exp_obj_hide_parts(struct cas_disk *dsk) } /* Save original flags and minors */ - dsk->gd_flags = gdsk->flags & _cas_flags; - dsk->gd_minors = gdsk->minors; + exp_obj->gd_flags = gdsk->flags & _cas_flags; + exp_obj->gd_minors = gdsk->minors; /* Setup disk of bottom device as not partitioned device */ gdsk->flags &= ~_cas_flags; @@ -189,6 +190,7 @@ static int _cas_exp_obj_hide_parts(struct cas_disk *dsk) static int _cas_exp_obj_set_dev_t(struct cas_disk *dsk, struct gendisk *gd) { + struct cas_exp_obj *exp_obj = dsk->exp_obj; int flags; int minors = disk_max_parts(cas_disk_get_gendisk(dsk)); struct block_device *bdev; @@ -202,7 +204,7 @@ static int _cas_exp_obj_set_dev_t(struct cas_disk *dsk, struct gendisk *gd) } else { if (_cas_exp_obj_hide_parts(dsk)) return -EINVAL; - flags = dsk->gd_flags; + flags = exp_obj->gd_flags; } gd->first_minor = cas_disk_allocate_minors(minors); @@ -220,13 +222,14 @@ static int _cas_exp_obj_set_dev_t(struct cas_disk *dsk, struct gendisk *gd) static void _cas_exp_obj_clear_dev_t(struct cas_disk *dsk) { + struct cas_exp_obj *exp_obj = dsk->exp_obj; struct block_device *bdev = cas_disk_get_blkdev(dsk); struct gendisk *gdsk = cas_disk_get_gendisk(dsk); if (cas_bdev_whole(bdev) == bdev) { /* Restore previous configuration of bottom disk */ - gdsk->minors = dsk->gd_minors; - gdsk->flags |= dsk->gd_flags; + gdsk->minors = exp_obj->gd_minors; + gdsk->flags |= exp_obj->gd_flags; cas_reread_partitions(bdev); } } @@ -387,12 +390,12 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, exp_obj->owner = owner; exp_obj->ops = ops; - result = _cas_init_tag_set(dsk, &dsk->tag_set); + result = _cas_init_tag_set(dsk, &exp_obj->tag_set); if (result) { goto error_init_tag_set; } - result = cas_alloc_mq_disk(&gd, &queue, &dsk->tag_set); + result = cas_alloc_mq_disk(&gd, &queue, &exp_obj->tag_set); if (result) { goto error_alloc_mq_disk; } @@ -432,7 +435,7 @@ error_exp_obj_set_dev_t: cas_cleanup_mq_disk(exp_obj); dsk->exp_obj->gd = NULL; error_alloc_mq_disk: - blk_mq_free_tag_set(&dsk->tag_set); + blk_mq_free_tag_set(&exp_obj->tag_set); error_init_tag_set: module_put(owner); dsk->exp_obj->owner = NULL; @@ -526,7 +529,7 @@ int cas_exp_obj_destroy(struct cas_disk *dsk) if (exp_obj->queue) blk_cleanup_queue(exp_obj->queue); - blk_mq_free_tag_set(&dsk->tag_set); + blk_mq_free_tag_set(&exp_obj->tag_set); put_disk(exp_obj->gd); diff --git a/modules/cas_cache/exp_obj.h b/modules/cas_cache/exp_obj.h index 2a280fc..0f046b2 100644 --- a/modules/cas_cache/exp_obj.h +++ b/modules/cas_cache/exp_obj.h @@ -43,6 +43,11 @@ struct cas_exp_obj { unsigned int openers; bool claimed; + int gd_flags; + int gd_minors; + + struct blk_mq_tag_set tag_set; + atomic_t pt_ios; atomic_t *pending_rqs; }; From 61dff1f6fda7f34f074f79102148bf19f6a41767 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 22:22:18 +0200 Subject: [PATCH 09/11] Move private field to struct cas_exp_obj Signed-off-by: Robert Baldyga --- modules/cas_cache/disk.h | 2 -- modules/cas_cache/exp_obj.c | 10 ++++++---- modules/cas_cache/exp_obj.h | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index 4b8dd33..ce4ed64 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -19,8 +19,6 @@ struct cas_disk { struct block_device *bd; struct cas_exp_obj *exp_obj; - - void *private; }; int __init cas_init_disks(void); diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 453ddf3..5d6ff6d 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -64,11 +64,13 @@ void cas_deinit_exp_objs(void) static MAKE_RQ_RET_TYPE _cas_exp_obj_submit_bio(struct bio *bio) { struct cas_disk *dsk; + struct cas_exp_obj *exp_obj; BUG_ON(!bio); dsk = CAS_BIO_GET_GENDISK(bio)->private_data; + exp_obj = dsk->exp_obj; - dsk->exp_obj->ops->submit_bio(dsk, bio, dsk->private); + exp_obj->ops->submit_bio(dsk, bio, exp_obj->private); KRETURN(0); } @@ -410,7 +412,7 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, queue->queuedata = dsk; exp_obj->queue = queue; - dsk->private = priv; + exp_obj->private = priv; _cas_init_queues(dsk); @@ -421,7 +423,7 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, cas_blk_queue_make_request(queue, _cas_exp_obj_make_rq_fn); if (exp_obj->ops->set_geometry) { - result = exp_obj->ops->set_geometry(dsk, dsk->private); + result = exp_obj->ops->set_geometry(dsk, exp_obj->private); if (result) goto error_set_geometry; } @@ -429,7 +431,7 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, return 0; error_set_geometry: - dsk->private = NULL; + exp_obj->private = NULL; _cas_exp_obj_clear_dev_t(dsk); error_exp_obj_set_dev_t: cas_cleanup_mq_disk(exp_obj); diff --git a/modules/cas_cache/exp_obj.h b/modules/cas_cache/exp_obj.h index 0f046b2..d2e42d3 100644 --- a/modules/cas_cache/exp_obj.h +++ b/modules/cas_cache/exp_obj.h @@ -50,6 +50,8 @@ struct cas_exp_obj { atomic_t pt_ios; atomic_t *pending_rqs; + + void *private; }; int __init cas_init_exp_objs(void); From d0d17545eb3f08d0473a2d450e5a47ff8a5d41a0 Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 22:29:09 +0200 Subject: [PATCH 10/11] Move major/minor management to exported object code Signed-off-by: Robert Baldyga --- modules/cas_cache/disk.c | 25 +------------------------ modules/cas_cache/disk.h | 2 -- modules/cas_cache/exp_obj.c | 27 +++++++++++++++++++++++++-- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/modules/cas_cache/disk.c b/modules/cas_cache/disk.c index 8ca6056..1738802 100644 --- a/modules/cas_cache/disk.c +++ b/modules/cas_cache/disk.c @@ -29,21 +29,11 @@ int __init cas_init_disks(void) { CAS_DEBUG_TRACE(); - cas_module.disk_major = register_blkdev(cas_module.disk_major, - "cas"); - if (cas_module.disk_major <= 0) { - CAS_DEBUG_ERROR("Cannot allocate major number"); - return -EINVAL; - } - CAS_DEBUG_PARAM("Allocated major number: %d", cas_module.disk_major); - cas_module.disk_cache = kmem_cache_create("cas_disk", sizeof(struct cas_disk), 0, 0, NULL); - if (!cas_module.disk_cache) { - unregister_blkdev(cas_module.disk_major, "cas"); + if (!cas_module.disk_cache) return -ENOMEM; - } return 0; } @@ -53,7 +43,6 @@ void cas_deinit_disks(void) CAS_DEBUG_TRACE(); kmem_cache_destroy(cas_module.disk_cache); - unregister_blkdev(cas_module.disk_major, "cas"); } struct cas_disk *cas_disk_open(const char *path) @@ -129,15 +118,3 @@ struct request_queue *cas_disk_get_queue(struct cas_disk *dsk) BUG_ON(!dsk->bd); return cas_bdev_whole(dsk->bd)->bd_disk->queue; } - -int cas_disk_allocate_minors(int count) -{ - int minor = -1; - - if (cas_module.next_minor + count <= (1 << MINORBITS)) { - minor = cas_module.next_minor; - cas_module.next_minor += count; - } - - return minor; -} diff --git a/modules/cas_cache/disk.h b/modules/cas_cache/disk.h index ce4ed64..7437673 100644 --- a/modules/cas_cache/disk.h +++ b/modules/cas_cache/disk.h @@ -24,8 +24,6 @@ struct cas_disk { int __init cas_init_disks(void); void cas_deinit_disks(void); -int cas_disk_allocate_minors(int count); - /** * @brief Open block device * @param path Path to block device diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 5d6ff6d..0884a2b 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -46,10 +46,20 @@ int __init cas_init_exp_objs(void) { CAS_DEBUG_TRACE(); + cas_module.disk_major = register_blkdev(cas_module.disk_major, + "cas"); + if (cas_module.disk_major <= 0) { + CAS_DEBUG_ERROR("Cannot allocate major number"); + return -EINVAL; + } + CAS_DEBUG_PARAM("Allocated major number: %d", cas_module.disk_major); + cas_module.exp_obj_cache = kmem_cache_create("cas_exp_obj", sizeof(struct cas_exp_obj), 0, 0, NULL); - if (!cas_module.exp_obj_cache) + if (!cas_module.exp_obj_cache) { + unregister_blkdev(cas_module.disk_major, "cas"); return -ENOMEM; + } return 0; } @@ -59,6 +69,7 @@ void cas_deinit_exp_objs(void) CAS_DEBUG_TRACE(); kmem_cache_destroy(cas_module.exp_obj_cache); + unregister_blkdev(cas_module.disk_major, "cas"); } static MAKE_RQ_RET_TYPE _cas_exp_obj_submit_bio(struct bio *bio) @@ -190,6 +201,18 @@ static int _cas_exp_obj_hide_parts(struct cas_disk *dsk) return 0; } +static int _cas_exp_obj_allocate_minors(int count) +{ + int minor = -1; + + if (cas_module.next_minor + count <= (1 << MINORBITS)) { + minor = cas_module.next_minor; + cas_module.next_minor += count; + } + + return minor; +} + static int _cas_exp_obj_set_dev_t(struct cas_disk *dsk, struct gendisk *gd) { struct cas_exp_obj *exp_obj = dsk->exp_obj; @@ -209,7 +232,7 @@ static int _cas_exp_obj_set_dev_t(struct cas_disk *dsk, struct gendisk *gd) flags = exp_obj->gd_flags; } - gd->first_minor = cas_disk_allocate_minors(minors); + gd->first_minor = _cas_exp_obj_allocate_minors(minors); if (gd->first_minor < 0) { CAS_DEBUG_DISK_ERROR(dsk, "Cannot allocate %d minors", minors); return -EINVAL; From 5e2c1c15cfec6a5c7da26e92862fbb4708c0532e Mon Sep 17 00:00:00 2001 From: Robert Baldyga Date: Fri, 16 Sep 2022 23:29:09 +0200 Subject: [PATCH 11/11] Merge exp obj create/activate Signed-off-by: Robert Baldyga --- modules/cas_cache/exp_obj.c | 117 ++++++++----------- modules/cas_cache/exp_obj.h | 10 -- modules/cas_cache/layer_cache_management.c | 12 -- modules/cas_cache/volume/vol_block_dev_top.c | 46 -------- modules/cas_cache/volume/vol_block_dev_top.h | 4 +- 5 files changed, 52 insertions(+), 137 deletions(-) diff --git a/modules/cas_cache/exp_obj.c b/modules/cas_cache/exp_obj.c index 0884a2b..eff582b 100644 --- a/modules/cas_cache/exp_obj.c +++ b/modules/cas_cache/exp_obj.c @@ -375,6 +375,36 @@ static int _cas_init_tag_set(struct cas_disk *dsk, struct blk_mq_tag_set *set) return blk_mq_alloc_tag_set(set); } +static int _cas_exp_obj_check_path(const char *dev_name) +{ + struct file *exported; + char *path; + int result; + + path = kmalloc(PATH_MAX, GFP_KERNEL); + if (!path) + return -ENOMEM; + + snprintf(path, PATH_MAX, "/dev/%s", dev_name); + + exported = filp_open(path, O_RDONLY, 0); + + if (!IS_ERR_OR_NULL(exported)) { + filp_close(exported, NULL); + result = -EEXIST; + + } else { + /* failed to open file - it is safe to assume, + * it does not exist + */ + result = 0; + } + + kfree(path); + + return result; +} + int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, struct module *owner, struct cas_exp_obj_ops *ops, void *priv) { @@ -393,9 +423,18 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, if (strlen(dev_name) >= DISK_NAME_LEN) return -EINVAL; + result = _cas_exp_obj_check_path(dev_name); + if (result == -EEXIST) { + printk(KERN_ERR "Could not activate exported object, " + "because file /dev/%s exists.\n", dev_name); + } + + if (result) + return result; + result = cas_exp_obj_alloc(dsk); if (result) - goto error_exp_obj_alloc; + return result; exp_obj = dsk->exp_obj; @@ -451,8 +490,16 @@ int cas_exp_obj_create(struct cas_disk *dsk, const char *dev_name, goto error_set_geometry; } + add_disk(gd); + + result = bd_claim_by_disk(dsk->bd, dsk, gd); + if (result) + goto error_bd_claim; + return 0; +error_bd_claim: + del_gendisk(dsk->exp_obj->gd); error_set_geometry: exp_obj->private = NULL; _cas_exp_obj_clear_dev_t(dsk); @@ -468,70 +515,10 @@ error_module_get: kfree(exp_obj->dev_name); error_kstrdup: cas_exp_obj_free(dsk); -error_exp_obj_alloc: return result; } -static bool _cas_exp_obj_exists(const char *path) -{ - struct file *exported; - - exported = filp_open(path, O_RDONLY, 0); - - if (!exported || IS_ERR(exported)) { - /*failed to open file - it is safe to assume, - * it does not exist - */ - return false; - } - - filp_close(exported, NULL); - return true; -} - -int cas_exp_obj_activate(struct cas_disk *dsk) -{ - char *path; - int result; - - BUG_ON(!dsk); - BUG_ON(!dsk->exp_obj); - BUG_ON(!dsk->exp_obj->gd); - BUG_ON(dsk->exp_obj->activated); - - CAS_DEBUG_DISK_TRACE(dsk); - - path = kmalloc(PATH_MAX, GFP_KERNEL); - if (!path) - return -ENOMEM; - - snprintf(path, PATH_MAX, "/dev/%s", dsk->exp_obj->dev_name); - if (_cas_exp_obj_exists(path)) { - printk(KERN_ERR "Could not activate exported object, " - "because file %s exists.\n", path); - kfree(path); - return -EEXIST; - } - kfree(path); - - dsk->exp_obj->activated = true; - add_disk(dsk->exp_obj->gd); - - result = bd_claim_by_disk(dsk->bd, dsk, dsk->exp_obj->gd); - if (result) - goto error_bd_claim; - - CAS_DEBUG_DISK(dsk, "Activated exp object %s", dsk->exp_obj->dev_name); - - return 0; - -error_bd_claim: - del_gendisk(dsk->exp_obj->gd); - dsk->exp_obj->activated = false; - return result; -} - int cas_exp_obj_destroy(struct cas_disk *dsk) { struct cas_exp_obj *exp_obj; @@ -545,11 +532,9 @@ int cas_exp_obj_destroy(struct cas_disk *dsk) exp_obj = dsk->exp_obj; - if (dsk->exp_obj->activated) { - bd_release_from_disk(dsk->bd, exp_obj->gd); - _cas_exp_obj_clear_dev_t(dsk); - del_gendisk(exp_obj->gd); - } + bd_release_from_disk(dsk->bd, exp_obj->gd); + _cas_exp_obj_clear_dev_t(dsk); + del_gendisk(exp_obj->gd); if (exp_obj->queue) blk_cleanup_queue(exp_obj->queue); diff --git a/modules/cas_cache/exp_obj.h b/modules/cas_cache/exp_obj.h index d2e42d3..1c53657 100644 --- a/modules/cas_cache/exp_obj.h +++ b/modules/cas_cache/exp_obj.h @@ -33,8 +33,6 @@ struct cas_exp_obj { struct module *owner; - bool activated; - struct cas_exp_obj_ops *ops; const char *dev_name; @@ -85,14 +83,6 @@ struct request_queue *cas_exp_obj_get_queue(struct cas_disk *dsk); */ struct gendisk *cas_exp_obj_get_gendisk(struct cas_disk *dsk); -/** - * @brief Activate exported object (make it visible to OS - * and allow I/O handling) - * @param dsk Pointer to cas_disk structure representing a block device - * @return 0 if success, errno if failure - */ -int cas_exp_obj_activate(struct cas_disk *dsk); - /** * @brief Lock exported object * @param dsk Pointer to cas_disk structure representing a block device diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index c635d9b..4d8ccc3 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -1389,10 +1389,6 @@ int cache_mngt_add_core_to_cache(const char *cache_name, size_t name_len, if (result) goto error_after_add_core; - result = kcas_core_activate_exported_object(core); - if (result) - goto error_after_create_exported_object; - result = core_id_from_name(&core_id, cfg->name); if (result) goto error_after_create_exported_object; @@ -1768,8 +1764,6 @@ static int _cache_mngt_create_core_exp_obj(ocf_core_t core, void *cntx) if (result) return result; - result = kcas_core_activate_exported_object(core); - return result; } @@ -1830,12 +1824,6 @@ static int cache_mngt_initialize_cache_exported_object(ocf_cache_t cache) if (result) return result; - result = kcas_cache_activate_exported_object(cache); - if (result) { - cache_mngt_destroy_cache_exp_obj(cache); - return result; - } - cache_priv->cache_exp_obj_initialized = true; return 0; diff --git a/modules/cas_cache/volume/vol_block_dev_top.c b/modules/cas_cache/volume/vol_block_dev_top.c index eb92efa..bdefa3e 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.c +++ b/modules/cas_cache/volume/vol_block_dev_top.c @@ -601,19 +601,6 @@ err: /** * @brief this routine actually adds /dev/casM-N inode */ -static int kcas_volume_activate_exported_object(ocf_volume_t volume, - struct cas_exp_obj_ops *ops) -{ - struct bd_object *bvol = bd_object(volume); - int result; - - result = cas_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); @@ -638,23 +625,6 @@ int kcas_core_destroy_exported_object(ocf_core_t 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, - &kcas_core_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; -} - int kcas_cache_create_exported_object(ocf_cache_t cache) { ocf_volume_t volume = ocf_cache_get_volume(cache); @@ -677,22 +647,6 @@ int kcas_cache_destroy_exported_object(ocf_cache_t cache) return kcas_volume_destroy_exported_object(volume); } -int kcas_cache_activate_exported_object(ocf_cache_t cache) -{ - ocf_volume_t volume = ocf_cache_get_volume(cache); - int result; - - result = kcas_volume_activate_exported_object(volume, - &kcas_cache_exp_obj_ops); - if (result) { - printk(KERN_ERR "Cannot activate cache %s exported object. " - "Error code %d\n", ocf_cache_get_name(cache), - result); - } - - return result; -} - static int kcas_core_lock_exported_object(ocf_core_t core, void *cntx) { int result; diff --git a/modules/cas_cache/volume/vol_block_dev_top.h b/modules/cas_cache/volume/vol_block_dev_top.h index 0c3320f..1ebc5a5 100644 --- a/modules/cas_cache/volume/vol_block_dev_top.h +++ b/modules/cas_cache/volume/vol_block_dev_top.h @@ -1,5 +1,5 @@ /* -* Copyright(c) 2012-2021 Intel Corporation +* Copyright(c) 2012-2022 Intel Corporation * SPDX-License-Identifier: BSD-3-Clause */ @@ -9,12 +9,10 @@ int kcas_core_create_exported_object(ocf_core_t core); int kcas_core_destroy_exported_object(ocf_core_t core); -int kcas_core_activate_exported_object(ocf_core_t core); int kcas_cache_destroy_all_core_exported_objects(ocf_cache_t cache); int kcas_cache_create_exported_object(ocf_cache_t cache); int kcas_cache_destroy_exported_object(ocf_cache_t cache); -int kcas_cache_activate_exported_object(ocf_cache_t cache); #endif /* __VOL_BLOCK_DEV_TOP_H__ */