From 3ef7859b7d25ed88f0f1914b54af1cbca681769e Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Tue, 20 Feb 2007 11:01:57 -0500 Subject: [PATCH] --- yaml --- r: 53699 b: refs/heads/master c: 44ec95425c1d9dce6e4638c29e4362cfb44814e7 h: refs/heads/master i: 53697: 79b7b7cba00b31773f0eb60f5938331915a28639 53695: 1bb4f0811725eedf0d9dba22507a48bdd691b5b4 v: v3 --- [refs] | 2 +- trunk/block/ll_rw_blk.c | 2 ++ trunk/block/scsi_ioctl.c | 4 +++- trunk/drivers/scsi/sg.c | 13 +++++++++++-- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index d2351f597605..6201fe8c7a38 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1079a2d251f24a7d9e7576217f5f738bc4218337 +refs/heads/master: 44ec95425c1d9dce6e4638c29e4362cfb44814e7 diff --git a/trunk/block/ll_rw_blk.c b/trunk/block/ll_rw_blk.c index 38c293b987b7..cf8752abd61a 100644 --- a/trunk/block/ll_rw_blk.c +++ b/trunk/block/ll_rw_blk.c @@ -1925,6 +1925,8 @@ blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id) blk_queue_max_hw_segments(q, MAX_HW_SEGMENTS); blk_queue_max_phys_segments(q, MAX_PHYS_SEGMENTS); + q->sg_reserved_size = INT_MAX; + /* * all done */ diff --git a/trunk/block/scsi_ioctl.c b/trunk/block/scsi_ioctl.c index 65c6a3cba6d6..e83f1dbf7c29 100644 --- a/trunk/block/scsi_ioctl.c +++ b/trunk/block/scsi_ioctl.c @@ -78,7 +78,9 @@ static int sg_set_timeout(request_queue_t *q, int __user *p) static int sg_get_reserved_size(request_queue_t *q, int __user *p) { - return put_user(q->sg_reserved_size, p); + unsigned val = min(q->sg_reserved_size, q->max_sectors << 9); + + return put_user(val, p); } static int sg_set_reserved_size(request_queue_t *q, int __user *p) diff --git a/trunk/drivers/scsi/sg.c b/trunk/drivers/scsi/sg.c index 81e3bc7b02a1..570977cf9efb 100644 --- a/trunk/drivers/scsi/sg.c +++ b/trunk/drivers/scsi/sg.c @@ -917,6 +917,8 @@ sg_ioctl(struct inode *inode, struct file *filp, return result; if (val < 0) return -EINVAL; + val = min_t(int, val, + sdp->device->request_queue->max_sectors * 512); if (val != sfp->reserve.bufflen) { if (sg_res_in_use(sfp) || sfp->mmap_called) return -EBUSY; @@ -925,7 +927,8 @@ sg_ioctl(struct inode *inode, struct file *filp, } return 0; case SG_GET_RESERVED_SIZE: - val = (int) sfp->reserve.bufflen; + val = min_t(int, sfp->reserve.bufflen, + sdp->device->request_queue->max_sectors * 512); return put_user(val, ip); case SG_SET_COMMAND_Q: result = get_user(val, ip); @@ -1061,6 +1064,9 @@ sg_ioctl(struct inode *inode, struct file *filp, if (sdp->detached) return -ENODEV; return scsi_ioctl(sdp->device, cmd_in, p); + case BLKSECTGET: + return put_user(sdp->device->request_queue->max_sectors * 512, + ip); default: if (read_only) return -EPERM; /* don't know so take safe approach */ @@ -2339,6 +2345,7 @@ sg_add_sfp(Sg_device * sdp, int dev) { Sg_fd *sfp; unsigned long iflags; + int bufflen; sfp = kzalloc(sizeof(*sfp), GFP_ATOMIC | __GFP_NOWARN); if (!sfp) @@ -2369,7 +2376,9 @@ sg_add_sfp(Sg_device * sdp, int dev) if (unlikely(sg_big_buff != def_reserved_size)) sg_big_buff = def_reserved_size; - sg_build_reserve(sfp, sg_big_buff); + bufflen = min_t(int, sg_big_buff, + sdp->device->request_queue->max_sectors * 512); + sg_build_reserve(sfp, bufflen); SCSI_LOG_TIMEOUT(3, printk("sg_add_sfp: bufflen=%d, k_use_sg=%d\n", sfp->reserve.bufflen, sfp->reserve.k_use_sg)); return sfp;