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; |