aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/cciss.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/block/cciss.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/block/cciss.c')
-rw-r--r--drivers/block/cciss.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index a6c0494dd054..665a470310a9 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -178,6 +178,7 @@ static void do_cciss_request(struct request_queue *q);
178static irqreturn_t do_cciss_intx(int irq, void *dev_id); 178static irqreturn_t do_cciss_intx(int irq, void *dev_id);
179static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id); 179static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id);
180static int cciss_open(struct block_device *bdev, fmode_t mode); 180static int cciss_open(struct block_device *bdev, fmode_t mode);
181static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode);
181static int cciss_release(struct gendisk *disk, fmode_t mode); 182static int cciss_release(struct gendisk *disk, fmode_t mode);
182static int do_ioctl(struct block_device *bdev, fmode_t mode, 183static int do_ioctl(struct block_device *bdev, fmode_t mode,
183 unsigned int cmd, unsigned long arg); 184 unsigned int cmd, unsigned long arg);
@@ -237,7 +238,7 @@ static int cciss_compat_ioctl(struct block_device *, fmode_t,
237 238
238static const struct block_device_operations cciss_fops = { 239static const struct block_device_operations cciss_fops = {
239 .owner = THIS_MODULE, 240 .owner = THIS_MODULE,
240 .open = cciss_open, 241 .open = cciss_unlocked_open,
241 .release = cciss_release, 242 .release = cciss_release,
242 .ioctl = do_ioctl, 243 .ioctl = do_ioctl,
243 .getgeo = cciss_getgeo, 244 .getgeo = cciss_getgeo,
@@ -1042,13 +1043,28 @@ static int cciss_open(struct block_device *bdev, fmode_t mode)
1042 return 0; 1043 return 0;
1043} 1044}
1044 1045
1046static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode)
1047{
1048 int ret;
1049
1050 lock_kernel();
1051 ret = cciss_open(bdev, mode);
1052 unlock_kernel();
1053
1054 return ret;
1055}
1056
1045/* 1057/*
1046 * Close. Sync first. 1058 * Close. Sync first.
1047 */ 1059 */
1048static int cciss_release(struct gendisk *disk, fmode_t mode) 1060static int cciss_release(struct gendisk *disk, fmode_t mode)
1049{ 1061{
1050 ctlr_info_t *host = get_host(disk); 1062 ctlr_info_t *host;
1051 drive_info_struct *drv = get_drv(disk); 1063 drive_info_struct *drv;
1064
1065 lock_kernel();
1066 host = get_host(disk);
1067 drv = get_drv(disk);
1052 1068
1053#ifdef CCISS_DEBUG 1069#ifdef CCISS_DEBUG
1054 printk(KERN_DEBUG "cciss_release %s\n", disk->disk_name); 1070 printk(KERN_DEBUG "cciss_release %s\n", disk->disk_name);
@@ -1056,6 +1072,7 @@ static int cciss_release(struct gendisk *disk, fmode_t mode)
1056 1072
1057 drv->usage_count--; 1073 drv->usage_count--;
1058 host->usage_count--; 1074 host->usage_count--;
1075 unlock_kernel();
1059 return 0; 1076 return 0;
1060} 1077}
1061 1078