summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorJames Bottomley <jejb@raven.il.steeleye.com>2003-05-01 01:45:23 -0500
committerJames Bottomley <jejb@raven.il.steeleye.com>2003-05-01 01:45:23 -0500
commit7cbecb83cd557a3eb3e28ceffe3516281833880d (patch)
tree2f7c91db9cdb43119140f5ec706d03c478714130 /drivers/block
parenteb0a5728e048e61e7802a0aa3e1dcd9d0353e78f (diff)
parenta950688a3255f8c466720b09d5a4f12930cc4da6 (diff)
Merge raven.il.steeleye.com:/home/jejb/BK/linux-2.5
into raven.il.steeleye.com:/home/jejb/BK/scsi-misc-2.5
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/scsi_ioctl.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/block/scsi_ioctl.c b/drivers/block/scsi_ioctl.c
index 78bbe1d6e1bc..fc3e3f7aaff8 100644
--- a/drivers/block/scsi_ioctl.c
+++ b/drivers/block/scsi_ioctl.c
@@ -299,13 +299,14 @@ static int sg_io(request_queue_t *q, struct block_device *bdev,
#define MOVE_MEDIUM_TIMEOUT (5 * 60 * HZ)
#define READ_ELEMENT_STATUS_TIMEOUT (5 * 60 * HZ)
#define READ_DEFECT_DATA_TIMEOUT (60 * HZ )
+#define OMAX_SB_LEN 16 /* For backward compatibility */
static int sg_scsi_ioctl(request_queue_t *q, struct block_device *bdev,
Scsi_Ioctl_Command *sic)
{
struct request *rq;
int err, in_len, out_len, bytes, opcode, cmdlen;
- char *buffer = NULL, sense[24];
+ char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE];
/*
* get in an out lengths, verify they don't exceed a page worth of data
@@ -378,9 +379,12 @@ static int sg_scsi_ioctl(request_queue_t *q, struct block_device *bdev,
blk_do_rq(q, bdev, rq);
err = rq->errors & 0xff; /* only 8 bit SCSI status */
if (err) {
- if (rq->sense_len)
- if (copy_to_user(sic->data, rq->sense, rq->sense_len))
+ if (rq->sense_len && rq->sense) {
+ bytes = (OMAX_SB_LEN > rq->sense_len) ?
+ rq->sense_len : OMAX_SB_LEN;
+ if (copy_to_user(sic->data, rq->sense, bytes))
err = -EFAULT;
+ }
} else {
if (copy_to_user(sic->data, buffer, out_len))
err = -EFAULT;