diff options
Diffstat (limited to 'drivers/scsi/sg.c')
| -rw-r--r-- | drivers/scsi/sg.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 81e3bc7b02a1..570977cf9efb 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
| @@ -917,6 +917,8 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 917 | return result; | 917 | return result; |
| 918 | if (val < 0) | 918 | if (val < 0) |
| 919 | return -EINVAL; | 919 | return -EINVAL; |
| 920 | val = min_t(int, val, | ||
| 921 | sdp->device->request_queue->max_sectors * 512); | ||
| 920 | if (val != sfp->reserve.bufflen) { | 922 | if (val != sfp->reserve.bufflen) { |
| 921 | if (sg_res_in_use(sfp) || sfp->mmap_called) | 923 | if (sg_res_in_use(sfp) || sfp->mmap_called) |
| 922 | return -EBUSY; | 924 | return -EBUSY; |
| @@ -925,7 +927,8 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 925 | } | 927 | } |
| 926 | return 0; | 928 | return 0; |
| 927 | case SG_GET_RESERVED_SIZE: | 929 | case SG_GET_RESERVED_SIZE: |
| 928 | val = (int) sfp->reserve.bufflen; | 930 | val = min_t(int, sfp->reserve.bufflen, |
| 931 | sdp->device->request_queue->max_sectors * 512); | ||
| 929 | return put_user(val, ip); | 932 | return put_user(val, ip); |
| 930 | case SG_SET_COMMAND_Q: | 933 | case SG_SET_COMMAND_Q: |
| 931 | result = get_user(val, ip); | 934 | result = get_user(val, ip); |
| @@ -1061,6 +1064,9 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 1061 | if (sdp->detached) | 1064 | if (sdp->detached) |
| 1062 | return -ENODEV; | 1065 | return -ENODEV; |
| 1063 | return scsi_ioctl(sdp->device, cmd_in, p); | 1066 | return scsi_ioctl(sdp->device, cmd_in, p); |
| 1067 | case BLKSECTGET: | ||
| 1068 | return put_user(sdp->device->request_queue->max_sectors * 512, | ||
| 1069 | ip); | ||
| 1064 | default: | 1070 | default: |
| 1065 | if (read_only) | 1071 | if (read_only) |
| 1066 | return -EPERM; /* don't know so take safe approach */ | 1072 | return -EPERM; /* don't know so take safe approach */ |
| @@ -2339,6 +2345,7 @@ sg_add_sfp(Sg_device * sdp, int dev) | |||
| 2339 | { | 2345 | { |
| 2340 | Sg_fd *sfp; | 2346 | Sg_fd *sfp; |
| 2341 | unsigned long iflags; | 2347 | unsigned long iflags; |
| 2348 | int bufflen; | ||
| 2342 | 2349 | ||
| 2343 | sfp = kzalloc(sizeof(*sfp), GFP_ATOMIC | __GFP_NOWARN); | 2350 | sfp = kzalloc(sizeof(*sfp), GFP_ATOMIC | __GFP_NOWARN); |
| 2344 | if (!sfp) | 2351 | if (!sfp) |
| @@ -2369,7 +2376,9 @@ sg_add_sfp(Sg_device * sdp, int dev) | |||
| 2369 | if (unlikely(sg_big_buff != def_reserved_size)) | 2376 | if (unlikely(sg_big_buff != def_reserved_size)) |
| 2370 | sg_big_buff = def_reserved_size; | 2377 | sg_big_buff = def_reserved_size; |
| 2371 | 2378 | ||
| 2372 | sg_build_reserve(sfp, sg_big_buff); | 2379 | bufflen = min_t(int, sg_big_buff, |
| 2380 | sdp->device->request_queue->max_sectors * 512); | ||
| 2381 | sg_build_reserve(sfp, bufflen); | ||
| 2373 | SCSI_LOG_TIMEOUT(3, printk("sg_add_sfp: bufflen=%d, k_use_sg=%d\n", | 2382 | SCSI_LOG_TIMEOUT(3, printk("sg_add_sfp: bufflen=%d, k_use_sg=%d\n", |
| 2374 | sfp->reserve.bufflen, sfp->reserve.k_use_sg)); | 2383 | sfp->reserve.bufflen, sfp->reserve.k_use_sg)); |
| 2375 | return sfp; | 2384 | return sfp; |
