projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge git://git.infradead.org/mtd-2.6
[firefly-linux-kernel-4.4.55.git]
/
drivers
/
mtd
/
mtd_blkdevs.c
diff --git
a/drivers/mtd/mtd_blkdevs.c
b/drivers/mtd/mtd_blkdevs.c
index a534e1f0c34844b39c0fd03ce9ee070f88438a9b..ca385697446ece7ebfe387a4cd99b41cbca9ebbc 100644
(file)
--- a/
drivers/mtd/mtd_blkdevs.c
+++ b/
drivers/mtd/mtd_blkdevs.c
@@
-221,15
+221,33
@@
static int blktrans_open(struct block_device *bdev, fmode_t mode)
kref_get(&dev->ref);
__module_get(dev->tr->owner);
kref_get(&dev->ref);
__module_get(dev->tr->owner);
- if (dev->mtd) {
- ret = dev->tr->open ? dev->tr->open(dev) : 0;
- __get_mtd_device(dev->mtd);
+ if (!dev->mtd)
+ goto unlock;
+
+ if (dev->tr->open) {
+ ret = dev->tr->open(dev);
+ if (ret)
+ goto error_put;
}
}
+ ret = __get_mtd_device(dev->mtd);
+ if (ret)
+ goto error_release;
+
unlock:
mutex_unlock(&dev->lock);
blktrans_dev_put(dev);
return ret;
unlock:
mutex_unlock(&dev->lock);
blktrans_dev_put(dev);
return ret;
+
+error_release:
+ if (dev->tr->release)
+ dev->tr->release(dev);
+error_put:
+ module_put(dev->tr->owner);
+ kref_put(&dev->ref, blktrans_dev_release);
+ mutex_unlock(&dev->lock);
+ blktrans_dev_put(dev);
+ return ret;
}
static int blktrans_release(struct gendisk *disk, fmode_t mode)
}
static int blktrans_release(struct gendisk *disk, fmode_t mode)