Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90014829 authored by Rakesh Pandit's avatar Rakesh Pandit Committed by Jens Axboe
Browse files

lightnvm: prevent target type module removal when in use



If target type module e.g. pblk here is unloaded (rmmod) while module
is in use (after creating target) system crashes.  We fix this by
using module API refcnt.

Signed-off-by: default avatarRakesh Pandit <rakesh@tuxera.com>
Signed-off-by: default avatarMatias Bjørling <m@bjorling.me>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 47bc227d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/types.h>
#include <linux/sem.h>
#include <linux/bitmap.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/miscdevice.h>
#include <linux/lightnvm.h>
@@ -316,6 +317,8 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
	list_add_tail(&t->list, &dev->targets);
	mutex_unlock(&dev->mlock);

	__module_get(tt->owner);

	return 0;
err_sysfs:
	if (tt->exit)
@@ -351,6 +354,7 @@ static void __nvm_remove_target(struct nvm_target *t)

	nvm_remove_tgt_dev(t->dev, 1);
	put_disk(tdisk);
	module_put(t->type->owner);

	list_del(&t->list);
	kfree(t);
+1 −0
Original line number Diff line number Diff line
@@ -1044,6 +1044,7 @@ static struct nvm_tgt_type tt_pblk = {

	.sysfs_init	= pblk_sysfs_init,
	.sysfs_exit	= pblk_sysfs_exit,
	.owner		= THIS_MODULE,
};

static int __init pblk_module_init(void)
+1 −0
Original line number Diff line number Diff line
@@ -460,6 +460,7 @@ struct nvm_tgt_type {

	/* For internal use */
	struct list_head list;
	struct module *owner;
};

extern struct nvm_tgt_type *nvm_find_target_type(const char *, int);