aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
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/scsi
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/scsi')
-rw-r--r--drivers/scsi/sd.c5
-rw-r--r--drivers/scsi/sr.c7
2 files changed, 11 insertions, 1 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 633ac32b25c1..01680c7c8507 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -795,6 +795,7 @@ static int sd_open(struct block_device *bdev, fmode_t mode)
795 795
796 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n")); 796 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n"));
797 797
798 lock_kernel();
798 sdev = sdkp->device; 799 sdev = sdkp->device;
799 800
800 /* 801 /*
@@ -838,10 +839,12 @@ static int sd_open(struct block_device *bdev, fmode_t mode)
838 scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); 839 scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT);
839 } 840 }
840 841
842 unlock_kernel();
841 return 0; 843 return 0;
842 844
843error_out: 845error_out:
844 scsi_disk_put(sdkp); 846 scsi_disk_put(sdkp);
847 unlock_kernel();
845 return retval; 848 return retval;
846} 849}
847 850
@@ -863,6 +866,7 @@ static int sd_release(struct gendisk *disk, fmode_t mode)
863 866
864 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_release\n")); 867 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_release\n"));
865 868
869 lock_kernel();
866 if (!--sdkp->openers && sdev->removable) { 870 if (!--sdkp->openers && sdev->removable) {
867 if (scsi_block_when_processing_errors(sdev)) 871 if (scsi_block_when_processing_errors(sdev))
868 scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW); 872 scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW);
@@ -873,6 +877,7 @@ static int sd_release(struct gendisk *disk, fmode_t mode)
873 * XXX is followed by a "rmmod sd_mod"? 877 * XXX is followed by a "rmmod sd_mod"?
874 */ 878 */
875 scsi_disk_put(sdkp); 879 scsi_disk_put(sdkp);
880 unlock_kernel();
876 return 0; 881 return 0;
877} 882}
878 883
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index d42fa6468f41..ba9c3e0387ce 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -467,22 +467,27 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq)
467 467
468static int sr_block_open(struct block_device *bdev, fmode_t mode) 468static int sr_block_open(struct block_device *bdev, fmode_t mode)
469{ 469{
470 struct scsi_cd *cd = scsi_cd_get(bdev->bd_disk); 470 struct scsi_cd *cd;
471 int ret = -ENXIO; 471 int ret = -ENXIO;
472 472
473 lock_kernel();
474 cd = scsi_cd_get(bdev->bd_disk);
473 if (cd) { 475 if (cd) {
474 ret = cdrom_open(&cd->cdi, bdev, mode); 476 ret = cdrom_open(&cd->cdi, bdev, mode);
475 if (ret) 477 if (ret)
476 scsi_cd_put(cd); 478 scsi_cd_put(cd);
477 } 479 }
480 unlock_kernel();
478 return ret; 481 return ret;
479} 482}
480 483
481static int sr_block_release(struct gendisk *disk, fmode_t mode) 484static int sr_block_release(struct gendisk *disk, fmode_t mode)
482{ 485{
483 struct scsi_cd *cd = scsi_cd(disk); 486 struct scsi_cd *cd = scsi_cd(disk);
487 lock_kernel();
484 cdrom_release(&cd->cdi, mode); 488 cdrom_release(&cd->cdi, mode);
485 scsi_cd_put(cd); 489 scsi_cd_put(cd);
490 unlock_kernel();
486 return 0; 491 return 0;
487} 492}
488 493