[SCSI] bsg: update sg_io_v4 structure
This updates sg_io_v4 structure (based on Doug's RFC, release 1.3). The major changes are: - add dout_resid field - increase tag size to 64 bits to comply with SAM-4 and SRP - add dout_iovec_count and din_iovec_count dout_iovec_count and din_iovec_count aren't supported now. I'm not sure whether they will be supported or not but they were added for the possible future changes. Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
db47c2d8d9
commit
0c6a89ba64
10
block/bsg.c
10
block/bsg.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* bsg.c - block layer implementation of the sg v3 interface
|
* bsg.c - block layer implementation of the sg v4 interface
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 Jens Axboe <axboe@suse.de> SUSE Labs
|
* Copyright (C) 2004 Jens Axboe <axboe@suse.de> SUSE Labs
|
||||||
* Copyright (C) 2004 Peter M. Jones <pjones@redhat.com>
|
* Copyright (C) 2004 Peter M. Jones <pjones@redhat.com>
|
||||||
|
@ -421,7 +421,6 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
|
||||||
hdr->info = 0;
|
hdr->info = 0;
|
||||||
if (hdr->device_status || hdr->transport_status || hdr->driver_status)
|
if (hdr->device_status || hdr->transport_status || hdr->driver_status)
|
||||||
hdr->info |= SG_INFO_CHECK;
|
hdr->info |= SG_INFO_CHECK;
|
||||||
hdr->din_resid = rq->data_len;
|
|
||||||
hdr->response_len = 0;
|
hdr->response_len = 0;
|
||||||
|
|
||||||
if (rq->sense_len && hdr->response) {
|
if (rq->sense_len && hdr->response) {
|
||||||
|
@ -437,9 +436,14 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rq->next_rq) {
|
if (rq->next_rq) {
|
||||||
|
hdr->dout_resid = rq->data_len;
|
||||||
|
hdr->din_resid = rq->next_rq->data_len;
|
||||||
blk_rq_unmap_user(bidi_bio);
|
blk_rq_unmap_user(bidi_bio);
|
||||||
blk_put_request(rq->next_rq);
|
blk_put_request(rq->next_rq);
|
||||||
}
|
} else if (rq_data_dir(rq) == READ)
|
||||||
|
hdr->din_resid = rq->data_len;
|
||||||
|
else
|
||||||
|
hdr->dout_resid = rq->data_len;
|
||||||
|
|
||||||
blk_rq_unmap_user(bio);
|
blk_rq_unmap_user(bio);
|
||||||
blk_put_request(rq);
|
blk_put_request(rq);
|
||||||
|
|
|
@ -15,14 +15,18 @@ struct sg_io_v4 {
|
||||||
|
|
||||||
__u32 request_len; /* [i] in bytes */
|
__u32 request_len; /* [i] in bytes */
|
||||||
__u64 request; /* [i], [*i] {SCSI: cdb} */
|
__u64 request; /* [i], [*i] {SCSI: cdb} */
|
||||||
|
__u64 request_tag; /* [i] {SCSI: task tag (only if flagged)} */
|
||||||
__u32 request_attr; /* [i] {SCSI: task attribute} */
|
__u32 request_attr; /* [i] {SCSI: task attribute} */
|
||||||
__u32 request_tag; /* [i] {SCSI: task tag (only if flagged)} */
|
|
||||||
__u32 request_priority; /* [i] {SCSI: task priority} */
|
__u32 request_priority; /* [i] {SCSI: task priority} */
|
||||||
|
__u32 request_extra; /* [i] {spare, for padding} */
|
||||||
__u32 max_response_len; /* [i] in bytes */
|
__u32 max_response_len; /* [i] in bytes */
|
||||||
__u64 response; /* [i], [*o] {SCSI: (auto)sense data} */
|
__u64 response; /* [i], [*o] {SCSI: (auto)sense data} */
|
||||||
|
|
||||||
/* "din_" for data in (from device); "dout_" for data out (to device) */
|
/* "dout_": data out (to device); "din_": data in (from device) */
|
||||||
|
__u32 dout_iovec_count; /* [i] 0 -> "flat" dout transfer else
|
||||||
|
dout_xfer points to array of iovec */
|
||||||
__u32 dout_xfer_len; /* [i] bytes to be transferred to device */
|
__u32 dout_xfer_len; /* [i] bytes to be transferred to device */
|
||||||
|
__u32 din_iovec_count; /* [i] 0 -> "flat" din transfer */
|
||||||
__u32 din_xfer_len; /* [i] bytes to be transferred from device */
|
__u32 din_xfer_len; /* [i] bytes to be transferred from device */
|
||||||
__u64 dout_xferp; /* [i], [*i] */
|
__u64 dout_xferp; /* [i], [*i] */
|
||||||
__u64 din_xferp; /* [i], [*o] */
|
__u64 din_xferp; /* [i], [*o] */
|
||||||
|
@ -39,8 +43,9 @@ struct sg_io_v4 {
|
||||||
__u32 info; /* [o] additional information */
|
__u32 info; /* [o] additional information */
|
||||||
__u32 duration; /* [o] time to complete, in milliseconds */
|
__u32 duration; /* [o] time to complete, in milliseconds */
|
||||||
__u32 response_len; /* [o] bytes of response actually written */
|
__u32 response_len; /* [o] bytes of response actually written */
|
||||||
__s32 din_resid; /* [o] actual_din_xfer_len - din_xfer_len */
|
__s32 din_resid; /* [o] din_xfer_len - actual_din_xfer_len */
|
||||||
__u32 generated_tag; /* [o] {SCSI: task tag that transport chose} */
|
__s32 dout_resid; /* [o] dout_xfer_len - actual_dout_xfer_len */
|
||||||
|
__u64 generated_tag; /* [o] {SCSI: transport generated task tag} */
|
||||||
__u32 spare_out; /* [o] */
|
__u32 spare_out; /* [o] */
|
||||||
|
|
||||||
__u32 padding;
|
__u32 padding;
|
||||||
|
|
Loading…
Reference in New Issue