[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[dm-devel] [PATCH 1/5] mtd: fix bdev exclusive open bugs in block2mtd::add_device()
- From: Tejun Heo <tj kernel org>
- To: axboe kernel dk, hch infradead org, linux-kernel vger kernel org, petero2 telia com, schwidefsky de ibm com, heiko carstens de ibm com, jack suse cz, akpm linux-foundation org, adilger kernel dilger ca, tytso mit edu, mfasheh suse com, joel becker oracle com, aelder sgi com, dm-devel redhat com, drbd-dev lists linbit com, neilb suse de, leochen broadcom com, sbranden broadcom com, chris mason oracle com, swhiteho redhat com, shaggy linux vnet ibm com, joern logfs org, konishi ryusuke lab ntt co jp, reiserfs-devel vger kernel org, viro zeniv linux org uk
- Cc: Tejun Heo <tj kernel org>, linux-mtd lists infradead org
- Subject: [dm-devel] [PATCH 1/5] mtd: fix bdev exclusive open bugs in block2mtd::add_device()
- Date: Mon, 1 Nov 2010 17:15:25 +0100
There are two bdev exclusive open bugs.
* open_bdev_exclusive() must not be called with NULL holder. Use dev
as the holder.
* open_by_devnum() doesn't open the bdev exclusively but
block2mtd_free_device() always assumes it. Explicitly claim the
bdev.
The latter is rather clumsy but will be simplified with future
blkdev_get/put() cleanups.
Signed-off-by: Tejun Heo <tj kernel org>
Cc: linux-mtd lists infradead org
---
drivers/mtd/devices/block2mtd.c | 11 ++++++++++-
1 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c
index 2cf0cc6..806a9ed 100644
--- a/drivers/mtd/devices/block2mtd.c
+++ b/drivers/mtd/devices/block2mtd.c
@@ -246,7 +246,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
return NULL;
/* Get a handle on the device */
- bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, NULL);
+ bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, dev);
#ifndef MODULE
if (IS_ERR(bdev)) {
@@ -256,6 +256,15 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
dev_t devt = name_to_dev_t(devname);
if (devt) {
bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
+ if (!IS_ERR(bdev)) {
+ int ret;
+ ret = bd_claim(bdev, dev);
+ if (ret) {
+ blkdev_put(bdev,
+ FMODE_READ | FMODE_WRITE);
+ bdev = ERR_PTR(ret);
+ }
+ }
}
}
#endif
--
1.7.1
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]