lightnvm: control life of nvm_dev in driver
LightNVM compatible device drivers does not have a method to expose LightNVM specific sysfs entries. To enable LightNVM sysfs entries to be exposed, lightnvm device drivers require a struct device to attach it to. To allow both the actual device driver and lightnvm sysfs entries to coexist, the device driver tracks the lifetime of the nvm_dev structure. This patch refactors NVMe and null_blk to handle the lifetime of struct nvm_dev, which eliminates the need for struct gendisk when a lightnvm compatible device is provided. Signed-off-by: Matias Bjørling <m@bjorling.me> Signed-off-by: Jens Axboe <axboe@fb.com>
Цей коміт міститься в:

зафіксовано
Jens Axboe

джерело
b21d5b3017
коміт
b0b4e09c1a
@@ -660,23 +660,16 @@ static void nvm_exit(struct nvm_dev *dev)
|
||||
pr_info("nvm: successfully unloaded\n");
|
||||
}
|
||||
|
||||
int nvm_register(struct request_queue *q, char *disk_name,
|
||||
struct nvm_dev_ops *ops)
|
||||
struct nvm_dev *nvm_alloc_dev(int node)
|
||||
{
|
||||
return kzalloc_node(sizeof(struct nvm_dev), GFP_KERNEL, node);
|
||||
}
|
||||
EXPORT_SYMBOL(nvm_alloc_dev);
|
||||
|
||||
int nvm_register(struct nvm_dev *dev)
|
||||
{
|
||||
struct nvm_dev *dev;
|
||||
int ret;
|
||||
|
||||
if (!ops->identity)
|
||||
return -EINVAL;
|
||||
|
||||
dev = kzalloc(sizeof(struct nvm_dev), GFP_KERNEL);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
||||
dev->q = q;
|
||||
dev->ops = ops;
|
||||
strncpy(dev->name, disk_name, DISK_NAME_LEN);
|
||||
|
||||
ret = nvm_init(dev);
|
||||
if (ret)
|
||||
goto err_init;
|
||||
@@ -714,29 +707,17 @@ int nvm_register(struct request_queue *q, char *disk_name,
|
||||
return 0;
|
||||
err_init:
|
||||
kfree(dev->lun_map);
|
||||
kfree(dev);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(nvm_register);
|
||||
|
||||
void nvm_unregister(char *disk_name)
|
||||
void nvm_unregister(struct nvm_dev *dev)
|
||||
{
|
||||
struct nvm_dev *dev;
|
||||
|
||||
down_write(&nvm_lock);
|
||||
dev = nvm_find_nvm_dev(disk_name);
|
||||
if (!dev) {
|
||||
pr_err("nvm: could not find device %s to unregister\n",
|
||||
disk_name);
|
||||
up_write(&nvm_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
list_del(&dev->devices);
|
||||
up_write(&nvm_lock);
|
||||
|
||||
nvm_exit(dev);
|
||||
kfree(dev);
|
||||
}
|
||||
EXPORT_SYMBOL(nvm_unregister);
|
||||
|
||||
|
Посилання в новій задачі
Заблокувати користувача