Remove exported object kobj
Simplify exported object lifecycle. Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
This commit is contained in:
parent
ad783917d0
commit
2f54aea87d
@ -19,11 +19,6 @@
|
|||||||
#define CAS_DEV_MINORS 16
|
#define CAS_DEV_MINORS 16
|
||||||
#define KMEM_CACHE_MIN_SIZE sizeof(void *)
|
#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,
|
static inline int bd_claim_by_disk(struct block_device *bdev, void *holder,
|
||||||
struct gendisk *disk)
|
struct gendisk *disk)
|
||||||
{
|
{
|
||||||
@ -295,64 +290,15 @@ static int cas_exp_obj_alloc(struct cas_disk *dsk)
|
|||||||
return 0;
|
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;
|
if (!dsk->exp_obj)
|
||||||
|
|
||||||
CAS_DEBUG_DISK_TRACE(dsk);
|
|
||||||
|
|
||||||
exp_obj = dsk->exp_obj;
|
|
||||||
|
|
||||||
if (!exp_obj)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
kobject_put(&exp_obj->kobj);
|
kmem_cache_free(cas_module.exp_obj_cache, dsk->exp_obj);
|
||||||
dsk->exp_obj = NULL;
|
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,
|
static CAS_BLK_STATUS_T _cas_exp_obj_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||||
const struct blk_mq_queue_data *bd)
|
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->owner = owner;
|
||||||
exp_obj->ops = ops;
|
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);
|
result = _cas_init_tag_set(dsk, &dsk->tag_set);
|
||||||
if (result) {
|
if (result) {
|
||||||
goto error_init_tag_set;
|
goto error_init_tag_set;
|
||||||
@ -489,36 +430,17 @@ error_exp_obj_set_dev_t:
|
|||||||
error_alloc_mq_disk:
|
error_alloc_mq_disk:
|
||||||
blk_mq_free_tag_set(&dsk->tag_set);
|
blk_mq_free_tag_set(&dsk->tag_set);
|
||||||
error_init_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);
|
module_put(owner);
|
||||||
dsk->exp_obj->owner = NULL;
|
dsk->exp_obj->owner = NULL;
|
||||||
error_module_get:
|
error_module_get:
|
||||||
kfree(exp_obj->dev_name);
|
kfree(exp_obj->dev_name);
|
||||||
error_kstrdup:
|
error_kstrdup:
|
||||||
__cas_exp_obj_release(exp_obj);
|
cas_exp_obj_free(dsk);
|
||||||
dsk->exp_obj = NULL;
|
|
||||||
error_exp_obj_alloc:
|
error_exp_obj_alloc:
|
||||||
return result;
|
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)
|
static bool _cas_exp_obj_exists(const char *path)
|
||||||
{
|
{
|
||||||
struct file *exported;
|
struct file *exported;
|
||||||
@ -568,24 +490,66 @@ int cas_exp_obj_activate(struct cas_disk *dsk)
|
|||||||
if (result)
|
if (result)
|
||||||
goto error_bd_claim;
|
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);
|
CAS_DEBUG_DISK(dsk, "Activated exp object %s", dsk->exp_obj->dev_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error_sysfs_link:
|
|
||||||
bd_release_from_disk(dsk->bd, dsk->exp_obj->gd);
|
|
||||||
error_bd_claim:
|
error_bd_claim:
|
||||||
del_gendisk(dsk->exp_obj->gd);
|
del_gendisk(dsk->exp_obj->gd);
|
||||||
dsk->exp_obj->activated = false;
|
dsk->exp_obj->activated = false;
|
||||||
return result;
|
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)
|
int cas_exp_obj_lock(struct cas_disk *dsk)
|
||||||
{
|
{
|
||||||
struct cas_exp_obj *exp_obj;
|
struct cas_exp_obj *exp_obj;
|
||||||
@ -621,33 +585,16 @@ int cas_exp_obj_unlock(struct cas_disk *dsk)
|
|||||||
return 0;
|
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);
|
BUG_ON(!dsk);
|
||||||
|
BUG_ON(!dsk->exp_obj);
|
||||||
if (!dsk->exp_obj)
|
return dsk->exp_obj->queue;
|
||||||
return -ENODEV;
|
}
|
||||||
|
|
||||||
CAS_DEBUG_DISK_TRACE(dsk);
|
struct gendisk *cas_exp_obj_get_gendisk(struct cas_disk *dsk)
|
||||||
|
{
|
||||||
exp_obj = dsk->exp_obj;
|
BUG_ON(!dsk);
|
||||||
|
BUG_ON(!dsk->exp_obj);
|
||||||
if (dsk->exp_obj->activated) {
|
return dsk->exp_obj->gd;
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#ifndef __CASDISK_EXP_OBJ_H__
|
#ifndef __CASDISK_EXP_OBJ_H__
|
||||||
#define __CASDISK_EXP_OBJ_H__
|
#define __CASDISK_EXP_OBJ_H__
|
||||||
|
|
||||||
#include <linux/kobject.h>
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
|
|
||||||
struct cas_disk;
|
struct cas_disk;
|
||||||
@ -39,7 +38,6 @@ struct cas_exp_obj {
|
|||||||
struct cas_exp_obj_ops *ops;
|
struct cas_exp_obj_ops *ops;
|
||||||
|
|
||||||
const char *dev_name;
|
const char *dev_name;
|
||||||
struct kobject kobj;
|
|
||||||
|
|
||||||
atomic_t pt_ios;
|
atomic_t pt_ios;
|
||||||
atomic_t *pending_rqs;
|
atomic_t *pending_rqs;
|
||||||
@ -48,7 +46,7 @@ struct cas_exp_obj {
|
|||||||
int __init cas_init_exp_objs(void);
|
int __init cas_init_exp_objs(void);
|
||||||
void cas_deinit_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)
|
* @brief Create exported object (top device)
|
||||||
|
@ -588,7 +588,7 @@ static int kcas_volume_destroy_exported_object(ocf_volume_t volume)
|
|||||||
destroy_workqueue(bvol->expobj_wq);
|
destroy_workqueue(bvol->expobj_wq);
|
||||||
|
|
||||||
cas_exp_obj_unlock(bvol->dsk);
|
cas_exp_obj_unlock(bvol->dsk);
|
||||||
cas_exp_obj_free(bvol->dsk);
|
cas_exp_obj_cleanup(bvol->dsk);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -759,11 +759,11 @@ static int kcas_core_stop_exported_object(ocf_core_t core, void *cntx)
|
|||||||
return 0;
|
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));
|
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;
|
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_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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user