diff options
author | Arnd Bergmann <arnd@arndb.de> | 2010-07-07 10:51:29 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2010-08-07 12:26:08 -0400 |
commit | 409f3499a2cfcd1e9c2857c53af7fcce069f027f (patch) | |
tree | 7275165954c7f1143d219f4b141888d6c0a5a4ab /drivers/scsi/sd.c | |
parent | 15392efb9d427482754f6d267262452878667499 (diff) |
scsi/sd: remove big kernel lock
Every user of the BKL in the sd driver is the
result of the pushdown from the block layer
into the open/close/ioctl functions.
The only place that used to rely on the BKL is
the sdkp->openers variable, which gets converted
into an atomic_t.
Nothing else seems to rely on the BKL, since the
functions do not touch global data without holding
another lock, and the open/close functions are
still protected from concurrent execution using
the bdev->bd_mutex.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: linux-scsi@vger.kernel.org
Cc: "James E.J. Bottomley" <James.Bottomley@suse.de>
Acked-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'drivers/scsi/sd.c')
-rw-r--r-- | drivers/scsi/sd.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 01680c7c8507..fc5d69a84af5 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -783,6 +783,8 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
783 | * or from within the kernel (e.g. as a result of a mount(1) ). | 783 | * or from within the kernel (e.g. as a result of a mount(1) ). |
784 | * In the latter case @inode and @filp carry an abridged amount | 784 | * In the latter case @inode and @filp carry an abridged amount |
785 | * of information as noted above. | 785 | * of information as noted above. |
786 | * | ||
787 | * Locking: called with bdev->bd_mutex held. | ||
786 | **/ | 788 | **/ |
787 | static int sd_open(struct block_device *bdev, fmode_t mode) | 789 | static int sd_open(struct block_device *bdev, fmode_t mode) |
788 | { | 790 | { |
@@ -795,7 +797,6 @@ static int sd_open(struct block_device *bdev, fmode_t mode) | |||
795 | 797 | ||
796 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n")); | 798 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_open\n")); |
797 | 799 | ||
798 | lock_kernel(); | ||
799 | sdev = sdkp->device; | 800 | sdev = sdkp->device; |
800 | 801 | ||
801 | /* | 802 | /* |
@@ -834,17 +835,15 @@ static int sd_open(struct block_device *bdev, fmode_t mode) | |||
834 | if (!scsi_device_online(sdev)) | 835 | if (!scsi_device_online(sdev)) |
835 | goto error_out; | 836 | goto error_out; |
836 | 837 | ||
837 | if (!sdkp->openers++ && sdev->removable) { | 838 | if ((atomic_inc_return(&sdkp->openers) == 1) && sdev->removable) { |
838 | if (scsi_block_when_processing_errors(sdev)) | 839 | if (scsi_block_when_processing_errors(sdev)) |
839 | scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); | 840 | scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); |
840 | } | 841 | } |
841 | 842 | ||
842 | unlock_kernel(); | ||
843 | return 0; | 843 | return 0; |
844 | 844 | ||
845 | error_out: | 845 | error_out: |
846 | scsi_disk_put(sdkp); | 846 | scsi_disk_put(sdkp); |
847 | unlock_kernel(); | ||
848 | return retval; | 847 | return retval; |
849 | } | 848 | } |
850 | 849 | ||
@@ -858,6 +857,8 @@ error_out: | |||
858 | * | 857 | * |
859 | * Note: may block (uninterruptible) if error recovery is underway | 858 | * Note: may block (uninterruptible) if error recovery is underway |
860 | * on this disk. | 859 | * on this disk. |
860 | * | ||
861 | * Locking: called with bdev->bd_mutex held. | ||
861 | **/ | 862 | **/ |
862 | static int sd_release(struct gendisk *disk, fmode_t mode) | 863 | static int sd_release(struct gendisk *disk, fmode_t mode) |
863 | { | 864 | { |
@@ -866,8 +867,7 @@ static int sd_release(struct gendisk *disk, fmode_t mode) | |||
866 | 867 | ||
867 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_release\n")); | 868 | SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_release\n")); |
868 | 869 | ||
869 | lock_kernel(); | 870 | if (atomic_dec_return(&sdkp->openers) && sdev->removable) { |
870 | if (!--sdkp->openers && sdev->removable) { | ||
871 | if (scsi_block_when_processing_errors(sdev)) | 871 | if (scsi_block_when_processing_errors(sdev)) |
872 | scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW); | 872 | scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW); |
873 | } | 873 | } |
@@ -877,7 +877,6 @@ static int sd_release(struct gendisk *disk, fmode_t mode) | |||
877 | * XXX is followed by a "rmmod sd_mod"? | 877 | * XXX is followed by a "rmmod sd_mod"? |
878 | */ | 878 | */ |
879 | scsi_disk_put(sdkp); | 879 | scsi_disk_put(sdkp); |
880 | unlock_kernel(); | ||
881 | return 0; | 880 | return 0; |
882 | } | 881 | } |
883 | 882 | ||
@@ -930,7 +929,6 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode, | |||
930 | SCSI_LOG_IOCTL(1, printk("sd_ioctl: disk=%s, cmd=0x%x\n", | 929 | SCSI_LOG_IOCTL(1, printk("sd_ioctl: disk=%s, cmd=0x%x\n", |
931 | disk->disk_name, cmd)); | 930 | disk->disk_name, cmd)); |
932 | 931 | ||
933 | lock_kernel(); | ||
934 | /* | 932 | /* |
935 | * If we are in the middle of error recovery, don't let anyone | 933 | * If we are in the middle of error recovery, don't let anyone |
936 | * else try and use this device. Also, if error recovery fails, it | 934 | * else try and use this device. Also, if error recovery fails, it |
@@ -960,7 +958,6 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode, | |||
960 | break; | 958 | break; |
961 | } | 959 | } |
962 | out: | 960 | out: |
963 | unlock_kernel(); | ||
964 | return error; | 961 | return error; |
965 | } | 962 | } |
966 | 963 | ||
@@ -2346,7 +2343,7 @@ static int sd_probe(struct device *dev) | |||
2346 | sdkp->driver = &sd_template; | 2343 | sdkp->driver = &sd_template; |
2347 | sdkp->disk = gd; | 2344 | sdkp->disk = gd; |
2348 | sdkp->index = index; | 2345 | sdkp->index = index; |
2349 | sdkp->openers = 0; | 2346 | atomic_set(&sdkp->openers, 0); |
2350 | sdkp->previous_state = 1; | 2347 | sdkp->previous_state = 1; |
2351 | 2348 | ||
2352 | if (!sdp->request_queue->rq_timeout) { | 2349 | if (!sdp->request_queue->rq_timeout) { |