diff options
Diffstat (limited to 'drivers/block/cpqarray.c')
-rw-r--r-- | drivers/block/cpqarray.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index c459aeea3c0c..28937b661564 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c | |||
@@ -158,7 +158,7 @@ static int sendcmd( | |||
158 | unsigned int blkcnt, | 158 | unsigned int blkcnt, |
159 | unsigned int log_unit ); | 159 | unsigned int log_unit ); |
160 | 160 | ||
161 | static int ida_open(struct block_device *bdev, fmode_t mode); | 161 | static int ida_unlocked_open(struct block_device *bdev, fmode_t mode); |
162 | static int ida_release(struct gendisk *disk, fmode_t mode); | 162 | static int ida_release(struct gendisk *disk, fmode_t mode); |
163 | static int ida_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg); | 163 | static int ida_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg); |
164 | static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 164 | static int ida_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
@@ -196,7 +196,7 @@ static inline ctlr_info_t *get_host(struct gendisk *disk) | |||
196 | 196 | ||
197 | static const struct block_device_operations ida_fops = { | 197 | static const struct block_device_operations ida_fops = { |
198 | .owner = THIS_MODULE, | 198 | .owner = THIS_MODULE, |
199 | .open = ida_open, | 199 | .open = ida_unlocked_open, |
200 | .release = ida_release, | 200 | .release = ida_release, |
201 | .ioctl = ida_ioctl, | 201 | .ioctl = ida_ioctl, |
202 | .getgeo = ida_getgeo, | 202 | .getgeo = ida_getgeo, |
@@ -841,13 +841,29 @@ static int ida_open(struct block_device *bdev, fmode_t mode) | |||
841 | return 0; | 841 | return 0; |
842 | } | 842 | } |
843 | 843 | ||
844 | static int ida_unlocked_open(struct block_device *bdev, fmode_t mode) | ||
845 | { | ||
846 | int ret; | ||
847 | |||
848 | lock_kernel(); | ||
849 | ret = ida_open(bdev, mode); | ||
850 | unlock_kernel(); | ||
851 | |||
852 | return ret; | ||
853 | } | ||
854 | |||
844 | /* | 855 | /* |
845 | * Close. Sync first. | 856 | * Close. Sync first. |
846 | */ | 857 | */ |
847 | static int ida_release(struct gendisk *disk, fmode_t mode) | 858 | static int ida_release(struct gendisk *disk, fmode_t mode) |
848 | { | 859 | { |
849 | ctlr_info_t *host = get_host(disk); | 860 | ctlr_info_t *host; |
861 | |||
862 | lock_kernel(); | ||
863 | host = get_host(disk); | ||
850 | host->usage_count--; | 864 | host->usage_count--; |
865 | unlock_kernel(); | ||
866 | |||
851 | return 0; | 867 | return 0; |
852 | } | 868 | } |
853 | 869 | ||