diff options
Diffstat (limited to 'drivers/block/cciss.c')
-rw-r--r-- | drivers/block/cciss.c | 23 |
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); | |||
178 | static irqreturn_t do_cciss_intx(int irq, void *dev_id); | 178 | static irqreturn_t do_cciss_intx(int irq, void *dev_id); |
179 | static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id); | 179 | static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id); |
180 | static int cciss_open(struct block_device *bdev, fmode_t mode); | 180 | static int cciss_open(struct block_device *bdev, fmode_t mode); |
181 | static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode); | ||
181 | static int cciss_release(struct gendisk *disk, fmode_t mode); | 182 | static int cciss_release(struct gendisk *disk, fmode_t mode); |
182 | static int do_ioctl(struct block_device *bdev, fmode_t mode, | 183 | static 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 | ||
238 | static const struct block_device_operations cciss_fops = { | 239 | static 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 | ||
1046 | static 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 | */ |
1048 | static int cciss_release(struct gendisk *disk, fmode_t mode) | 1060 | static 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 | ||