Remove disk kobj
Simplify disk life cycle. Signed-off-by: Robert Baldyga <robert.baldyga@intel.com>
This commit is contained in:
parent
2f54aea87d
commit
67ed36ae0e
@ -51,14 +51,11 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct cas_module {
|
struct cas_module {
|
||||||
uint32_t next_disk_id;
|
|
||||||
int disk_major;
|
int disk_major;
|
||||||
int next_minor;
|
int next_minor;
|
||||||
|
|
||||||
struct kmem_cache *disk_cache;
|
struct kmem_cache *disk_cache;
|
||||||
struct kmem_cache *exp_obj_cache;
|
struct kmem_cache *exp_obj_cache;
|
||||||
|
|
||||||
struct kobject kobj;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct cas_module cas_module;
|
extern struct cas_module cas_module;
|
||||||
|
@ -13,11 +13,6 @@
|
|||||||
|
|
||||||
#define CAS_DISK_OPEN_FMODE (FMODE_READ | FMODE_WRITE)
|
#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,
|
static inline struct block_device *open_bdev_exclusive(const char *path,
|
||||||
fmode_t mode,
|
fmode_t mode,
|
||||||
void *holder)
|
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);
|
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)
|
int __init cas_init_disks(void)
|
||||||
{
|
{
|
||||||
CAS_DEBUG_TRACE();
|
CAS_DEBUG_TRACE();
|
||||||
|
|
||||||
cas_module.next_disk_id = 1;
|
|
||||||
|
|
||||||
cas_module.disk_major = register_blkdev(cas_module.disk_major,
|
cas_module.disk_major = register_blkdev(cas_module.disk_major,
|
||||||
"cas");
|
"cas");
|
||||||
if (cas_module.disk_major <= 0) {
|
if (cas_module.disk_major <= 0) {
|
||||||
@ -83,19 +56,6 @@ void cas_deinit_disks(void)
|
|||||||
unregister_blkdev(cas_module.disk_major, "cas");
|
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 *cas_disk_open(const char *path)
|
||||||
{
|
{
|
||||||
struct cas_disk *dsk;
|
struct cas_disk *dsk;
|
||||||
@ -127,18 +87,10 @@ struct cas_disk *cas_disk_open(const char *path)
|
|||||||
goto error_open_bdev;
|
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);
|
CAS_DEBUG_DISK(dsk, "Created (%p)", dsk);
|
||||||
|
|
||||||
return dsk;
|
return dsk;
|
||||||
|
|
||||||
error_kobject:
|
|
||||||
close_bdev_exclusive(dsk->bd, CAS_DISK_OPEN_FMODE);
|
|
||||||
error_open_bdev:
|
error_open_bdev:
|
||||||
kfree(dsk->path);
|
kfree(dsk->path);
|
||||||
error_kstrdup:
|
error_kstrdup:
|
||||||
@ -147,15 +99,6 @@ error_kmem:
|
|||||||
return ERR_PTR(result);
|
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)
|
void cas_disk_close(struct cas_disk *dsk)
|
||||||
{
|
{
|
||||||
BUG_ON(!dsk);
|
BUG_ON(!dsk);
|
||||||
@ -163,7 +106,10 @@ void cas_disk_close(struct cas_disk *dsk)
|
|||||||
|
|
||||||
CAS_DEBUG_DISK(dsk, "Destroying (%p)", 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)
|
struct block_device *cas_disk_get_blkdev(struct cas_disk *dsk)
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
#ifndef __CASDISK_DISK_H__
|
#ifndef __CASDISK_DISK_H__
|
||||||
#define __CASDISK_DISK_H__
|
#define __CASDISK_DISK_H__
|
||||||
|
|
||||||
#include <linux/kobject.h>
|
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
@ -15,7 +14,6 @@
|
|||||||
struct cas_exp_obj;
|
struct cas_exp_obj;
|
||||||
|
|
||||||
struct cas_disk {
|
struct cas_disk {
|
||||||
uint32_t id;
|
|
||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
struct mutex openers_lock;
|
struct mutex openers_lock;
|
||||||
@ -30,8 +28,6 @@ struct cas_disk {
|
|||||||
struct blk_mq_tag_set tag_set;
|
struct blk_mq_tag_set tag_set;
|
||||||
struct cas_exp_obj *exp_obj;
|
struct cas_exp_obj *exp_obj;
|
||||||
|
|
||||||
struct kobject kobj;
|
|
||||||
|
|
||||||
void *private;
|
void *private;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user