Commit 990e08a3 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] sparse: sg.c annotation

rest of pointers in sg ioctl arguments made __user.
parent c8293669
...@@ -400,7 +400,7 @@ int scsi_cmd_ioctl(struct gendisk *bd_disk, unsigned int cmd, void __user *arg) ...@@ -400,7 +400,7 @@ int scsi_cmd_ioctl(struct gendisk *bd_disk, unsigned int cmd, void __user *arg)
break; break;
hdr.dxferp = cgc.buffer; hdr.dxferp = cgc.buffer;
hdr.sbp = (char *) cgc.sense; hdr.sbp = cgc.sense;
if (hdr.sbp) if (hdr.sbp)
hdr.mx_sb_len = sizeof(struct request_sense); hdr.mx_sb_len = sizeof(struct request_sense);
hdr.timeout = cgc.timeout; hdr.timeout = cgc.timeout;
......
...@@ -182,17 +182,17 @@ static void sg_finish_rem_req(Sg_request * srp); ...@@ -182,17 +182,17 @@ static void sg_finish_rem_req(Sg_request * srp);
static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size); static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size);
static int sg_build_sgat(Sg_scatter_hold * schp, const Sg_fd * sfp, static int sg_build_sgat(Sg_scatter_hold * schp, const Sg_fd * sfp,
int tablesize); int tablesize);
static ssize_t sg_new_read(Sg_fd * sfp, char *buf, size_t count, static ssize_t sg_new_read(Sg_fd * sfp, char __user *buf, size_t count,
Sg_request * srp); Sg_request * srp);
static ssize_t sg_new_write(Sg_fd * sfp, const char *buf, size_t count, static ssize_t sg_new_write(Sg_fd * sfp, const char __user *buf, size_t count,
int blocking, int read_only, Sg_request ** o_srp); int blocking, int read_only, Sg_request ** o_srp);
static int sg_common_write(Sg_fd * sfp, Sg_request * srp, static int sg_common_write(Sg_fd * sfp, Sg_request * srp,
unsigned char *cmnd, int timeout, int blocking); unsigned char *cmnd, int timeout, int blocking);
static int sg_u_iovec(sg_io_hdr_t * hp, int sg_num, int ind, static int sg_u_iovec(sg_io_hdr_t * hp, int sg_num, int ind,
int wr_xf, int *countp, unsigned char **up); int wr_xf, int *countp, unsigned char __user **up);
static int sg_write_xfer(Sg_request * srp); static int sg_write_xfer(Sg_request * srp);
static int sg_read_xfer(Sg_request * srp); static int sg_read_xfer(Sg_request * srp);
static int sg_read_oxfer(Sg_request * srp, char *outp, int num_read_xfer); static int sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer);
static void sg_remove_scat(Sg_scatter_hold * schp); static void sg_remove_scat(Sg_scatter_hold * schp);
static void sg_build_reserve(Sg_fd * sfp, int req_size); static void sg_build_reserve(Sg_fd * sfp, int req_size);
static void sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size); static void sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size);
...@@ -329,7 +329,7 @@ sg_release(struct inode *inode, struct file *filp) ...@@ -329,7 +329,7 @@ sg_release(struct inode *inode, struct file *filp)
} }
static ssize_t static ssize_t
sg_read(struct file *filp, char *buf, size_t count, loff_t * ppos) sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos)
{ {
int k, res; int k, res;
Sg_device *sdp; Sg_device *sdp;
...@@ -443,7 +443,7 @@ sg_read(struct file *filp, char *buf, size_t count, loff_t * ppos) ...@@ -443,7 +443,7 @@ sg_read(struct file *filp, char *buf, size_t count, loff_t * ppos)
} }
static ssize_t static ssize_t
sg_new_read(Sg_fd * sfp, char *buf, size_t count, Sg_request * srp) sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp)
{ {
sg_io_hdr_t *hp = &srp->header; sg_io_hdr_t *hp = &srp->header;
int err = 0; int err = 0;
...@@ -481,7 +481,7 @@ sg_new_read(Sg_fd * sfp, char *buf, size_t count, Sg_request * srp) ...@@ -481,7 +481,7 @@ sg_new_read(Sg_fd * sfp, char *buf, size_t count, Sg_request * srp)
} }
static ssize_t static ssize_t
sg_write(struct file *filp, const char *buf, size_t count, loff_t * ppos) sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos)
{ {
int mxsize, cmd_size, k; int mxsize, cmd_size, k;
int input_size, blocking; int input_size, blocking;
...@@ -558,7 +558,7 @@ sg_write(struct file *filp, const char *buf, size_t count, loff_t * ppos) ...@@ -558,7 +558,7 @@ sg_write(struct file *filp, const char *buf, size_t count, loff_t * ppos)
else else
hp->dxfer_direction = (mxsize > 0) ? SG_DXFER_FROM_DEV : SG_DXFER_NONE; hp->dxfer_direction = (mxsize > 0) ? SG_DXFER_FROM_DEV : SG_DXFER_NONE;
hp->dxfer_len = mxsize; hp->dxfer_len = mxsize;
hp->dxferp = (unsigned char *) buf + cmd_size; hp->dxferp = (char __user *)buf + cmd_size;
hp->sbp = NULL; hp->sbp = NULL;
hp->timeout = old_hdr.reply_len; /* structure abuse ... */ hp->timeout = old_hdr.reply_len; /* structure abuse ... */
hp->flags = input_size; /* structure abuse ... */ hp->flags = input_size; /* structure abuse ... */
...@@ -571,7 +571,7 @@ sg_write(struct file *filp, const char *buf, size_t count, loff_t * ppos) ...@@ -571,7 +571,7 @@ sg_write(struct file *filp, const char *buf, size_t count, loff_t * ppos)
} }
static ssize_t static ssize_t
sg_new_write(Sg_fd * sfp, const char *buf, size_t count, sg_new_write(Sg_fd * sfp, const char __user *buf, size_t count,
int blocking, int read_only, Sg_request ** o_srp) int blocking, int read_only, Sg_request ** o_srp)
{ {
int k; int k;
...@@ -726,6 +726,8 @@ static int ...@@ -726,6 +726,8 @@ static int
sg_ioctl(struct inode *inode, struct file *filp, sg_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd_in, unsigned long arg) unsigned int cmd_in, unsigned long arg)
{ {
void __user *p = (void __user *)arg;
int __user *ip = p;
int result, val, read_only; int result, val, read_only;
Sg_device *sdp; Sg_device *sdp;
Sg_fd *sfp; Sg_fd *sfp;
...@@ -747,12 +749,11 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -747,12 +749,11 @@ sg_ioctl(struct inode *inode, struct file *filp,
return -ENODEV; return -ENODEV;
if (!scsi_block_when_processing_errors(sdp->device)) if (!scsi_block_when_processing_errors(sdp->device))
return -ENXIO; return -ENXIO;
result = verify_area(VERIFY_WRITE, (void *) arg, result = verify_area(VERIFY_WRITE, p, SZ_SG_IO_HDR);
SZ_SG_IO_HDR);
if (result) if (result)
return result; return result;
result = result =
sg_new_write(sfp, (const char *) arg, SZ_SG_IO_HDR, sg_new_write(sfp, p, SZ_SG_IO_HDR,
blocking, read_only, &srp); blocking, read_only, &srp);
if (result < 0) if (result < 0)
return result; return result;
...@@ -772,11 +773,11 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -772,11 +773,11 @@ sg_ioctl(struct inode *inode, struct file *filp,
return result; /* -ERESTARTSYS because signal hit process */ return result; /* -ERESTARTSYS because signal hit process */
} }
srp->done = 2; srp->done = 2;
result = sg_new_read(sfp, (char *) arg, SZ_SG_IO_HDR, srp); result = sg_new_read(sfp, p, SZ_SG_IO_HDR, srp);
return (result < 0) ? result : 0; return (result < 0) ? result : 0;
} }
case SG_SET_TIMEOUT: case SG_SET_TIMEOUT:
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
if (val < 0) if (val < 0)
...@@ -791,7 +792,7 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -791,7 +792,7 @@ sg_ioctl(struct inode *inode, struct file *filp,
/* strange ..., for backward compatibility */ /* strange ..., for backward compatibility */
return sfp->timeout_user; return sfp->timeout_user;
case SG_SET_FORCE_LOW_DMA: case SG_SET_FORCE_LOW_DMA:
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
if (val) { if (val) {
...@@ -808,15 +809,14 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -808,15 +809,14 @@ sg_ioctl(struct inode *inode, struct file *filp,
} }
return 0; return 0;
case SG_GET_LOW_DMA: case SG_GET_LOW_DMA:
return put_user((int) sfp->low_dma, (int *) arg); return put_user((int) sfp->low_dma, ip);
case SG_GET_SCSI_ID: case SG_GET_SCSI_ID:
result = result =
verify_area(VERIFY_WRITE, (void *) arg, verify_area(VERIFY_WRITE, p, sizeof (sg_scsi_id_t));
sizeof (sg_scsi_id_t));
if (result) if (result)
return result; return result;
else { else {
sg_scsi_id_t *sg_idp = (sg_scsi_id_t *) arg; sg_scsi_id_t __user *sg_idp = p;
if (sdp->detached) if (sdp->detached)
return -ENODEV; return -ENODEV;
...@@ -836,13 +836,13 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -836,13 +836,13 @@ sg_ioctl(struct inode *inode, struct file *filp,
return 0; return 0;
} }
case SG_SET_FORCE_PACK_ID: case SG_SET_FORCE_PACK_ID:
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
sfp->force_packid = val ? 1 : 0; sfp->force_packid = val ? 1 : 0;
return 0; return 0;
case SG_GET_PACK_ID: case SG_GET_PACK_ID:
result = verify_area(VERIFY_WRITE, (void *) arg, sizeof (int)); result = verify_area(VERIFY_WRITE, ip, sizeof (int));
if (result) if (result)
return result; return result;
read_lock_irqsave(&sfp->rq_list_lock, iflags); read_lock_irqsave(&sfp->rq_list_lock, iflags);
...@@ -850,12 +850,12 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -850,12 +850,12 @@ sg_ioctl(struct inode *inode, struct file *filp,
if ((1 == srp->done) && (!srp->sg_io_owned)) { if ((1 == srp->done) && (!srp->sg_io_owned)) {
read_unlock_irqrestore(&sfp->rq_list_lock, read_unlock_irqrestore(&sfp->rq_list_lock,
iflags); iflags);
__put_user(srp->header.pack_id, (int *) arg); __put_user(srp->header.pack_id, ip);
return 0; return 0;
} }
} }
read_unlock_irqrestore(&sfp->rq_list_lock, iflags); read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
__put_user(-1, (int *) arg); __put_user(-1, ip);
return 0; return 0;
case SG_GET_NUM_WAITING: case SG_GET_NUM_WAITING:
read_lock_irqsave(&sfp->rq_list_lock, iflags); read_lock_irqsave(&sfp->rq_list_lock, iflags);
...@@ -864,11 +864,11 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -864,11 +864,11 @@ sg_ioctl(struct inode *inode, struct file *filp,
++val; ++val;
} }
read_unlock_irqrestore(&sfp->rq_list_lock, iflags); read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
return put_user(val, (int *) arg); return put_user(val, ip);
case SG_GET_SG_TABLESIZE: case SG_GET_SG_TABLESIZE:
return put_user(sdp->sg_tablesize, (int *) arg); return put_user(sdp->sg_tablesize, ip);
case SG_SET_RESERVED_SIZE: case SG_SET_RESERVED_SIZE:
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
if (val < 0) if (val < 0)
...@@ -882,37 +882,37 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -882,37 +882,37 @@ sg_ioctl(struct inode *inode, struct file *filp,
return 0; return 0;
case SG_GET_RESERVED_SIZE: case SG_GET_RESERVED_SIZE:
val = (int) sfp->reserve.bufflen; val = (int) sfp->reserve.bufflen;
return put_user(val, (int *) arg); return put_user(val, ip);
case SG_SET_COMMAND_Q: case SG_SET_COMMAND_Q:
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
sfp->cmd_q = val ? 1 : 0; sfp->cmd_q = val ? 1 : 0;
return 0; return 0;
case SG_GET_COMMAND_Q: case SG_GET_COMMAND_Q:
return put_user((int) sfp->cmd_q, (int *) arg); return put_user((int) sfp->cmd_q, ip);
case SG_SET_KEEP_ORPHAN: case SG_SET_KEEP_ORPHAN:
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
sfp->keep_orphan = val; sfp->keep_orphan = val;
return 0; return 0;
case SG_GET_KEEP_ORPHAN: case SG_GET_KEEP_ORPHAN:
return put_user((int) sfp->keep_orphan, (int *) arg); return put_user((int) sfp->keep_orphan, ip);
case SG_NEXT_CMD_LEN: case SG_NEXT_CMD_LEN:
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
sfp->next_cmd_len = (val > 0) ? val : 0; sfp->next_cmd_len = (val > 0) ? val : 0;
return 0; return 0;
case SG_GET_VERSION_NUM: case SG_GET_VERSION_NUM:
return put_user(sg_version_num, (int *) arg); return put_user(sg_version_num, ip);
case SG_GET_ACCESS_COUNT: case SG_GET_ACCESS_COUNT:
/* faked - we don't have a real access count anymore */ /* faked - we don't have a real access count anymore */
val = (sdp->device ? 1 : 0); val = (sdp->device ? 1 : 0);
return put_user(val, (int *) arg); return put_user(val, ip);
case SG_GET_REQUEST_TABLE: case SG_GET_REQUEST_TABLE:
result = verify_area(VERIFY_WRITE, (void *) arg, result = verify_area(VERIFY_WRITE, p,
SZ_SG_REQ_INFO * SG_MAX_QUEUE); SZ_SG_REQ_INFO * SG_MAX_QUEUE);
if (result) if (result)
return result; return result;
...@@ -940,13 +940,13 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -940,13 +940,13 @@ sg_ioctl(struct inode *inode, struct file *filp,
} }
} }
read_unlock_irqrestore(&sfp->rq_list_lock, iflags); read_unlock_irqrestore(&sfp->rq_list_lock, iflags);
return (__copy_to_user((void *) arg, rinfo, return (__copy_to_user(p, rinfo,
SZ_SG_REQ_INFO * SG_MAX_QUEUE) ? -EFAULT : 0); SZ_SG_REQ_INFO * SG_MAX_QUEUE) ? -EFAULT : 0);
} }
case SG_EMULATED_HOST: case SG_EMULATED_HOST:
if (sdp->detached) if (sdp->detached)
return -ENODEV; return -ENODEV;
return put_user(sdp->device->host->hostt->emulated, (int *) arg); return put_user(sdp->device->host->hostt->emulated, ip);
case SG_SCSI_RESET: case SG_SCSI_RESET:
if (sdp->detached) if (sdp->detached)
return -ENODEV; return -ENODEV;
...@@ -956,7 +956,7 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -956,7 +956,7 @@ sg_ioctl(struct inode *inode, struct file *filp,
return -EBUSY; return -EBUSY;
} else if (!scsi_block_when_processing_errors(sdp->device)) } else if (!scsi_block_when_processing_errors(sdp->device))
return -EBUSY; return -EBUSY;
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
if (SG_SCSI_RESET_NOTHING == val) if (SG_SCSI_RESET_NOTHING == val)
...@@ -983,16 +983,16 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -983,16 +983,16 @@ sg_ioctl(struct inode *inode, struct file *filp,
return -ENODEV; return -ENODEV;
if (read_only) { if (read_only) {
unsigned char opcode = WRITE_6; unsigned char opcode = WRITE_6;
Scsi_Ioctl_Command *siocp = (void *) arg; Scsi_Ioctl_Command __user *siocp = p;
if (copy_from_user(&opcode, siocp->data, 1)) if (copy_from_user(&opcode, siocp->data, 1))
return -EFAULT; return -EFAULT;
if (!sg_allow_access(opcode, sdp->device->type)) if (!sg_allow_access(opcode, sdp->device->type))
return -EPERM; return -EPERM;
} }
return scsi_ioctl_send_command(sdp->device, (void __user *) arg); return scsi_ioctl_send_command(sdp->device, p);
case SG_SET_DEBUG: case SG_SET_DEBUG:
result = get_user(val, (int *) arg); result = get_user(val, ip);
if (result) if (result)
return result; return result;
sdp->sgdebug = (char) val; sdp->sgdebug = (char) val;
...@@ -1003,11 +1003,11 @@ sg_ioctl(struct inode *inode, struct file *filp, ...@@ -1003,11 +1003,11 @@ sg_ioctl(struct inode *inode, struct file *filp,
case SG_GET_TRANSFORM: case SG_GET_TRANSFORM:
if (sdp->detached) if (sdp->detached)
return -ENODEV; return -ENODEV;
return scsi_ioctl(sdp->device, cmd_in, (void __user *)arg); return scsi_ioctl(sdp->device, cmd_in, p);
default: default:
if (read_only) if (read_only)
return -EPERM; /* don't know so take safe approach */ return -EPERM; /* don't know so take safe approach */
return scsi_ioctl(sdp->device, cmd_in, (void __user *)arg); return scsi_ioctl(sdp->device, cmd_in, p);
} }
} }
...@@ -1901,7 +1901,7 @@ sg_write_xfer(Sg_request * srp) ...@@ -1901,7 +1901,7 @@ sg_write_xfer(Sg_request * srp)
int iovec_count = (int) hp->iovec_count; int iovec_count = (int) hp->iovec_count;
int dxfer_dir = hp->dxfer_direction; int dxfer_dir = hp->dxfer_direction;
unsigned char *p; unsigned char *p;
unsigned char *up; unsigned char __user *up;
int new_interface = ('\0' == hp->interface_id) ? 0 : 1; int new_interface = ('\0' == hp->interface_id) ? 0 : 1;
if ((SG_DXFER_UNKNOWN == dxfer_dir) || (SG_DXFER_TO_DEV == dxfer_dir) || if ((SG_DXFER_UNKNOWN == dxfer_dir) || (SG_DXFER_TO_DEV == dxfer_dir) ||
...@@ -1987,26 +1987,23 @@ sg_write_xfer(Sg_request * srp) ...@@ -1987,26 +1987,23 @@ sg_write_xfer(Sg_request * srp)
static int static int
sg_u_iovec(sg_io_hdr_t * hp, int sg_num, int ind, sg_u_iovec(sg_io_hdr_t * hp, int sg_num, int ind,
int wr_xf, int *countp, unsigned char **up) int wr_xf, int *countp, unsigned char __user **up)
{ {
int num_xfer = (int) hp->dxfer_len; int num_xfer = (int) hp->dxfer_len;
unsigned char *p; unsigned char __user *p = hp->dxferp;
int count, k; int count, k;
sg_iovec_t u_iovec;
if (0 == sg_num) { if (0 == sg_num) {
p = (unsigned char *) hp->dxferp;
if (wr_xf && ('\0' == hp->interface_id)) if (wr_xf && ('\0' == hp->interface_id))
count = (int) hp->flags; /* holds "old" input_size */ count = (int) hp->flags; /* holds "old" input_size */
else else
count = num_xfer; count = num_xfer;
} else { } else {
if (__copy_from_user(&u_iovec, sg_iovec_t iovec;
(unsigned char *) hp->dxferp + if (__copy_from_user(&iovec, p + ind*SZ_SG_IOVEC, SZ_SG_IOVEC))
(ind * SZ_SG_IOVEC), SZ_SG_IOVEC))
return -EFAULT; return -EFAULT;
p = (unsigned char *) u_iovec.iov_base; p = iovec.iov_base;
count = (int) u_iovec.iov_len; count = (int) iovec.iov_len;
} }
if ((k = verify_area(wr_xf ? VERIFY_READ : VERIFY_WRITE, p, count))) if ((k = verify_area(wr_xf ? VERIFY_READ : VERIFY_WRITE, p, count)))
return k; return k;
...@@ -2058,7 +2055,7 @@ sg_read_xfer(Sg_request * srp) ...@@ -2058,7 +2055,7 @@ sg_read_xfer(Sg_request * srp)
int iovec_count = (int) hp->iovec_count; int iovec_count = (int) hp->iovec_count;
int dxfer_dir = hp->dxfer_direction; int dxfer_dir = hp->dxfer_direction;
unsigned char *p; unsigned char *p;
unsigned char *up; unsigned char __user *up;
int new_interface = ('\0' == hp->interface_id) ? 0 : 1; int new_interface = ('\0' == hp->interface_id) ? 0 : 1;
if ((SG_DXFER_UNKNOWN == dxfer_dir) || (SG_DXFER_FROM_DEV == dxfer_dir) if ((SG_DXFER_UNKNOWN == dxfer_dir) || (SG_DXFER_FROM_DEV == dxfer_dir)
...@@ -2143,7 +2140,7 @@ sg_read_xfer(Sg_request * srp) ...@@ -2143,7 +2140,7 @@ sg_read_xfer(Sg_request * srp)
} }
static int static int
sg_read_oxfer(Sg_request * srp, char *outp, int num_read_xfer) sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer)
{ {
Sg_scatter_hold *schp = &srp->data; Sg_scatter_hold *schp = &srp->data;
......
...@@ -91,7 +91,7 @@ Major new features in SG 3.x driver (cf SG 2.x drivers) ...@@ -91,7 +91,7 @@ Major new features in SG 3.x driver (cf SG 2.x drivers)
typedef struct sg_iovec /* same structure as used by readv() Linux system */ typedef struct sg_iovec /* same structure as used by readv() Linux system */
{ /* call. It defines one scatter-gather element. */ { /* call. It defines one scatter-gather element. */
void * iov_base; /* Starting address */ void __user *iov_base; /* Starting address */
size_t iov_len; /* Length in bytes */ size_t iov_len; /* Length in bytes */
} sg_iovec_t; } sg_iovec_t;
...@@ -104,14 +104,14 @@ typedef struct sg_io_hdr ...@@ -104,14 +104,14 @@ typedef struct sg_io_hdr
unsigned char mx_sb_len; /* [i] max length to write to sbp */ unsigned char mx_sb_len; /* [i] max length to write to sbp */
unsigned short iovec_count; /* [i] 0 implies no scatter gather */ unsigned short iovec_count; /* [i] 0 implies no scatter gather */
unsigned int dxfer_len; /* [i] byte count of data transfer */ unsigned int dxfer_len; /* [i] byte count of data transfer */
void * dxferp; /* [i], [*io] points to data transfer memory void __user *dxferp; /* [i], [*io] points to data transfer memory
or scatter gather list */ or scatter gather list */
unsigned char __user *cmdp; /* [i], [*i] points to command to perform */ unsigned char __user *cmdp; /* [i], [*i] points to command to perform */
unsigned char * sbp; /* [i], [*o] points to sense_buffer memory */ void __user *sbp; /* [i], [*o] points to sense_buffer memory */
unsigned int timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */ unsigned int timeout; /* [i] MAX_UINT->no timeout (unit: millisec) */
unsigned int flags; /* [i] 0 -> default, see SG_FLAG... */ unsigned int flags; /* [i] 0 -> default, see SG_FLAG... */
int pack_id; /* [i->o] unused internally (normally) */ int pack_id; /* [i->o] unused internally (normally) */
void * usr_ptr; /* [i->o] unused internally */ void __user * usr_ptr; /* [i->o] unused internally */
unsigned char status; /* [o] scsi status */ unsigned char status; /* [o] scsi status */
unsigned char masked_status;/* [o] shifted, masked scsi status */ unsigned char masked_status;/* [o] shifted, masked scsi status */
unsigned char msg_status; /* [o] messaging level data (optional) */ unsigned char msg_status; /* [o] messaging level data (optional) */
...@@ -171,7 +171,7 @@ typedef struct sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */ ...@@ -171,7 +171,7 @@ typedef struct sg_req_info { /* used by SG_GET_REQUEST_TABLE ioctl() */
char sg_io_owned; /* 0 -> complete with read(), 1 -> owned by SG_IO */ char sg_io_owned; /* 0 -> complete with read(), 1 -> owned by SG_IO */
char problem; /* 0 -> no problem detected, 1 -> error to report */ char problem; /* 0 -> no problem detected, 1 -> error to report */
int pack_id; /* pack_id associated with request */ int pack_id; /* pack_id associated with request */
void * usr_ptr; /* user provided pointer (in new interface) */ void __user *usr_ptr; /* user provided pointer (in new interface) */
unsigned int duration; /* millisecs elapsed since written (req_state==1) unsigned int duration; /* millisecs elapsed since written (req_state==1)
or request duration (req_state==2) */ or request duration (req_state==2) */
int unused; int unused;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment