aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/mtd_blkdevs.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2010-08-07 12:25:34 -0400
committerJens Axboe <jaxboe@fusionio.com>2010-08-07 12:25:34 -0400
commit6e9624b8caec290d28b4c6d9ec75749df6372b87 (patch)
tree47225b544e1da82742795553dc4e8aa70c17afdc /drivers/mtd/mtd_blkdevs.c
parent8a6cfeb6deca3a8fefd639d898b0d163c0b5d368 (diff)
block: push down BKL into .open and .release
The open and release block_device_operations are currently called with the BKL held. In order to change that, we must first make sure that all drivers that currently rely on this have no regressions. This blindly pushes the BKL into all .open and .release operations for all block drivers to prepare for the next step. The drivers can subsequently replace the BKL with their own locks or remove it completely when it can be shown that it is not needed. The functions blkdev_get and blkdev_put are the only remaining users of the big kernel lock in the block layer, besides a few uses in the ioctl code, none of which need to serialize with blkdev_{get,put}. Most of these two functions is also under the protection of bdev->bd_mutex, including the actual calls to ->open and ->release, and the common code does not access any global data structures that need the BKL. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'drivers/mtd/mtd_blkdevs.c')
-rw-r--r--drivers/mtd/mtd_blkdevs.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/mtd/mtd_blkdevs.c b/drivers/mtd/mtd_blkdevs.c
index 8c83b11a77d5..5ca80aee2ed0 100644
--- a/drivers/mtd/mtd_blkdevs.c
+++ b/drivers/mtd/mtd_blkdevs.c
@@ -165,8 +165,9 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
165 int ret; 165 int ret;
166 166
167 if (!dev) 167 if (!dev)
168 return -ERESTARTSYS; 168 return -ERESTARTSYS; /* FIXME: busy loop! -arnd*/
169 169
170 lock_kernel();
170 mutex_lock(&dev->lock); 171 mutex_lock(&dev->lock);
171 172
172 if (!dev->mtd) { 173 if (!dev->mtd) {
@@ -183,6 +184,7 @@ static int blktrans_open(struct block_device *bdev, fmode_t mode)
183unlock: 184unlock:
184 mutex_unlock(&dev->lock); 185 mutex_unlock(&dev->lock);
185 blktrans_dev_put(dev); 186 blktrans_dev_put(dev);
187 unlock_kernel();
186 return ret; 188 return ret;
187} 189}
188 190
@@ -194,6 +196,7 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode)
194 if (!dev) 196 if (!dev)
195 return ret; 197 return ret;
196 198
199 lock_kernel();
197 mutex_lock(&dev->lock); 200 mutex_lock(&dev->lock);
198 201
199 /* Release one reference, we sure its not the last one here*/ 202 /* Release one reference, we sure its not the last one here*/
@@ -206,6 +209,7 @@ static int blktrans_release(struct gendisk *disk, fmode_t mode)
206unlock: 209unlock:
207 mutex_unlock(&dev->lock); 210 mutex_unlock(&dev->lock);
208 blktrans_dev_put(dev); 211 blktrans_dev_put(dev);
212 unlock_kernel();
209 return ret; 213 return ret;
210} 214}
211 215