summaryrefslogtreecommitdiff
path: root/drivers/lightnvm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/lightnvm')
-rw-r--r--drivers/lightnvm/core.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c
index 60e163be5a89..c490711cf0f4 100644
--- a/drivers/lightnvm/core.c
+++ b/drivers/lightnvm/core.c
@@ -373,6 +373,7 @@ static void __nvm_remove_target(struct nvm_target *t)
static int nvm_remove_tgt(struct nvm_dev *dev, struct nvm_ioctl_remove *remove)
{
struct nvm_target *t;
+ struct block_device *bdev;
mutex_lock(&dev->mlock);
t = nvm_find_target(dev, remove->tgtname);
@@ -380,6 +381,19 @@ static int nvm_remove_tgt(struct nvm_dev *dev, struct nvm_ioctl_remove *remove)
mutex_unlock(&dev->mlock);
return 1;
}
+ bdev = bdget_disk(t->disk, 0);
+ if (!bdev) {
+ pr_err("nvm: removal failed, allocating bd failed\n");
+ mutex_unlock(&dev->mlock);
+ return -ENOMEM;
+ }
+ if (bdev->bd_super || bdev->bd_part_count) {
+ pr_err("nvm: removal failed, block device busy\n");
+ bdput(bdev);
+ mutex_unlock(&dev->mlock);
+ return -EBUSY;
+ }
+ bdput(bdev);
__nvm_remove_target(t);
mutex_unlock(&dev->mlock);