diff options
49 files changed, 458 insertions, 410 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index 0a485ad802c9..f3bc083d4c14 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -132,8 +132,6 @@ void blk_rq_init(struct request_queue *q, struct request *rq) | |||
132 | rq->__sector = (sector_t) -1; | 132 | rq->__sector = (sector_t) -1; |
133 | INIT_HLIST_NODE(&rq->hash); | 133 | INIT_HLIST_NODE(&rq->hash); |
134 | RB_CLEAR_NODE(&rq->rb_node); | 134 | RB_CLEAR_NODE(&rq->rb_node); |
135 | rq->cmd = rq->__cmd; | ||
136 | rq->cmd_len = BLK_MAX_CDB; | ||
137 | rq->tag = -1; | 135 | rq->tag = -1; |
138 | rq->internal_tag = -1; | 136 | rq->internal_tag = -1; |
139 | rq->start_time = jiffies; | 137 | rq->start_time = jiffies; |
@@ -160,8 +158,6 @@ static void req_bio_endio(struct request *rq, struct bio *bio, | |||
160 | 158 | ||
161 | void blk_dump_rq_flags(struct request *rq, char *msg) | 159 | void blk_dump_rq_flags(struct request *rq, char *msg) |
162 | { | 160 | { |
163 | int bit; | ||
164 | |||
165 | printk(KERN_INFO "%s: dev %s: type=%x, flags=%llx\n", msg, | 161 | printk(KERN_INFO "%s: dev %s: type=%x, flags=%llx\n", msg, |
166 | rq->rq_disk ? rq->rq_disk->disk_name : "?", rq->cmd_type, | 162 | rq->rq_disk ? rq->rq_disk->disk_name : "?", rq->cmd_type, |
167 | (unsigned long long) rq->cmd_flags); | 163 | (unsigned long long) rq->cmd_flags); |
@@ -171,13 +167,6 @@ void blk_dump_rq_flags(struct request *rq, char *msg) | |||
171 | blk_rq_sectors(rq), blk_rq_cur_sectors(rq)); | 167 | blk_rq_sectors(rq), blk_rq_cur_sectors(rq)); |
172 | printk(KERN_INFO " bio %p, biotail %p, len %u\n", | 168 | printk(KERN_INFO " bio %p, biotail %p, len %u\n", |
173 | rq->bio, rq->biotail, blk_rq_bytes(rq)); | 169 | rq->bio, rq->biotail, blk_rq_bytes(rq)); |
174 | |||
175 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) { | ||
176 | printk(KERN_INFO " cdb: "); | ||
177 | for (bit = 0; bit < BLK_MAX_CDB; bit++) | ||
178 | printk("%02x ", rq->cmd[bit]); | ||
179 | printk("\n"); | ||
180 | } | ||
181 | } | 170 | } |
182 | EXPORT_SYMBOL(blk_dump_rq_flags); | 171 | EXPORT_SYMBOL(blk_dump_rq_flags); |
183 | 172 | ||
@@ -1316,18 +1305,6 @@ struct request *blk_get_request(struct request_queue *q, int rw, gfp_t gfp_mask) | |||
1316 | EXPORT_SYMBOL(blk_get_request); | 1305 | EXPORT_SYMBOL(blk_get_request); |
1317 | 1306 | ||
1318 | /** | 1307 | /** |
1319 | * blk_rq_set_block_pc - initialize a request to type BLOCK_PC | ||
1320 | * @rq: request to be initialized | ||
1321 | * | ||
1322 | */ | ||
1323 | void blk_rq_set_block_pc(struct request *rq) | ||
1324 | { | ||
1325 | rq->cmd_type = REQ_TYPE_BLOCK_PC; | ||
1326 | memset(rq->__cmd, 0, sizeof(rq->__cmd)); | ||
1327 | } | ||
1328 | EXPORT_SYMBOL(blk_rq_set_block_pc); | ||
1329 | |||
1330 | /** | ||
1331 | * blk_requeue_request - put a request back on queue | 1308 | * blk_requeue_request - put a request back on queue |
1332 | * @q: request queue where request should be inserted | 1309 | * @q: request queue where request should be inserted |
1333 | * @rq: request to be inserted | 1310 | * @rq: request to be inserted |
@@ -2459,14 +2436,6 @@ void blk_start_request(struct request *req) | |||
2459 | wbt_issue(req->q->rq_wb, &req->issue_stat); | 2436 | wbt_issue(req->q->rq_wb, &req->issue_stat); |
2460 | } | 2437 | } |
2461 | 2438 | ||
2462 | /* | ||
2463 | * We are now handing the request to the hardware, initialize | ||
2464 | * resid_len to full count and add the timeout handler. | ||
2465 | */ | ||
2466 | req->resid_len = blk_rq_bytes(req); | ||
2467 | if (unlikely(blk_bidi_rq(req))) | ||
2468 | req->next_rq->resid_len = blk_rq_bytes(req->next_rq); | ||
2469 | |||
2470 | BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); | 2439 | BUG_ON(test_bit(REQ_ATOM_COMPLETE, &req->atomic_flags)); |
2471 | blk_add_timer(req); | 2440 | blk_add_timer(req); |
2472 | } | 2441 | } |
diff --git a/block/blk-exec.c b/block/blk-exec.c index ed1f10165268..ed51800f4b44 100644 --- a/block/blk-exec.c +++ b/block/blk-exec.c | |||
@@ -11,11 +11,6 @@ | |||
11 | #include "blk.h" | 11 | #include "blk.h" |
12 | #include "blk-mq-sched.h" | 12 | #include "blk-mq-sched.h" |
13 | 13 | ||
14 | /* | ||
15 | * for max sense size | ||
16 | */ | ||
17 | #include <scsi/scsi_cmnd.h> | ||
18 | |||
19 | /** | 14 | /** |
20 | * blk_end_sync_rq - executes a completion event on a request | 15 | * blk_end_sync_rq - executes a completion event on a request |
21 | * @rq: request to complete | 16 | * @rq: request to complete |
@@ -101,16 +96,9 @@ int blk_execute_rq(struct request_queue *q, struct gendisk *bd_disk, | |||
101 | struct request *rq, int at_head) | 96 | struct request *rq, int at_head) |
102 | { | 97 | { |
103 | DECLARE_COMPLETION_ONSTACK(wait); | 98 | DECLARE_COMPLETION_ONSTACK(wait); |
104 | char sense[SCSI_SENSE_BUFFERSIZE]; | ||
105 | int err = 0; | 99 | int err = 0; |
106 | unsigned long hang_check; | 100 | unsigned long hang_check; |
107 | 101 | ||
108 | if (!rq->sense) { | ||
109 | memset(sense, 0, sizeof(sense)); | ||
110 | rq->sense = sense; | ||
111 | rq->sense_len = 0; | ||
112 | } | ||
113 | |||
114 | rq->end_io_data = &wait; | 102 | rq->end_io_data = &wait; |
115 | blk_execute_rq_nowait(q, bd_disk, rq, at_head, blk_end_sync_rq); | 103 | blk_execute_rq_nowait(q, bd_disk, rq, at_head, blk_end_sync_rq); |
116 | 104 | ||
@@ -124,11 +112,6 @@ int blk_execute_rq(struct request_queue *q, struct gendisk *bd_disk, | |||
124 | if (rq->errors) | 112 | if (rq->errors) |
125 | err = -EIO; | 113 | err = -EIO; |
126 | 114 | ||
127 | if (rq->sense == sense) { | ||
128 | rq->sense = NULL; | ||
129 | rq->sense_len = 0; | ||
130 | } | ||
131 | |||
132 | return err; | 115 | return err; |
133 | } | 116 | } |
134 | EXPORT_SYMBOL(blk_execute_rq); | 117 | EXPORT_SYMBOL(blk_execute_rq); |
diff --git a/block/blk-mq.c b/block/blk-mq.c index 60dac10228fe..3d76e860f126 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -199,13 +199,7 @@ void blk_mq_rq_ctx_init(struct request_queue *q, struct blk_mq_ctx *ctx, | |||
199 | rq->special = NULL; | 199 | rq->special = NULL; |
200 | /* tag was already set */ | 200 | /* tag was already set */ |
201 | rq->errors = 0; | 201 | rq->errors = 0; |
202 | |||
203 | rq->cmd = rq->__cmd; | ||
204 | |||
205 | rq->extra_len = 0; | 202 | rq->extra_len = 0; |
206 | rq->sense_len = 0; | ||
207 | rq->resid_len = 0; | ||
208 | rq->sense = NULL; | ||
209 | 203 | ||
210 | INIT_LIST_HEAD(&rq->timeout_list); | 204 | INIT_LIST_HEAD(&rq->timeout_list); |
211 | rq->timeout = 0; | 205 | rq->timeout = 0; |
@@ -487,10 +481,6 @@ void blk_mq_start_request(struct request *rq) | |||
487 | 481 | ||
488 | trace_block_rq_issue(q, rq); | 482 | trace_block_rq_issue(q, rq); |
489 | 483 | ||
490 | rq->resid_len = blk_rq_bytes(rq); | ||
491 | if (unlikely(blk_bidi_rq(rq))) | ||
492 | rq->next_rq->resid_len = blk_rq_bytes(rq->next_rq); | ||
493 | |||
494 | if (test_bit(QUEUE_FLAG_STATS, &q->queue_flags)) { | 484 | if (test_bit(QUEUE_FLAG_STATS, &q->queue_flags)) { |
495 | blk_stat_set_issue_time(&rq->issue_stat); | 485 | blk_stat_set_issue_time(&rq->issue_stat); |
496 | rq->rq_flags |= RQF_STATS; | 486 | rq->rq_flags |= RQF_STATS; |
diff --git a/block/bsg-lib.c b/block/bsg-lib.c index c74acf426840..cd15f9dbb147 100644 --- a/block/bsg-lib.c +++ b/block/bsg-lib.c | |||
@@ -71,22 +71,24 @@ void bsg_job_done(struct bsg_job *job, int result, | |||
71 | { | 71 | { |
72 | struct request *req = job->req; | 72 | struct request *req = job->req; |
73 | struct request *rsp = req->next_rq; | 73 | struct request *rsp = req->next_rq; |
74 | struct scsi_request *rq = scsi_req(req); | ||
74 | int err; | 75 | int err; |
75 | 76 | ||
76 | err = job->req->errors = result; | 77 | err = job->req->errors = result; |
77 | if (err < 0) | 78 | if (err < 0) |
78 | /* we're only returning the result field in the reply */ | 79 | /* we're only returning the result field in the reply */ |
79 | job->req->sense_len = sizeof(u32); | 80 | rq->sense_len = sizeof(u32); |
80 | else | 81 | else |
81 | job->req->sense_len = job->reply_len; | 82 | rq->sense_len = job->reply_len; |
82 | /* we assume all request payload was transferred, residual == 0 */ | 83 | /* we assume all request payload was transferred, residual == 0 */ |
83 | req->resid_len = 0; | 84 | rq->resid_len = 0; |
84 | 85 | ||
85 | if (rsp) { | 86 | if (rsp) { |
86 | WARN_ON(reply_payload_rcv_len > rsp->resid_len); | 87 | WARN_ON(reply_payload_rcv_len > scsi_req(rsp)->resid_len); |
87 | 88 | ||
88 | /* set reply (bidi) residual */ | 89 | /* set reply (bidi) residual */ |
89 | rsp->resid_len -= min(reply_payload_rcv_len, rsp->resid_len); | 90 | scsi_req(rsp)->resid_len -= |
91 | min(reply_payload_rcv_len, scsi_req(rsp)->resid_len); | ||
90 | } | 92 | } |
91 | blk_complete_request(req); | 93 | blk_complete_request(req); |
92 | } | 94 | } |
@@ -113,6 +115,7 @@ static int bsg_map_buffer(struct bsg_buffer *buf, struct request *req) | |||
113 | if (!buf->sg_list) | 115 | if (!buf->sg_list) |
114 | return -ENOMEM; | 116 | return -ENOMEM; |
115 | sg_init_table(buf->sg_list, req->nr_phys_segments); | 117 | sg_init_table(buf->sg_list, req->nr_phys_segments); |
118 | scsi_req(req)->resid_len = blk_rq_bytes(req); | ||
116 | buf->sg_cnt = blk_rq_map_sg(req->q, req, buf->sg_list); | 119 | buf->sg_cnt = blk_rq_map_sg(req->q, req, buf->sg_list); |
117 | buf->payload_len = blk_rq_bytes(req); | 120 | buf->payload_len = blk_rq_bytes(req); |
118 | return 0; | 121 | return 0; |
@@ -127,6 +130,7 @@ static int bsg_create_job(struct device *dev, struct request *req) | |||
127 | { | 130 | { |
128 | struct request *rsp = req->next_rq; | 131 | struct request *rsp = req->next_rq; |
129 | struct request_queue *q = req->q; | 132 | struct request_queue *q = req->q; |
133 | struct scsi_request *rq = scsi_req(req); | ||
130 | struct bsg_job *job; | 134 | struct bsg_job *job; |
131 | int ret; | 135 | int ret; |
132 | 136 | ||
@@ -140,9 +144,9 @@ static int bsg_create_job(struct device *dev, struct request *req) | |||
140 | job->req = req; | 144 | job->req = req; |
141 | if (q->bsg_job_size) | 145 | if (q->bsg_job_size) |
142 | job->dd_data = (void *)&job[1]; | 146 | job->dd_data = (void *)&job[1]; |
143 | job->request = req->cmd; | 147 | job->request = rq->cmd; |
144 | job->request_len = req->cmd_len; | 148 | job->request_len = rq->cmd_len; |
145 | job->reply = req->sense; | 149 | job->reply = rq->sense; |
146 | job->reply_len = SCSI_SENSE_BUFFERSIZE; /* Size of sense buffer | 150 | job->reply_len = SCSI_SENSE_BUFFERSIZE; /* Size of sense buffer |
147 | * allocated */ | 151 | * allocated */ |
148 | if (req->bio) { | 152 | if (req->bio) { |
@@ -228,9 +232,15 @@ struct request_queue *bsg_setup_queue(struct device *dev, char *name, | |||
228 | struct request_queue *q; | 232 | struct request_queue *q; |
229 | int ret; | 233 | int ret; |
230 | 234 | ||
231 | q = blk_init_queue(bsg_request_fn, NULL); | 235 | q = blk_alloc_queue(GFP_KERNEL); |
232 | if (!q) | 236 | if (!q) |
233 | return ERR_PTR(-ENOMEM); | 237 | return ERR_PTR(-ENOMEM); |
238 | q->cmd_size = sizeof(struct scsi_request); | ||
239 | q->request_fn = bsg_request_fn; | ||
240 | |||
241 | ret = blk_init_allocated_queue(q); | ||
242 | if (ret) | ||
243 | goto out_cleanup_queue; | ||
234 | 244 | ||
235 | q->queuedata = dev; | 245 | q->queuedata = dev; |
236 | q->bsg_job_size = dd_job_size; | 246 | q->bsg_job_size = dd_job_size; |
@@ -243,10 +253,12 @@ struct request_queue *bsg_setup_queue(struct device *dev, char *name, | |||
243 | if (ret) { | 253 | if (ret) { |
244 | printk(KERN_ERR "%s: bsg interface failed to " | 254 | printk(KERN_ERR "%s: bsg interface failed to " |
245 | "initialize - register queue\n", dev->kobj.name); | 255 | "initialize - register queue\n", dev->kobj.name); |
246 | blk_cleanup_queue(q); | 256 | goto out_cleanup_queue; |
247 | return ERR_PTR(ret); | ||
248 | } | 257 | } |
249 | 258 | ||
250 | return q; | 259 | return q; |
260 | out_cleanup_queue: | ||
261 | blk_cleanup_queue(q); | ||
262 | return ERR_PTR(ret); | ||
251 | } | 263 | } |
252 | EXPORT_SYMBOL_GPL(bsg_setup_queue); | 264 | EXPORT_SYMBOL_GPL(bsg_setup_queue); |
diff --git a/block/bsg.c b/block/bsg.c index a57046de2f07..e34c3320956c 100644 --- a/block/bsg.c +++ b/block/bsg.c | |||
@@ -85,7 +85,6 @@ struct bsg_command { | |||
85 | struct bio *bidi_bio; | 85 | struct bio *bidi_bio; |
86 | int err; | 86 | int err; |
87 | struct sg_io_v4 hdr; | 87 | struct sg_io_v4 hdr; |
88 | char sense[SCSI_SENSE_BUFFERSIZE]; | ||
89 | }; | 88 | }; |
90 | 89 | ||
91 | static void bsg_free_command(struct bsg_command *bc) | 90 | static void bsg_free_command(struct bsg_command *bc) |
@@ -140,18 +139,20 @@ static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq, | |||
140 | struct sg_io_v4 *hdr, struct bsg_device *bd, | 139 | struct sg_io_v4 *hdr, struct bsg_device *bd, |
141 | fmode_t has_write_perm) | 140 | fmode_t has_write_perm) |
142 | { | 141 | { |
142 | struct scsi_request *req = scsi_req(rq); | ||
143 | |||
143 | if (hdr->request_len > BLK_MAX_CDB) { | 144 | if (hdr->request_len > BLK_MAX_CDB) { |
144 | rq->cmd = kzalloc(hdr->request_len, GFP_KERNEL); | 145 | req->cmd = kzalloc(hdr->request_len, GFP_KERNEL); |
145 | if (!rq->cmd) | 146 | if (!req->cmd) |
146 | return -ENOMEM; | 147 | return -ENOMEM; |
147 | } | 148 | } |
148 | 149 | ||
149 | if (copy_from_user(rq->cmd, (void __user *)(unsigned long)hdr->request, | 150 | if (copy_from_user(req->cmd, (void __user *)(unsigned long)hdr->request, |
150 | hdr->request_len)) | 151 | hdr->request_len)) |
151 | return -EFAULT; | 152 | return -EFAULT; |
152 | 153 | ||
153 | if (hdr->subprotocol == BSG_SUB_PROTOCOL_SCSI_CMD) { | 154 | if (hdr->subprotocol == BSG_SUB_PROTOCOL_SCSI_CMD) { |
154 | if (blk_verify_command(rq->cmd, has_write_perm)) | 155 | if (blk_verify_command(req->cmd, has_write_perm)) |
155 | return -EPERM; | 156 | return -EPERM; |
156 | } else if (!capable(CAP_SYS_RAWIO)) | 157 | } else if (!capable(CAP_SYS_RAWIO)) |
157 | return -EPERM; | 158 | return -EPERM; |
@@ -159,7 +160,7 @@ static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq, | |||
159 | /* | 160 | /* |
160 | * fill in request structure | 161 | * fill in request structure |
161 | */ | 162 | */ |
162 | rq->cmd_len = hdr->request_len; | 163 | req->cmd_len = hdr->request_len; |
163 | 164 | ||
164 | rq->timeout = msecs_to_jiffies(hdr->timeout); | 165 | rq->timeout = msecs_to_jiffies(hdr->timeout); |
165 | if (!rq->timeout) | 166 | if (!rq->timeout) |
@@ -205,8 +206,7 @@ bsg_validate_sgv4_hdr(struct sg_io_v4 *hdr, int *rw) | |||
205 | * map sg_io_v4 to a request. | 206 | * map sg_io_v4 to a request. |
206 | */ | 207 | */ |
207 | static struct request * | 208 | static struct request * |
208 | bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm, | 209 | bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm) |
209 | u8 *sense) | ||
210 | { | 210 | { |
211 | struct request_queue *q = bd->queue; | 211 | struct request_queue *q = bd->queue; |
212 | struct request *rq, *next_rq = NULL; | 212 | struct request *rq, *next_rq = NULL; |
@@ -236,7 +236,7 @@ bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm, | |||
236 | rq = blk_get_request(q, rw, GFP_KERNEL); | 236 | rq = blk_get_request(q, rw, GFP_KERNEL); |
237 | if (IS_ERR(rq)) | 237 | if (IS_ERR(rq)) |
238 | return rq; | 238 | return rq; |
239 | blk_rq_set_block_pc(rq); | 239 | scsi_req_init(rq); |
240 | 240 | ||
241 | ret = blk_fill_sgv4_hdr_rq(q, rq, hdr, bd, has_write_perm); | 241 | ret = blk_fill_sgv4_hdr_rq(q, rq, hdr, bd, has_write_perm); |
242 | if (ret) | 242 | if (ret) |
@@ -280,13 +280,9 @@ bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm, | |||
280 | goto out; | 280 | goto out; |
281 | } | 281 | } |
282 | 282 | ||
283 | rq->sense = sense; | ||
284 | rq->sense_len = 0; | ||
285 | |||
286 | return rq; | 283 | return rq; |
287 | out: | 284 | out: |
288 | if (rq->cmd != rq->__cmd) | 285 | scsi_req_free_cmd(scsi_req(rq)); |
289 | kfree(rq->cmd); | ||
290 | blk_put_request(rq); | 286 | blk_put_request(rq); |
291 | if (next_rq) { | 287 | if (next_rq) { |
292 | blk_rq_unmap_user(next_rq->bio); | 288 | blk_rq_unmap_user(next_rq->bio); |
@@ -393,6 +389,7 @@ static struct bsg_command *bsg_get_done_cmd(struct bsg_device *bd) | |||
393 | static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr, | 389 | static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr, |
394 | struct bio *bio, struct bio *bidi_bio) | 390 | struct bio *bio, struct bio *bidi_bio) |
395 | { | 391 | { |
392 | struct scsi_request *req = scsi_req(rq); | ||
396 | int ret = 0; | 393 | int ret = 0; |
397 | 394 | ||
398 | dprintk("rq %p bio %p 0x%x\n", rq, bio, rq->errors); | 395 | dprintk("rq %p bio %p 0x%x\n", rq, bio, rq->errors); |
@@ -407,12 +404,12 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr, | |||
407 | hdr->info |= SG_INFO_CHECK; | 404 | hdr->info |= SG_INFO_CHECK; |
408 | hdr->response_len = 0; | 405 | hdr->response_len = 0; |
409 | 406 | ||
410 | if (rq->sense_len && hdr->response) { | 407 | if (req->sense_len && hdr->response) { |
411 | int len = min_t(unsigned int, hdr->max_response_len, | 408 | int len = min_t(unsigned int, hdr->max_response_len, |
412 | rq->sense_len); | 409 | req->sense_len); |
413 | 410 | ||
414 | ret = copy_to_user((void __user *)(unsigned long)hdr->response, | 411 | ret = copy_to_user((void __user *)(unsigned long)hdr->response, |
415 | rq->sense, len); | 412 | req->sense, len); |
416 | if (!ret) | 413 | if (!ret) |
417 | hdr->response_len = len; | 414 | hdr->response_len = len; |
418 | else | 415 | else |
@@ -420,14 +417,14 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr, | |||
420 | } | 417 | } |
421 | 418 | ||
422 | if (rq->next_rq) { | 419 | if (rq->next_rq) { |
423 | hdr->dout_resid = rq->resid_len; | 420 | hdr->dout_resid = req->resid_len; |
424 | hdr->din_resid = rq->next_rq->resid_len; | 421 | hdr->din_resid = scsi_req(rq->next_rq)->resid_len; |
425 | blk_rq_unmap_user(bidi_bio); | 422 | blk_rq_unmap_user(bidi_bio); |
426 | blk_put_request(rq->next_rq); | 423 | blk_put_request(rq->next_rq); |
427 | } else if (rq_data_dir(rq) == READ) | 424 | } else if (rq_data_dir(rq) == READ) |
428 | hdr->din_resid = rq->resid_len; | 425 | hdr->din_resid = req->resid_len; |
429 | else | 426 | else |
430 | hdr->dout_resid = rq->resid_len; | 427 | hdr->dout_resid = req->resid_len; |
431 | 428 | ||
432 | /* | 429 | /* |
433 | * If the request generated a negative error number, return it | 430 | * If the request generated a negative error number, return it |
@@ -439,8 +436,7 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr, | |||
439 | ret = rq->errors; | 436 | ret = rq->errors; |
440 | 437 | ||
441 | blk_rq_unmap_user(bio); | 438 | blk_rq_unmap_user(bio); |
442 | if (rq->cmd != rq->__cmd) | 439 | scsi_req_free_cmd(req); |
443 | kfree(rq->cmd); | ||
444 | blk_put_request(rq); | 440 | blk_put_request(rq); |
445 | 441 | ||
446 | return ret; | 442 | return ret; |
@@ -625,7 +621,7 @@ static int __bsg_write(struct bsg_device *bd, const char __user *buf, | |||
625 | /* | 621 | /* |
626 | * get a request, fill in the blanks, and add to request queue | 622 | * get a request, fill in the blanks, and add to request queue |
627 | */ | 623 | */ |
628 | rq = bsg_map_hdr(bd, &bc->hdr, has_write_perm, bc->sense); | 624 | rq = bsg_map_hdr(bd, &bc->hdr, has_write_perm); |
629 | if (IS_ERR(rq)) { | 625 | if (IS_ERR(rq)) { |
630 | ret = PTR_ERR(rq); | 626 | ret = PTR_ERR(rq); |
631 | rq = NULL; | 627 | rq = NULL; |
@@ -911,12 +907,11 @@ static long bsg_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
911 | struct bio *bio, *bidi_bio = NULL; | 907 | struct bio *bio, *bidi_bio = NULL; |
912 | struct sg_io_v4 hdr; | 908 | struct sg_io_v4 hdr; |
913 | int at_head; | 909 | int at_head; |
914 | u8 sense[SCSI_SENSE_BUFFERSIZE]; | ||
915 | 910 | ||
916 | if (copy_from_user(&hdr, uarg, sizeof(hdr))) | 911 | if (copy_from_user(&hdr, uarg, sizeof(hdr))) |
917 | return -EFAULT; | 912 | return -EFAULT; |
918 | 913 | ||
919 | rq = bsg_map_hdr(bd, &hdr, file->f_mode & FMODE_WRITE, sense); | 914 | rq = bsg_map_hdr(bd, &hdr, file->f_mode & FMODE_WRITE); |
920 | if (IS_ERR(rq)) | 915 | if (IS_ERR(rq)) |
921 | return PTR_ERR(rq); | 916 | return PTR_ERR(rq); |
922 | 917 | ||
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index c2b64923ab66..7edf44f25e08 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c | |||
@@ -230,15 +230,17 @@ EXPORT_SYMBOL(blk_verify_command); | |||
230 | static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, | 230 | static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, |
231 | struct sg_io_hdr *hdr, fmode_t mode) | 231 | struct sg_io_hdr *hdr, fmode_t mode) |
232 | { | 232 | { |
233 | if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len)) | 233 | struct scsi_request *req = scsi_req(rq); |
234 | |||
235 | if (copy_from_user(req->cmd, hdr->cmdp, hdr->cmd_len)) | ||
234 | return -EFAULT; | 236 | return -EFAULT; |
235 | if (blk_verify_command(rq->cmd, mode & FMODE_WRITE)) | 237 | if (blk_verify_command(req->cmd, mode & FMODE_WRITE)) |
236 | return -EPERM; | 238 | return -EPERM; |
237 | 239 | ||
238 | /* | 240 | /* |
239 | * fill in request structure | 241 | * fill in request structure |
240 | */ | 242 | */ |
241 | rq->cmd_len = hdr->cmd_len; | 243 | req->cmd_len = hdr->cmd_len; |
242 | 244 | ||
243 | rq->timeout = msecs_to_jiffies(hdr->timeout); | 245 | rq->timeout = msecs_to_jiffies(hdr->timeout); |
244 | if (!rq->timeout) | 246 | if (!rq->timeout) |
@@ -254,6 +256,7 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, | |||
254 | static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, | 256 | static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, |
255 | struct bio *bio) | 257 | struct bio *bio) |
256 | { | 258 | { |
259 | struct scsi_request *req = scsi_req(rq); | ||
257 | int r, ret = 0; | 260 | int r, ret = 0; |
258 | 261 | ||
259 | /* | 262 | /* |
@@ -267,13 +270,13 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, | |||
267 | hdr->info = 0; | 270 | hdr->info = 0; |
268 | if (hdr->masked_status || hdr->host_status || hdr->driver_status) | 271 | if (hdr->masked_status || hdr->host_status || hdr->driver_status) |
269 | hdr->info |= SG_INFO_CHECK; | 272 | hdr->info |= SG_INFO_CHECK; |
270 | hdr->resid = rq->resid_len; | 273 | hdr->resid = req->resid_len; |
271 | hdr->sb_len_wr = 0; | 274 | hdr->sb_len_wr = 0; |
272 | 275 | ||
273 | if (rq->sense_len && hdr->sbp) { | 276 | if (req->sense_len && hdr->sbp) { |
274 | int len = min((unsigned int) hdr->mx_sb_len, rq->sense_len); | 277 | int len = min((unsigned int) hdr->mx_sb_len, req->sense_len); |
275 | 278 | ||
276 | if (!copy_to_user(hdr->sbp, rq->sense, len)) | 279 | if (!copy_to_user(hdr->sbp, req->sense, len)) |
277 | hdr->sb_len_wr = len; | 280 | hdr->sb_len_wr = len; |
278 | else | 281 | else |
279 | ret = -EFAULT; | 282 | ret = -EFAULT; |
@@ -294,7 +297,7 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk, | |||
294 | int writing = 0; | 297 | int writing = 0; |
295 | int at_head = 0; | 298 | int at_head = 0; |
296 | struct request *rq; | 299 | struct request *rq; |
297 | char sense[SCSI_SENSE_BUFFERSIZE]; | 300 | struct scsi_request *req; |
298 | struct bio *bio; | 301 | struct bio *bio; |
299 | 302 | ||
300 | if (hdr->interface_id != 'S') | 303 | if (hdr->interface_id != 'S') |
@@ -321,11 +324,12 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk, | |||
321 | rq = blk_get_request(q, writing ? WRITE : READ, GFP_KERNEL); | 324 | rq = blk_get_request(q, writing ? WRITE : READ, GFP_KERNEL); |
322 | if (IS_ERR(rq)) | 325 | if (IS_ERR(rq)) |
323 | return PTR_ERR(rq); | 326 | return PTR_ERR(rq); |
324 | blk_rq_set_block_pc(rq); | 327 | req = scsi_req(rq); |
328 | scsi_req_init(rq); | ||
325 | 329 | ||
326 | if (hdr->cmd_len > BLK_MAX_CDB) { | 330 | if (hdr->cmd_len > BLK_MAX_CDB) { |
327 | rq->cmd = kzalloc(hdr->cmd_len, GFP_KERNEL); | 331 | req->cmd = kzalloc(hdr->cmd_len, GFP_KERNEL); |
328 | if (!rq->cmd) | 332 | if (!req->cmd) |
329 | goto out_put_request; | 333 | goto out_put_request; |
330 | } | 334 | } |
331 | 335 | ||
@@ -357,9 +361,6 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk, | |||
357 | goto out_free_cdb; | 361 | goto out_free_cdb; |
358 | 362 | ||
359 | bio = rq->bio; | 363 | bio = rq->bio; |
360 | memset(sense, 0, sizeof(sense)); | ||
361 | rq->sense = sense; | ||
362 | rq->sense_len = 0; | ||
363 | rq->retries = 0; | 364 | rq->retries = 0; |
364 | 365 | ||
365 | start_time = jiffies; | 366 | start_time = jiffies; |
@@ -375,8 +376,7 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk, | |||
375 | ret = blk_complete_sghdr_rq(rq, hdr, bio); | 376 | ret = blk_complete_sghdr_rq(rq, hdr, bio); |
376 | 377 | ||
377 | out_free_cdb: | 378 | out_free_cdb: |
378 | if (rq->cmd != rq->__cmd) | 379 | scsi_req_free_cmd(req); |
379 | kfree(rq->cmd); | ||
380 | out_put_request: | 380 | out_put_request: |
381 | blk_put_request(rq); | 381 | blk_put_request(rq); |
382 | return ret; | 382 | return ret; |
@@ -420,9 +420,10 @@ int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, | |||
420 | struct scsi_ioctl_command __user *sic) | 420 | struct scsi_ioctl_command __user *sic) |
421 | { | 421 | { |
422 | struct request *rq; | 422 | struct request *rq; |
423 | struct scsi_request *req; | ||
423 | int err; | 424 | int err; |
424 | unsigned int in_len, out_len, bytes, opcode, cmdlen; | 425 | unsigned int in_len, out_len, bytes, opcode, cmdlen; |
425 | char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE]; | 426 | char *buffer = NULL; |
426 | 427 | ||
427 | if (!sic) | 428 | if (!sic) |
428 | return -EINVAL; | 429 | return -EINVAL; |
@@ -452,7 +453,8 @@ int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, | |||
452 | err = PTR_ERR(rq); | 453 | err = PTR_ERR(rq); |
453 | goto error_free_buffer; | 454 | goto error_free_buffer; |
454 | } | 455 | } |
455 | blk_rq_set_block_pc(rq); | 456 | req = scsi_req(rq); |
457 | scsi_req_init(rq); | ||
456 | 458 | ||
457 | cmdlen = COMMAND_SIZE(opcode); | 459 | cmdlen = COMMAND_SIZE(opcode); |
458 | 460 | ||
@@ -460,14 +462,14 @@ int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, | |||
460 | * get command and data to send to device, if any | 462 | * get command and data to send to device, if any |
461 | */ | 463 | */ |
462 | err = -EFAULT; | 464 | err = -EFAULT; |
463 | rq->cmd_len = cmdlen; | 465 | req->cmd_len = cmdlen; |
464 | if (copy_from_user(rq->cmd, sic->data, cmdlen)) | 466 | if (copy_from_user(req->cmd, sic->data, cmdlen)) |
465 | goto error; | 467 | goto error; |
466 | 468 | ||
467 | if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) | 469 | if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) |
468 | goto error; | 470 | goto error; |
469 | 471 | ||
470 | err = blk_verify_command(rq->cmd, mode & FMODE_WRITE); | 472 | err = blk_verify_command(req->cmd, mode & FMODE_WRITE); |
471 | if (err) | 473 | if (err) |
472 | goto error; | 474 | goto error; |
473 | 475 | ||
@@ -503,18 +505,14 @@ int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, | |||
503 | goto error; | 505 | goto error; |
504 | } | 506 | } |
505 | 507 | ||
506 | memset(sense, 0, sizeof(sense)); | ||
507 | rq->sense = sense; | ||
508 | rq->sense_len = 0; | ||
509 | |||
510 | blk_execute_rq(q, disk, rq, 0); | 508 | blk_execute_rq(q, disk, rq, 0); |
511 | 509 | ||
512 | err = rq->errors & 0xff; /* only 8 bit SCSI status */ | 510 | err = rq->errors & 0xff; /* only 8 bit SCSI status */ |
513 | if (err) { | 511 | if (err) { |
514 | if (rq->sense_len && rq->sense) { | 512 | if (req->sense_len && req->sense) { |
515 | bytes = (OMAX_SB_LEN > rq->sense_len) ? | 513 | bytes = (OMAX_SB_LEN > req->sense_len) ? |
516 | rq->sense_len : OMAX_SB_LEN; | 514 | req->sense_len : OMAX_SB_LEN; |
517 | if (copy_to_user(sic->data, rq->sense, bytes)) | 515 | if (copy_to_user(sic->data, req->sense, bytes)) |
518 | err = -EFAULT; | 516 | err = -EFAULT; |
519 | } | 517 | } |
520 | } else { | 518 | } else { |
@@ -542,11 +540,11 @@ static int __blk_send_generic(struct request_queue *q, struct gendisk *bd_disk, | |||
542 | rq = blk_get_request(q, WRITE, __GFP_RECLAIM); | 540 | rq = blk_get_request(q, WRITE, __GFP_RECLAIM); |
543 | if (IS_ERR(rq)) | 541 | if (IS_ERR(rq)) |
544 | return PTR_ERR(rq); | 542 | return PTR_ERR(rq); |
545 | blk_rq_set_block_pc(rq); | 543 | scsi_req_init(rq); |
546 | rq->timeout = BLK_DEFAULT_SG_TIMEOUT; | 544 | rq->timeout = BLK_DEFAULT_SG_TIMEOUT; |
547 | rq->cmd[0] = cmd; | 545 | scsi_req(rq)->cmd[0] = cmd; |
548 | rq->cmd[4] = data; | 546 | scsi_req(rq)->cmd[4] = data; |
549 | rq->cmd_len = 6; | 547 | scsi_req(rq)->cmd_len = 6; |
550 | err = blk_execute_rq(q, bd_disk, rq, 0); | 548 | err = blk_execute_rq(q, bd_disk, rq, 0); |
551 | blk_put_request(rq); | 549 | blk_put_request(rq); |
552 | 550 | ||
@@ -743,6 +741,18 @@ int scsi_cmd_blk_ioctl(struct block_device *bd, fmode_t mode, | |||
743 | } | 741 | } |
744 | EXPORT_SYMBOL(scsi_cmd_blk_ioctl); | 742 | EXPORT_SYMBOL(scsi_cmd_blk_ioctl); |
745 | 743 | ||
744 | void scsi_req_init(struct request *rq) | ||
745 | { | ||
746 | struct scsi_request *req = scsi_req(rq); | ||
747 | |||
748 | rq->cmd_type = REQ_TYPE_BLOCK_PC; | ||
749 | memset(req->__cmd, 0, sizeof(req->__cmd)); | ||
750 | req->cmd = req->__cmd; | ||
751 | req->cmd_len = BLK_MAX_CDB; | ||
752 | req->sense_len = 0; | ||
753 | } | ||
754 | EXPORT_SYMBOL(scsi_req_init); | ||
755 | |||
746 | static int __init blk_scsi_ioctl_init(void) | 756 | static int __init blk_scsi_ioctl_init(void) |
747 | { | 757 | { |
748 | blk_set_cmd_filter_defaults(&blk_default_cmd_filter); | 758 | blk_set_cmd_filter_defaults(&blk_default_cmd_filter); |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 1f863e757ee4..6abd73975f87 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -1271,7 +1271,7 @@ static int atapi_drain_needed(struct request *rq) | |||
1271 | if (!blk_rq_bytes(rq) || op_is_write(req_op(rq))) | 1271 | if (!blk_rq_bytes(rq) || op_is_write(req_op(rq))) |
1272 | return 0; | 1272 | return 0; |
1273 | 1273 | ||
1274 | return atapi_cmd_type(rq->cmd[0]) == ATAPI_MISC; | 1274 | return atapi_cmd_type(scsi_req(rq)->cmd[0]) == ATAPI_MISC; |
1275 | } | 1275 | } |
1276 | 1276 | ||
1277 | static int ata_scsi_dev_config(struct scsi_device *sdev, | 1277 | static int ata_scsi_dev_config(struct scsi_device *sdev, |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index e5c5b8eb14a9..b93bb73b49d2 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <scsi/scsi.h> | 52 | #include <scsi/scsi.h> |
53 | #include <scsi/sg.h> | 53 | #include <scsi/sg.h> |
54 | #include <scsi/scsi_ioctl.h> | 54 | #include <scsi/scsi_ioctl.h> |
55 | #include <scsi/scsi_request.h> | ||
55 | #include <linux/cdrom.h> | 56 | #include <linux/cdrom.h> |
56 | #include <linux/scatterlist.h> | 57 | #include <linux/scatterlist.h> |
57 | #include <linux/kthread.h> | 58 | #include <linux/kthread.h> |
@@ -1854,7 +1855,7 @@ static void cciss_softirq_done(struct request *rq) | |||
1854 | 1855 | ||
1855 | /* set the residual count for pc requests */ | 1856 | /* set the residual count for pc requests */ |
1856 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) | 1857 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC) |
1857 | rq->resid_len = c->err_info->ResidualCnt; | 1858 | scsi_req(rq)->resid_len = c->err_info->ResidualCnt; |
1858 | 1859 | ||
1859 | blk_end_request_all(rq, (rq->errors == 0) ? 0 : -EIO); | 1860 | blk_end_request_all(rq, (rq->errors == 0) ? 0 : -EIO); |
1860 | 1861 | ||
@@ -1941,9 +1942,16 @@ static void cciss_get_serial_no(ctlr_info_t *h, int logvol, | |||
1941 | static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk, | 1942 | static int cciss_add_disk(ctlr_info_t *h, struct gendisk *disk, |
1942 | int drv_index) | 1943 | int drv_index) |
1943 | { | 1944 | { |
1944 | disk->queue = blk_init_queue(do_cciss_request, &h->lock); | 1945 | disk->queue = blk_alloc_queue(GFP_KERNEL); |
1945 | if (!disk->queue) | 1946 | if (!disk->queue) |
1946 | goto init_queue_failure; | 1947 | goto init_queue_failure; |
1948 | |||
1949 | disk->queue->cmd_size = sizeof(struct scsi_request); | ||
1950 | disk->queue->request_fn = do_cciss_request; | ||
1951 | disk->queue->queue_lock = &h->lock; | ||
1952 | if (blk_init_allocated_queue(disk->queue) < 0) | ||
1953 | goto cleanup_queue; | ||
1954 | |||
1947 | sprintf(disk->disk_name, "cciss/c%dd%d", h->ctlr, drv_index); | 1955 | sprintf(disk->disk_name, "cciss/c%dd%d", h->ctlr, drv_index); |
1948 | disk->major = h->major; | 1956 | disk->major = h->major; |
1949 | disk->first_minor = drv_index << NWD_SHIFT; | 1957 | disk->first_minor = drv_index << NWD_SHIFT; |
@@ -3111,15 +3119,7 @@ static inline int evaluate_target_status(ctlr_info_t *h, | |||
3111 | return error_value; | 3119 | return error_value; |
3112 | } | 3120 | } |
3113 | 3121 | ||
3114 | /* SG_IO or similar, copy sense data back */ | 3122 | scsi_req(cmd->rq)->sense_len = cmd->err_info->SenseLen; |
3115 | if (cmd->rq->sense) { | ||
3116 | if (cmd->rq->sense_len > cmd->err_info->SenseLen) | ||
3117 | cmd->rq->sense_len = cmd->err_info->SenseLen; | ||
3118 | memcpy(cmd->rq->sense, cmd->err_info->SenseInfo, | ||
3119 | cmd->rq->sense_len); | ||
3120 | } else | ||
3121 | cmd->rq->sense_len = 0; | ||
3122 | |||
3123 | return error_value; | 3123 | return error_value; |
3124 | } | 3124 | } |
3125 | 3125 | ||
@@ -3150,7 +3150,6 @@ static inline void complete_command(ctlr_info_t *h, CommandList_struct *cmd, | |||
3150 | dev_warn(&h->pdev->dev, "cmd %p has" | 3150 | dev_warn(&h->pdev->dev, "cmd %p has" |
3151 | " completed with data underrun " | 3151 | " completed with data underrun " |
3152 | "reported\n", cmd); | 3152 | "reported\n", cmd); |
3153 | cmd->rq->resid_len = cmd->err_info->ResidualCnt; | ||
3154 | } | 3153 | } |
3155 | break; | 3154 | break; |
3156 | case CMD_DATA_OVERRUN: | 3155 | case CMD_DATA_OVERRUN: |
@@ -3426,8 +3425,9 @@ static void do_cciss_request(struct request_queue *q) | |||
3426 | c->Request.CDB[14] = c->Request.CDB[15] = 0; | 3425 | c->Request.CDB[14] = c->Request.CDB[15] = 0; |
3427 | } | 3426 | } |
3428 | } else if (creq->cmd_type == REQ_TYPE_BLOCK_PC) { | 3427 | } else if (creq->cmd_type == REQ_TYPE_BLOCK_PC) { |
3429 | c->Request.CDBLen = creq->cmd_len; | 3428 | c->Request.CDBLen = scsi_req(creq)->cmd_len; |
3430 | memcpy(c->Request.CDB, creq->cmd, BLK_MAX_CDB); | 3429 | memcpy(c->Request.CDB, scsi_req(creq)->cmd, BLK_MAX_CDB); |
3430 | scsi_req(creq)->sense = c->err_info->SenseInfo; | ||
3431 | } else { | 3431 | } else { |
3432 | dev_warn(&h->pdev->dev, "bad request type %d\n", | 3432 | dev_warn(&h->pdev->dev, "bad request type %d\n", |
3433 | creq->cmd_type); | 3433 | creq->cmd_type); |
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 1b94c1ca5c5f..918a92ccd0c0 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
@@ -707,7 +707,7 @@ static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command * | |||
707 | WRITE : READ, __GFP_RECLAIM); | 707 | WRITE : READ, __GFP_RECLAIM); |
708 | if (IS_ERR(rq)) | 708 | if (IS_ERR(rq)) |
709 | return PTR_ERR(rq); | 709 | return PTR_ERR(rq); |
710 | blk_rq_set_block_pc(rq); | 710 | scsi_req_init(rq); |
711 | 711 | ||
712 | if (cgc->buflen) { | 712 | if (cgc->buflen) { |
713 | ret = blk_rq_map_kern(q, rq, cgc->buffer, cgc->buflen, | 713 | ret = blk_rq_map_kern(q, rq, cgc->buffer, cgc->buflen, |
@@ -716,8 +716,8 @@ static int pkt_generic_packet(struct pktcdvd_device *pd, struct packet_command * | |||
716 | goto out; | 716 | goto out; |
717 | } | 717 | } |
718 | 718 | ||
719 | rq->cmd_len = COMMAND_SIZE(cgc->cmd[0]); | 719 | scsi_req(rq)->cmd_len = COMMAND_SIZE(cgc->cmd[0]); |
720 | memcpy(rq->cmd, cgc->cmd, CDROM_PACKET_SIZE); | 720 | memcpy(scsi_req(rq)->cmd, cgc->cmd, CDROM_PACKET_SIZE); |
721 | 721 | ||
722 | rq->timeout = 60*HZ; | 722 | rq->timeout = 60*HZ; |
723 | if (cgc->quiet) | 723 | if (cgc->quiet) |
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 10332c24f961..3027d2efc5d8 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
@@ -52,6 +52,7 @@ struct virtio_blk { | |||
52 | }; | 52 | }; |
53 | 53 | ||
54 | struct virtblk_req { | 54 | struct virtblk_req { |
55 | struct scsi_request sreq; /* for SCSI passthrough */ | ||
55 | struct request *req; | 56 | struct request *req; |
56 | struct virtio_blk_outhdr out_hdr; | 57 | struct virtio_blk_outhdr out_hdr; |
57 | struct virtio_scsi_inhdr in_hdr; | 58 | struct virtio_scsi_inhdr in_hdr; |
@@ -91,7 +92,7 @@ static int __virtblk_add_req(struct virtqueue *vq, | |||
91 | * inhdr with additional status information. | 92 | * inhdr with additional status information. |
92 | */ | 93 | */ |
93 | if (type == cpu_to_virtio32(vq->vdev, VIRTIO_BLK_T_SCSI_CMD)) { | 94 | if (type == cpu_to_virtio32(vq->vdev, VIRTIO_BLK_T_SCSI_CMD)) { |
94 | sg_init_one(&cmd, vbr->req->cmd, vbr->req->cmd_len); | 95 | sg_init_one(&cmd, vbr->sreq.cmd, vbr->sreq.cmd_len); |
95 | sgs[num_out++] = &cmd; | 96 | sgs[num_out++] = &cmd; |
96 | } | 97 | } |
97 | 98 | ||
@@ -103,7 +104,6 @@ static int __virtblk_add_req(struct virtqueue *vq, | |||
103 | } | 104 | } |
104 | 105 | ||
105 | if (type == cpu_to_virtio32(vq->vdev, VIRTIO_BLK_T_SCSI_CMD)) { | 106 | if (type == cpu_to_virtio32(vq->vdev, VIRTIO_BLK_T_SCSI_CMD)) { |
106 | memcpy(vbr->sense, vbr->req->sense, SCSI_SENSE_BUFFERSIZE); | ||
107 | sg_init_one(&sense, vbr->sense, SCSI_SENSE_BUFFERSIZE); | 107 | sg_init_one(&sense, vbr->sense, SCSI_SENSE_BUFFERSIZE); |
108 | sgs[num_out + num_in++] = &sense; | 108 | sgs[num_out + num_in++] = &sense; |
109 | sg_init_one(&inhdr, &vbr->in_hdr, sizeof(vbr->in_hdr)); | 109 | sg_init_one(&inhdr, &vbr->in_hdr, sizeof(vbr->in_hdr)); |
@@ -123,8 +123,10 @@ static inline void virtblk_request_done(struct request *req) | |||
123 | int error = virtblk_result(vbr); | 123 | int error = virtblk_result(vbr); |
124 | 124 | ||
125 | if (req->cmd_type == REQ_TYPE_BLOCK_PC) { | 125 | if (req->cmd_type == REQ_TYPE_BLOCK_PC) { |
126 | req->resid_len = virtio32_to_cpu(vblk->vdev, vbr->in_hdr.residual); | 126 | scsi_req(req)->resid_len = |
127 | req->sense_len = virtio32_to_cpu(vblk->vdev, vbr->in_hdr.sense_len); | 127 | virtio32_to_cpu(vblk->vdev, vbr->in_hdr.residual); |
128 | vbr->sreq.sense_len = | ||
129 | virtio32_to_cpu(vblk->vdev, vbr->in_hdr.sense_len); | ||
128 | req->errors = virtio32_to_cpu(vblk->vdev, vbr->in_hdr.errors); | 130 | req->errors = virtio32_to_cpu(vblk->vdev, vbr->in_hdr.errors); |
129 | } else if (req->cmd_type == REQ_TYPE_DRV_PRIV) { | 131 | } else if (req->cmd_type == REQ_TYPE_DRV_PRIV) { |
130 | req->errors = (error != 0); | 132 | req->errors = (error != 0); |
@@ -538,6 +540,7 @@ static int virtblk_init_request(void *data, struct request *rq, | |||
538 | struct virtio_blk *vblk = data; | 540 | struct virtio_blk *vblk = data; |
539 | struct virtblk_req *vbr = blk_mq_rq_to_pdu(rq); | 541 | struct virtblk_req *vbr = blk_mq_rq_to_pdu(rq); |
540 | 542 | ||
543 | vbr->sreq.sense = vbr->sense; | ||
541 | sg_init_table(vbr->sg, vblk->sg_elems); | 544 | sg_init_table(vbr->sg, vblk->sg_elems); |
542 | return 0; | 545 | return 0; |
543 | } | 546 | } |
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index 59cca72647a6..36f5237a8a69 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -281,8 +281,8 @@ | |||
281 | #include <linux/fcntl.h> | 281 | #include <linux/fcntl.h> |
282 | #include <linux/blkdev.h> | 282 | #include <linux/blkdev.h> |
283 | #include <linux/times.h> | 283 | #include <linux/times.h> |
284 | |||
285 | #include <linux/uaccess.h> | 284 | #include <linux/uaccess.h> |
285 | #include <scsi/scsi_request.h> | ||
286 | 286 | ||
287 | /* used to tell the module to turn on full debugging messages */ | 287 | /* used to tell the module to turn on full debugging messages */ |
288 | static bool debug; | 288 | static bool debug; |
@@ -2172,6 +2172,7 @@ static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf, | |||
2172 | { | 2172 | { |
2173 | struct request_queue *q = cdi->disk->queue; | 2173 | struct request_queue *q = cdi->disk->queue; |
2174 | struct request *rq; | 2174 | struct request *rq; |
2175 | struct scsi_request *req; | ||
2175 | struct bio *bio; | 2176 | struct bio *bio; |
2176 | unsigned int len; | 2177 | unsigned int len; |
2177 | int nr, ret = 0; | 2178 | int nr, ret = 0; |
@@ -2195,7 +2196,8 @@ static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf, | |||
2195 | ret = PTR_ERR(rq); | 2196 | ret = PTR_ERR(rq); |
2196 | break; | 2197 | break; |
2197 | } | 2198 | } |
2198 | blk_rq_set_block_pc(rq); | 2199 | req = scsi_req(rq); |
2200 | scsi_req_init(rq); | ||
2199 | 2201 | ||
2200 | ret = blk_rq_map_user(q, rq, NULL, ubuf, len, GFP_KERNEL); | 2202 | ret = blk_rq_map_user(q, rq, NULL, ubuf, len, GFP_KERNEL); |
2201 | if (ret) { | 2203 | if (ret) { |
@@ -2203,23 +2205,23 @@ static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf, | |||
2203 | break; | 2205 | break; |
2204 | } | 2206 | } |
2205 | 2207 | ||
2206 | rq->cmd[0] = GPCMD_READ_CD; | 2208 | req->cmd[0] = GPCMD_READ_CD; |
2207 | rq->cmd[1] = 1 << 2; | 2209 | req->cmd[1] = 1 << 2; |
2208 | rq->cmd[2] = (lba >> 24) & 0xff; | 2210 | req->cmd[2] = (lba >> 24) & 0xff; |
2209 | rq->cmd[3] = (lba >> 16) & 0xff; | 2211 | req->cmd[3] = (lba >> 16) & 0xff; |
2210 | rq->cmd[4] = (lba >> 8) & 0xff; | 2212 | req->cmd[4] = (lba >> 8) & 0xff; |
2211 | rq->cmd[5] = lba & 0xff; | 2213 | req->cmd[5] = lba & 0xff; |
2212 | rq->cmd[6] = (nr >> 16) & 0xff; | 2214 | req->cmd[6] = (nr >> 16) & 0xff; |
2213 | rq->cmd[7] = (nr >> 8) & 0xff; | 2215 | req->cmd[7] = (nr >> 8) & 0xff; |
2214 | rq->cmd[8] = nr & 0xff; | 2216 | req->cmd[8] = nr & 0xff; |
2215 | rq->cmd[9] = 0xf8; | 2217 | req->cmd[9] = 0xf8; |
2216 | 2218 | ||
2217 | rq->cmd_len = 12; | 2219 | req->cmd_len = 12; |
2218 | rq->timeout = 60 * HZ; | 2220 | rq->timeout = 60 * HZ; |
2219 | bio = rq->bio; | 2221 | bio = rq->bio; |
2220 | 2222 | ||
2221 | if (blk_execute_rq(q, cdi->disk, rq, 0)) { | 2223 | if (blk_execute_rq(q, cdi->disk, rq, 0)) { |
2222 | struct request_sense *s = rq->sense; | 2224 | struct request_sense *s = req->sense; |
2223 | ret = -EIO; | 2225 | ret = -EIO; |
2224 | cdi->last_sense = s->sense_key; | 2226 | cdi->last_sense = s->sense_key; |
2225 | } | 2227 | } |
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index f90ea221f7f2..7c826ecbd276 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
@@ -93,6 +93,7 @@ int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk, | |||
93 | int error; | 93 | int error; |
94 | 94 | ||
95 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); | 95 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); |
96 | scsi_req_init(rq); | ||
96 | rq->cmd_type = REQ_TYPE_DRV_PRIV; | 97 | rq->cmd_type = REQ_TYPE_DRV_PRIV; |
97 | rq->special = (char *)pc; | 98 | rq->special = (char *)pc; |
98 | 99 | ||
@@ -103,9 +104,9 @@ int ide_queue_pc_tail(ide_drive_t *drive, struct gendisk *disk, | |||
103 | goto put_req; | 104 | goto put_req; |
104 | } | 105 | } |
105 | 106 | ||
106 | memcpy(rq->cmd, pc->c, 12); | 107 | memcpy(scsi_req(rq)->cmd, pc->c, 12); |
107 | if (drive->media == ide_tape) | 108 | if (drive->media == ide_tape) |
108 | rq->cmd[13] = REQ_IDETAPE_PC1; | 109 | scsi_req(rq)->cmd[13] = REQ_IDETAPE_PC1; |
109 | error = blk_execute_rq(drive->queue, disk, rq, 0); | 110 | error = blk_execute_rq(drive->queue, disk, rq, 0); |
110 | put_req: | 111 | put_req: |
111 | blk_put_request(rq); | 112 | blk_put_request(rq); |
@@ -171,7 +172,8 @@ EXPORT_SYMBOL_GPL(ide_create_request_sense_cmd); | |||
171 | void ide_prep_sense(ide_drive_t *drive, struct request *rq) | 172 | void ide_prep_sense(ide_drive_t *drive, struct request *rq) |
172 | { | 173 | { |
173 | struct request_sense *sense = &drive->sense_data; | 174 | struct request_sense *sense = &drive->sense_data; |
174 | struct request *sense_rq = &drive->sense_rq; | 175 | struct request *sense_rq = drive->sense_rq; |
176 | struct scsi_request *req = scsi_req(sense_rq); | ||
175 | unsigned int cmd_len, sense_len; | 177 | unsigned int cmd_len, sense_len; |
176 | int err; | 178 | int err; |
177 | 179 | ||
@@ -197,6 +199,7 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq) | |||
197 | memset(sense, 0, sizeof(*sense)); | 199 | memset(sense, 0, sizeof(*sense)); |
198 | 200 | ||
199 | blk_rq_init(rq->q, sense_rq); | 201 | blk_rq_init(rq->q, sense_rq); |
202 | scsi_req_init(sense_rq); | ||
200 | 203 | ||
201 | err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len, | 204 | err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len, |
202 | GFP_NOIO); | 205 | GFP_NOIO); |
@@ -208,13 +211,13 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq) | |||
208 | } | 211 | } |
209 | 212 | ||
210 | sense_rq->rq_disk = rq->rq_disk; | 213 | sense_rq->rq_disk = rq->rq_disk; |
211 | sense_rq->cmd[0] = GPCMD_REQUEST_SENSE; | ||
212 | sense_rq->cmd[4] = cmd_len; | ||
213 | sense_rq->cmd_type = REQ_TYPE_ATA_SENSE; | 214 | sense_rq->cmd_type = REQ_TYPE_ATA_SENSE; |
214 | sense_rq->rq_flags |= RQF_PREEMPT; | 215 | sense_rq->rq_flags |= RQF_PREEMPT; |
215 | 216 | ||
217 | req->cmd[0] = GPCMD_REQUEST_SENSE; | ||
218 | req->cmd[4] = cmd_len; | ||
216 | if (drive->media == ide_tape) | 219 | if (drive->media == ide_tape) |
217 | sense_rq->cmd[13] = REQ_IDETAPE_PC1; | 220 | req->cmd[13] = REQ_IDETAPE_PC1; |
218 | 221 | ||
219 | drive->sense_rq_armed = true; | 222 | drive->sense_rq_armed = true; |
220 | } | 223 | } |
@@ -229,12 +232,12 @@ int ide_queue_sense_rq(ide_drive_t *drive, void *special) | |||
229 | return -ENOMEM; | 232 | return -ENOMEM; |
230 | } | 233 | } |
231 | 234 | ||
232 | drive->sense_rq.special = special; | 235 | drive->sense_rq->special = special; |
233 | drive->sense_rq_armed = false; | 236 | drive->sense_rq_armed = false; |
234 | 237 | ||
235 | drive->hwif->rq = NULL; | 238 | drive->hwif->rq = NULL; |
236 | 239 | ||
237 | elv_add_request(drive->queue, &drive->sense_rq, ELEVATOR_INSERT_FRONT); | 240 | elv_add_request(drive->queue, drive->sense_rq, ELEVATOR_INSERT_FRONT); |
238 | return 0; | 241 | return 0; |
239 | } | 242 | } |
240 | EXPORT_SYMBOL_GPL(ide_queue_sense_rq); | 243 | EXPORT_SYMBOL_GPL(ide_queue_sense_rq); |
@@ -247,14 +250,14 @@ EXPORT_SYMBOL_GPL(ide_queue_sense_rq); | |||
247 | void ide_retry_pc(ide_drive_t *drive) | 250 | void ide_retry_pc(ide_drive_t *drive) |
248 | { | 251 | { |
249 | struct request *failed_rq = drive->hwif->rq; | 252 | struct request *failed_rq = drive->hwif->rq; |
250 | struct request *sense_rq = &drive->sense_rq; | 253 | struct request *sense_rq = drive->sense_rq; |
251 | struct ide_atapi_pc *pc = &drive->request_sense_pc; | 254 | struct ide_atapi_pc *pc = &drive->request_sense_pc; |
252 | 255 | ||
253 | (void)ide_read_error(drive); | 256 | (void)ide_read_error(drive); |
254 | 257 | ||
255 | /* init pc from sense_rq */ | 258 | /* init pc from sense_rq */ |
256 | ide_init_pc(pc); | 259 | ide_init_pc(pc); |
257 | memcpy(pc->c, sense_rq->cmd, 12); | 260 | memcpy(pc->c, scsi_req(sense_rq)->cmd, 12); |
258 | 261 | ||
259 | if (drive->media == ide_tape) | 262 | if (drive->media == ide_tape) |
260 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; | 263 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; |
@@ -286,7 +289,7 @@ int ide_cd_expiry(ide_drive_t *drive) | |||
286 | * commands/drives support that. Let ide_timer_expiry keep polling us | 289 | * commands/drives support that. Let ide_timer_expiry keep polling us |
287 | * for these. | 290 | * for these. |
288 | */ | 291 | */ |
289 | switch (rq->cmd[0]) { | 292 | switch (scsi_req(rq)->cmd[0]) { |
290 | case GPCMD_BLANK: | 293 | case GPCMD_BLANK: |
291 | case GPCMD_FORMAT_UNIT: | 294 | case GPCMD_FORMAT_UNIT: |
292 | case GPCMD_RESERVE_RZONE_TRACK: | 295 | case GPCMD_RESERVE_RZONE_TRACK: |
@@ -297,7 +300,7 @@ int ide_cd_expiry(ide_drive_t *drive) | |||
297 | default: | 300 | default: |
298 | if (!(rq->rq_flags & RQF_QUIET)) | 301 | if (!(rq->rq_flags & RQF_QUIET)) |
299 | printk(KERN_INFO PFX "cmd 0x%x timed out\n", | 302 | printk(KERN_INFO PFX "cmd 0x%x timed out\n", |
300 | rq->cmd[0]); | 303 | scsi_req(rq)->cmd[0]); |
301 | wait = 0; | 304 | wait = 0; |
302 | break; | 305 | break; |
303 | } | 306 | } |
@@ -420,7 +423,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
420 | ? "write" : "read"); | 423 | ? "write" : "read"); |
421 | pc->flags |= PC_FLAG_DMA_ERROR; | 424 | pc->flags |= PC_FLAG_DMA_ERROR; |
422 | } else | 425 | } else |
423 | rq->resid_len = 0; | 426 | scsi_req(rq)->resid_len = 0; |
424 | debug_log("%s: DMA finished\n", drive->name); | 427 | debug_log("%s: DMA finished\n", drive->name); |
425 | } | 428 | } |
426 | 429 | ||
@@ -436,7 +439,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
436 | local_irq_enable_in_hardirq(); | 439 | local_irq_enable_in_hardirq(); |
437 | 440 | ||
438 | if (drive->media == ide_tape && | 441 | if (drive->media == ide_tape && |
439 | (stat & ATA_ERR) && rq->cmd[0] == REQUEST_SENSE) | 442 | (stat & ATA_ERR) && scsi_req(rq)->cmd[0] == REQUEST_SENSE) |
440 | stat &= ~ATA_ERR; | 443 | stat &= ~ATA_ERR; |
441 | 444 | ||
442 | if ((stat & ATA_ERR) || (pc->flags & PC_FLAG_DMA_ERROR)) { | 445 | if ((stat & ATA_ERR) || (pc->flags & PC_FLAG_DMA_ERROR)) { |
@@ -446,7 +449,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
446 | if (drive->media != ide_tape) | 449 | if (drive->media != ide_tape) |
447 | pc->rq->errors++; | 450 | pc->rq->errors++; |
448 | 451 | ||
449 | if (rq->cmd[0] == REQUEST_SENSE) { | 452 | if (scsi_req(rq)->cmd[0] == REQUEST_SENSE) { |
450 | printk(KERN_ERR PFX "%s: I/O error in request " | 453 | printk(KERN_ERR PFX "%s: I/O error in request " |
451 | "sense command\n", drive->name); | 454 | "sense command\n", drive->name); |
452 | return ide_do_reset(drive); | 455 | return ide_do_reset(drive); |
@@ -512,7 +515,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
512 | ide_pio_bytes(drive, cmd, write, done); | 515 | ide_pio_bytes(drive, cmd, write, done); |
513 | 516 | ||
514 | /* Update transferred byte count */ | 517 | /* Update transferred byte count */ |
515 | rq->resid_len -= done; | 518 | scsi_req(rq)->resid_len -= done; |
516 | 519 | ||
517 | bcount -= done; | 520 | bcount -= done; |
518 | 521 | ||
@@ -520,7 +523,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
520 | ide_pad_transfer(drive, write, bcount); | 523 | ide_pad_transfer(drive, write, bcount); |
521 | 524 | ||
522 | debug_log("[cmd %x] transferred %d bytes, padded %d bytes, resid: %u\n", | 525 | debug_log("[cmd %x] transferred %d bytes, padded %d bytes, resid: %u\n", |
523 | rq->cmd[0], done, bcount, rq->resid_len); | 526 | rq->cmd[0], done, bcount, scsi_req(rq)->resid_len); |
524 | 527 | ||
525 | /* And set the interrupt handler again */ | 528 | /* And set the interrupt handler again */ |
526 | ide_set_handler(drive, ide_pc_intr, timeout); | 529 | ide_set_handler(drive, ide_pc_intr, timeout); |
@@ -603,7 +606,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) | |||
603 | 606 | ||
604 | if (dev_is_idecd(drive)) { | 607 | if (dev_is_idecd(drive)) { |
605 | /* ATAPI commands get padded out to 12 bytes minimum */ | 608 | /* ATAPI commands get padded out to 12 bytes minimum */ |
606 | cmd_len = COMMAND_SIZE(rq->cmd[0]); | 609 | cmd_len = COMMAND_SIZE(scsi_req(rq)->cmd[0]); |
607 | if (cmd_len < ATAPI_MIN_CDB_BYTES) | 610 | if (cmd_len < ATAPI_MIN_CDB_BYTES) |
608 | cmd_len = ATAPI_MIN_CDB_BYTES; | 611 | cmd_len = ATAPI_MIN_CDB_BYTES; |
609 | 612 | ||
@@ -650,7 +653,7 @@ static ide_startstop_t ide_transfer_pc(ide_drive_t *drive) | |||
650 | 653 | ||
651 | /* Send the actual packet */ | 654 | /* Send the actual packet */ |
652 | if ((drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) == 0) | 655 | if ((drive->atapi_flags & IDE_AFLAG_ZIP_DRIVE) == 0) |
653 | hwif->tp_ops->output_data(drive, NULL, rq->cmd, cmd_len); | 656 | hwif->tp_ops->output_data(drive, NULL, scsi_req(rq)->cmd, cmd_len); |
654 | 657 | ||
655 | /* Begin DMA, if necessary */ | 658 | /* Begin DMA, if necessary */ |
656 | if (dev_is_idecd(drive)) { | 659 | if (dev_is_idecd(drive)) { |
@@ -695,7 +698,7 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) | |||
695 | bytes, 63 * 1024)); | 698 | bytes, 63 * 1024)); |
696 | 699 | ||
697 | /* We haven't transferred any data yet */ | 700 | /* We haven't transferred any data yet */ |
698 | rq->resid_len = bcount; | 701 | scsi_req(rq)->resid_len = bcount; |
699 | 702 | ||
700 | if (pc->flags & PC_FLAG_DMA_ERROR) { | 703 | if (pc->flags & PC_FLAG_DMA_ERROR) { |
701 | pc->flags &= ~PC_FLAG_DMA_ERROR; | 704 | pc->flags &= ~PC_FLAG_DMA_ERROR; |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 9cbd217bc0c9..6eb98725e194 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -121,7 +121,7 @@ static int cdrom_log_sense(ide_drive_t *drive, struct request *rq) | |||
121 | * don't log START_STOP unit with LoEj set, since we cannot | 121 | * don't log START_STOP unit with LoEj set, since we cannot |
122 | * reliably check if drive can auto-close | 122 | * reliably check if drive can auto-close |
123 | */ | 123 | */ |
124 | if (rq->cmd[0] == GPCMD_START_STOP_UNIT && sense->asc == 0x24) | 124 | if (scsi_req(rq)->cmd[0] == GPCMD_START_STOP_UNIT && sense->asc == 0x24) |
125 | break; | 125 | break; |
126 | log = 1; | 126 | log = 1; |
127 | break; | 127 | break; |
@@ -163,7 +163,7 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive, | |||
163 | * toc has not been recorded yet, it will fail with 05/24/00 (which is a | 163 | * toc has not been recorded yet, it will fail with 05/24/00 (which is a |
164 | * confusing error) | 164 | * confusing error) |
165 | */ | 165 | */ |
166 | if (failed_command && failed_command->cmd[0] == GPCMD_READ_TOC_PMA_ATIP) | 166 | if (failed_command && scsi_req(failed_command)->cmd[0] == GPCMD_READ_TOC_PMA_ATIP) |
167 | if (sense->sense_key == 0x05 && sense->asc == 0x24) | 167 | if (sense->sense_key == 0x05 && sense->asc == 0x24) |
168 | return; | 168 | return; |
169 | 169 | ||
@@ -219,15 +219,12 @@ static void ide_cd_complete_failed_rq(ide_drive_t *drive, struct request *rq) | |||
219 | void *sense = bio_data(rq->bio); | 219 | void *sense = bio_data(rq->bio); |
220 | 220 | ||
221 | if (failed) { | 221 | if (failed) { |
222 | if (failed->sense) { | 222 | /* |
223 | /* | 223 | * Sense is always read into drive->sense_data, copy back to the |
224 | * Sense is always read into drive->sense_data. | 224 | * original request. |
225 | * Copy back if the failed request has its | 225 | */ |
226 | * sense pointer set. | 226 | memcpy(scsi_req(failed)->sense, sense, 18); |
227 | */ | 227 | scsi_req(failed)->sense_len = scsi_req(rq)->sense_len; |
228 | memcpy(failed->sense, sense, 18); | ||
229 | failed->sense_len = rq->sense_len; | ||
230 | } | ||
231 | cdrom_analyze_sense_data(drive, failed); | 228 | cdrom_analyze_sense_data(drive, failed); |
232 | 229 | ||
233 | if (ide_end_rq(drive, failed, -EIO, blk_rq_bytes(failed))) | 230 | if (ide_end_rq(drive, failed, -EIO, blk_rq_bytes(failed))) |
@@ -338,7 +335,7 @@ static int cdrom_decode_status(ide_drive_t *drive, u8 stat) | |||
338 | * | 335 | * |
339 | * cdrom_log_sense() knows this! | 336 | * cdrom_log_sense() knows this! |
340 | */ | 337 | */ |
341 | if (rq->cmd[0] == GPCMD_START_STOP_UNIT) | 338 | if (scsi_req(rq)->cmd[0] == GPCMD_START_STOP_UNIT) |
342 | break; | 339 | break; |
343 | /* fall-through */ | 340 | /* fall-through */ |
344 | case DATA_PROTECT: | 341 | case DATA_PROTECT: |
@@ -414,7 +411,7 @@ static void ide_cd_request_sense_fixup(ide_drive_t *drive, struct ide_cmd *cmd) | |||
414 | * Some of the trailing request sense fields are optional, | 411 | * Some of the trailing request sense fields are optional, |
415 | * and some drives don't send them. Sigh. | 412 | * and some drives don't send them. Sigh. |
416 | */ | 413 | */ |
417 | if (rq->cmd[0] == GPCMD_REQUEST_SENSE && | 414 | if (scsi_req(rq)->cmd[0] == GPCMD_REQUEST_SENSE && |
418 | cmd->nleft > 0 && cmd->nleft <= 5) | 415 | cmd->nleft > 0 && cmd->nleft <= 5) |
419 | cmd->nleft = 0; | 416 | cmd->nleft = 0; |
420 | } | 417 | } |
@@ -425,12 +422,8 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | |||
425 | req_flags_t rq_flags) | 422 | req_flags_t rq_flags) |
426 | { | 423 | { |
427 | struct cdrom_info *info = drive->driver_data; | 424 | struct cdrom_info *info = drive->driver_data; |
428 | struct request_sense local_sense; | ||
429 | int retries = 10; | 425 | int retries = 10; |
430 | req_flags_t flags = 0; | 426 | bool failed; |
431 | |||
432 | if (!sense) | ||
433 | sense = &local_sense; | ||
434 | 427 | ||
435 | ide_debug_log(IDE_DBG_PC, "cmd[0]: 0x%x, write: 0x%x, timeout: %d, " | 428 | ide_debug_log(IDE_DBG_PC, "cmd[0]: 0x%x, write: 0x%x, timeout: %d, " |
436 | "rq_flags: 0x%x", | 429 | "rq_flags: 0x%x", |
@@ -440,12 +433,12 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | |||
440 | do { | 433 | do { |
441 | struct request *rq; | 434 | struct request *rq; |
442 | int error; | 435 | int error; |
436 | bool delay = false; | ||
443 | 437 | ||
444 | rq = blk_get_request(drive->queue, write, __GFP_RECLAIM); | 438 | rq = blk_get_request(drive->queue, write, __GFP_RECLAIM); |
445 | 439 | scsi_req_init(rq); | |
446 | memcpy(rq->cmd, cmd, BLK_MAX_CDB); | 440 | memcpy(scsi_req(rq)->cmd, cmd, BLK_MAX_CDB); |
447 | rq->cmd_type = REQ_TYPE_ATA_PC; | 441 | rq->cmd_type = REQ_TYPE_ATA_PC; |
448 | rq->sense = sense; | ||
449 | rq->rq_flags |= rq_flags; | 442 | rq->rq_flags |= rq_flags; |
450 | rq->timeout = timeout; | 443 | rq->timeout = timeout; |
451 | if (buffer) { | 444 | if (buffer) { |
@@ -460,21 +453,21 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | |||
460 | error = blk_execute_rq(drive->queue, info->disk, rq, 0); | 453 | error = blk_execute_rq(drive->queue, info->disk, rq, 0); |
461 | 454 | ||
462 | if (buffer) | 455 | if (buffer) |
463 | *bufflen = rq->resid_len; | 456 | *bufflen = scsi_req(rq)->resid_len; |
464 | 457 | if (sense) | |
465 | flags = rq->rq_flags; | 458 | memcpy(sense, scsi_req(rq)->sense, sizeof(*sense)); |
466 | blk_put_request(rq); | ||
467 | 459 | ||
468 | /* | 460 | /* |
469 | * FIXME: we should probably abort/retry or something in case of | 461 | * FIXME: we should probably abort/retry or something in case of |
470 | * failure. | 462 | * failure. |
471 | */ | 463 | */ |
472 | if (flags & RQF_FAILED) { | 464 | failed = (rq->rq_flags & RQF_FAILED) != 0; |
465 | if (failed) { | ||
473 | /* | 466 | /* |
474 | * The request failed. Retry if it was due to a unit | 467 | * The request failed. Retry if it was due to a unit |
475 | * attention status (usually means media was changed). | 468 | * attention status (usually means media was changed). |
476 | */ | 469 | */ |
477 | struct request_sense *reqbuf = sense; | 470 | struct request_sense *reqbuf = scsi_req(rq)->sense; |
478 | 471 | ||
479 | if (reqbuf->sense_key == UNIT_ATTENTION) | 472 | if (reqbuf->sense_key == UNIT_ATTENTION) |
480 | cdrom_saw_media_change(drive); | 473 | cdrom_saw_media_change(drive); |
@@ -485,19 +478,20 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | |||
485 | * a disk. Retry, but wait a little to give | 478 | * a disk. Retry, but wait a little to give |
486 | * the drive time to complete the load. | 479 | * the drive time to complete the load. |
487 | */ | 480 | */ |
488 | ssleep(2); | 481 | delay = true; |
489 | } else { | 482 | } else { |
490 | /* otherwise, don't retry */ | 483 | /* otherwise, don't retry */ |
491 | retries = 0; | 484 | retries = 0; |
492 | } | 485 | } |
493 | --retries; | 486 | --retries; |
494 | } | 487 | } |
495 | 488 | blk_put_request(rq); | |
496 | /* end of retry loop */ | 489 | if (delay) |
497 | } while ((flags & RQF_FAILED) && retries >= 0); | 490 | ssleep(2); |
491 | } while (failed && retries >= 0); | ||
498 | 492 | ||
499 | /* return an error if the command failed */ | 493 | /* return an error if the command failed */ |
500 | return (flags & RQF_FAILED) ? -EIO : 0; | 494 | return failed ? -EIO : 0; |
501 | } | 495 | } |
502 | 496 | ||
503 | /* | 497 | /* |
@@ -636,7 +630,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
636 | len -= blen; | 630 | len -= blen; |
637 | 631 | ||
638 | if (sense && write == 0) | 632 | if (sense && write == 0) |
639 | rq->sense_len += blen; | 633 | scsi_req(rq)->sense_len += blen; |
640 | } | 634 | } |
641 | 635 | ||
642 | /* pad, if necessary */ | 636 | /* pad, if necessary */ |
@@ -664,7 +658,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
664 | 658 | ||
665 | out_end: | 659 | out_end: |
666 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC && rc == 0) { | 660 | if (rq->cmd_type == REQ_TYPE_BLOCK_PC && rc == 0) { |
667 | rq->resid_len = 0; | 661 | scsi_req(rq)->resid_len = 0; |
668 | blk_end_request_all(rq, 0); | 662 | blk_end_request_all(rq, 0); |
669 | hwif->rq = NULL; | 663 | hwif->rq = NULL; |
670 | } else { | 664 | } else { |
@@ -685,9 +679,9 @@ out_end: | |||
685 | 679 | ||
686 | /* make sure it's fully ended */ | 680 | /* make sure it's fully ended */ |
687 | if (rq->cmd_type != REQ_TYPE_FS) { | 681 | if (rq->cmd_type != REQ_TYPE_FS) { |
688 | rq->resid_len -= cmd->nbytes - cmd->nleft; | 682 | scsi_req(rq)->resid_len -= cmd->nbytes - cmd->nleft; |
689 | if (uptodate == 0 && (cmd->tf_flags & IDE_TFLAG_WRITE)) | 683 | if (uptodate == 0 && (cmd->tf_flags & IDE_TFLAG_WRITE)) |
690 | rq->resid_len += cmd->last_xfer_len; | 684 | scsi_req(rq)->resid_len += cmd->last_xfer_len; |
691 | } | 685 | } |
692 | 686 | ||
693 | ide_complete_rq(drive, uptodate ? 0 : -EIO, blk_rq_bytes(rq)); | 687 | ide_complete_rq(drive, uptodate ? 0 : -EIO, blk_rq_bytes(rq)); |
@@ -1312,28 +1306,29 @@ static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq) | |||
1312 | int hard_sect = queue_logical_block_size(q); | 1306 | int hard_sect = queue_logical_block_size(q); |
1313 | long block = (long)blk_rq_pos(rq) / (hard_sect >> 9); | 1307 | long block = (long)blk_rq_pos(rq) / (hard_sect >> 9); |
1314 | unsigned long blocks = blk_rq_sectors(rq) / (hard_sect >> 9); | 1308 | unsigned long blocks = blk_rq_sectors(rq) / (hard_sect >> 9); |
1309 | struct scsi_request *req = scsi_req(rq); | ||
1315 | 1310 | ||
1316 | memset(rq->cmd, 0, BLK_MAX_CDB); | 1311 | memset(req->cmd, 0, BLK_MAX_CDB); |
1317 | 1312 | ||
1318 | if (rq_data_dir(rq) == READ) | 1313 | if (rq_data_dir(rq) == READ) |
1319 | rq->cmd[0] = GPCMD_READ_10; | 1314 | req->cmd[0] = GPCMD_READ_10; |
1320 | else | 1315 | else |
1321 | rq->cmd[0] = GPCMD_WRITE_10; | 1316 | req->cmd[0] = GPCMD_WRITE_10; |
1322 | 1317 | ||
1323 | /* | 1318 | /* |
1324 | * fill in lba | 1319 | * fill in lba |
1325 | */ | 1320 | */ |
1326 | rq->cmd[2] = (block >> 24) & 0xff; | 1321 | req->cmd[2] = (block >> 24) & 0xff; |
1327 | rq->cmd[3] = (block >> 16) & 0xff; | 1322 | req->cmd[3] = (block >> 16) & 0xff; |
1328 | rq->cmd[4] = (block >> 8) & 0xff; | 1323 | req->cmd[4] = (block >> 8) & 0xff; |
1329 | rq->cmd[5] = block & 0xff; | 1324 | req->cmd[5] = block & 0xff; |
1330 | 1325 | ||
1331 | /* | 1326 | /* |
1332 | * and transfer length | 1327 | * and transfer length |
1333 | */ | 1328 | */ |
1334 | rq->cmd[7] = (blocks >> 8) & 0xff; | 1329 | req->cmd[7] = (blocks >> 8) & 0xff; |
1335 | rq->cmd[8] = blocks & 0xff; | 1330 | req->cmd[8] = blocks & 0xff; |
1336 | rq->cmd_len = 10; | 1331 | req->cmd_len = 10; |
1337 | return BLKPREP_OK; | 1332 | return BLKPREP_OK; |
1338 | } | 1333 | } |
1339 | 1334 | ||
@@ -1343,7 +1338,7 @@ static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq) | |||
1343 | */ | 1338 | */ |
1344 | static int ide_cdrom_prep_pc(struct request *rq) | 1339 | static int ide_cdrom_prep_pc(struct request *rq) |
1345 | { | 1340 | { |
1346 | u8 *c = rq->cmd; | 1341 | u8 *c = scsi_req(rq)->cmd; |
1347 | 1342 | ||
1348 | /* transform 6-byte read/write commands to the 10-byte version */ | 1343 | /* transform 6-byte read/write commands to the 10-byte version */ |
1349 | if (c[0] == READ_6 || c[0] == WRITE_6) { | 1344 | if (c[0] == READ_6 || c[0] == WRITE_6) { |
@@ -1354,7 +1349,7 @@ static int ide_cdrom_prep_pc(struct request *rq) | |||
1354 | c[2] = 0; | 1349 | c[2] = 0; |
1355 | c[1] &= 0xe0; | 1350 | c[1] &= 0xe0; |
1356 | c[0] += (READ_10 - READ_6); | 1351 | c[0] += (READ_10 - READ_6); |
1357 | rq->cmd_len = 10; | 1352 | scsi_req(rq)->cmd_len = 10; |
1358 | return BLKPREP_OK; | 1353 | return BLKPREP_OK; |
1359 | } | 1354 | } |
1360 | 1355 | ||
diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c index f085e3a2e1d6..da0aa0153fb1 100644 --- a/drivers/ide/ide-cd_ioctl.c +++ b/drivers/ide/ide-cd_ioctl.c | |||
@@ -304,6 +304,7 @@ int ide_cdrom_reset(struct cdrom_device_info *cdi) | |||
304 | int ret; | 304 | int ret; |
305 | 305 | ||
306 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); | 306 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); |
307 | scsi_req_init(rq); | ||
307 | rq->cmd_type = REQ_TYPE_DRV_PRIV; | 308 | rq->cmd_type = REQ_TYPE_DRV_PRIV; |
308 | rq->rq_flags = RQF_QUIET; | 309 | rq->rq_flags = RQF_QUIET; |
309 | ret = blk_execute_rq(drive->queue, cd->disk, rq, 0); | 310 | ret = blk_execute_rq(drive->queue, cd->disk, rq, 0); |
diff --git a/drivers/ide/ide-cd_verbose.c b/drivers/ide/ide-cd_verbose.c index f079ca2f260b..58a6feb74c02 100644 --- a/drivers/ide/ide-cd_verbose.c +++ b/drivers/ide/ide-cd_verbose.c | |||
@@ -315,12 +315,12 @@ void ide_cd_log_error(const char *name, struct request *failed_command, | |||
315 | while (hi > lo) { | 315 | while (hi > lo) { |
316 | mid = (lo + hi) / 2; | 316 | mid = (lo + hi) / 2; |
317 | if (packet_command_texts[mid].packet_command == | 317 | if (packet_command_texts[mid].packet_command == |
318 | failed_command->cmd[0]) { | 318 | scsi_req(failed_command)->cmd[0]) { |
319 | s = packet_command_texts[mid].text; | 319 | s = packet_command_texts[mid].text; |
320 | break; | 320 | break; |
321 | } | 321 | } |
322 | if (packet_command_texts[mid].packet_command > | 322 | if (packet_command_texts[mid].packet_command > |
323 | failed_command->cmd[0]) | 323 | scsi_req(failed_command)->cmd[0]) |
324 | hi = mid; | 324 | hi = mid; |
325 | else | 325 | else |
326 | lo = mid + 1; | 326 | lo = mid + 1; |
@@ -329,7 +329,7 @@ void ide_cd_log_error(const char *name, struct request *failed_command, | |||
329 | printk(KERN_ERR " The failed \"%s\" packet command " | 329 | printk(KERN_ERR " The failed \"%s\" packet command " |
330 | "was: \n \"", s); | 330 | "was: \n \"", s); |
331 | for (i = 0; i < BLK_MAX_CDB; i++) | 331 | for (i = 0; i < BLK_MAX_CDB; i++) |
332 | printk(KERN_CONT "%02x ", failed_command->cmd[i]); | 332 | printk(KERN_CONT "%02x ", scsi_req(failed_command)->cmd[i]); |
333 | printk(KERN_CONT "\"\n"); | 333 | printk(KERN_CONT "\"\n"); |
334 | } | 334 | } |
335 | 335 | ||
diff --git a/drivers/ide/ide-devsets.c b/drivers/ide/ide-devsets.c index 0dd43b4fcec6..fd56c9dd9bc7 100644 --- a/drivers/ide/ide-devsets.c +++ b/drivers/ide/ide-devsets.c | |||
@@ -166,10 +166,11 @@ int ide_devset_execute(ide_drive_t *drive, const struct ide_devset *setting, | |||
166 | return setting->set(drive, arg); | 166 | return setting->set(drive, arg); |
167 | 167 | ||
168 | rq = blk_get_request(q, READ, __GFP_RECLAIM); | 168 | rq = blk_get_request(q, READ, __GFP_RECLAIM); |
169 | scsi_req_init(rq); | ||
169 | rq->cmd_type = REQ_TYPE_DRV_PRIV; | 170 | rq->cmd_type = REQ_TYPE_DRV_PRIV; |
170 | rq->cmd_len = 5; | 171 | scsi_req(rq)->cmd_len = 5; |
171 | rq->cmd[0] = REQ_DEVSET_EXEC; | 172 | scsi_req(rq)->cmd[0] = REQ_DEVSET_EXEC; |
172 | *(int *)&rq->cmd[1] = arg; | 173 | *(int *)&scsi_req(rq)->cmd[1] = arg; |
173 | rq->special = setting->set; | 174 | rq->special = setting->set; |
174 | 175 | ||
175 | if (blk_execute_rq(q, NULL, rq, 0)) | 176 | if (blk_execute_rq(q, NULL, rq, 0)) |
@@ -183,7 +184,7 @@ ide_startstop_t ide_do_devset(ide_drive_t *drive, struct request *rq) | |||
183 | { | 184 | { |
184 | int err, (*setfunc)(ide_drive_t *, int) = rq->special; | 185 | int err, (*setfunc)(ide_drive_t *, int) = rq->special; |
185 | 186 | ||
186 | err = setfunc(drive, *(int *)&rq->cmd[1]); | 187 | err = setfunc(drive, *(int *)&scsi_req(rq)->cmd[1]); |
187 | if (err) | 188 | if (err) |
188 | rq->errors = err; | 189 | rq->errors = err; |
189 | ide_complete_rq(drive, err, blk_rq_bytes(rq)); | 190 | ide_complete_rq(drive, err, blk_rq_bytes(rq)); |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 5ceace542b77..3437c5b28599 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -478,6 +478,7 @@ static int set_multcount(ide_drive_t *drive, int arg) | |||
478 | return -EBUSY; | 478 | return -EBUSY; |
479 | 479 | ||
480 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); | 480 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); |
481 | scsi_req_init(rq); | ||
481 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; | 482 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; |
482 | 483 | ||
483 | drive->mult_req = arg; | 484 | drive->mult_req = arg; |
diff --git a/drivers/ide/ide-eh.c b/drivers/ide/ide-eh.c index d6da011299f5..35e5b892f9d7 100644 --- a/drivers/ide/ide-eh.c +++ b/drivers/ide/ide-eh.c | |||
@@ -148,7 +148,7 @@ static inline void ide_complete_drive_reset(ide_drive_t *drive, int err) | |||
148 | struct request *rq = drive->hwif->rq; | 148 | struct request *rq = drive->hwif->rq; |
149 | 149 | ||
150 | if (rq && rq->cmd_type == REQ_TYPE_DRV_PRIV && | 150 | if (rq && rq->cmd_type == REQ_TYPE_DRV_PRIV && |
151 | rq->cmd[0] == REQ_DRIVE_RESET) { | 151 | scsi_req(rq)->cmd[0] == REQ_DRIVE_RESET) { |
152 | if (err <= 0 && rq->errors == 0) | 152 | if (err <= 0 && rq->errors == 0) |
153 | rq->errors = -EIO; | 153 | rq->errors = -EIO; |
154 | ide_complete_rq(drive, err ? err : 0, blk_rq_bytes(rq)); | 154 | ide_complete_rq(drive, err ? err : 0, blk_rq_bytes(rq)); |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index f079d8d1d856..3bd678ad3519 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -203,7 +203,7 @@ static void idefloppy_create_rw_cmd(ide_drive_t *drive, | |||
203 | put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]); | 203 | put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]); |
204 | put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]); | 204 | put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]); |
205 | 205 | ||
206 | memcpy(rq->cmd, pc->c, 12); | 206 | memcpy(scsi_req(rq)->cmd, pc->c, 12); |
207 | 207 | ||
208 | pc->rq = rq; | 208 | pc->rq = rq; |
209 | if (cmd == WRITE) | 209 | if (cmd == WRITE) |
@@ -216,7 +216,7 @@ static void idefloppy_blockpc_cmd(struct ide_disk_obj *floppy, | |||
216 | struct ide_atapi_pc *pc, struct request *rq) | 216 | struct ide_atapi_pc *pc, struct request *rq) |
217 | { | 217 | { |
218 | ide_init_pc(pc); | 218 | ide_init_pc(pc); |
219 | memcpy(pc->c, rq->cmd, sizeof(pc->c)); | 219 | memcpy(pc->c, scsi_req(rq)->cmd, sizeof(pc->c)); |
220 | pc->rq = rq; | 220 | pc->rq = rq; |
221 | if (blk_rq_bytes(rq)) { | 221 | if (blk_rq_bytes(rq)) { |
222 | pc->flags |= PC_FLAG_DMA_OK; | 222 | pc->flags |= PC_FLAG_DMA_OK; |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 201e43fcbc94..3378503afed4 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -279,7 +279,7 @@ static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, | |||
279 | 279 | ||
280 | static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq) | 280 | static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq) |
281 | { | 281 | { |
282 | u8 cmd = rq->cmd[0]; | 282 | u8 cmd = scsi_req(rq)->cmd[0]; |
283 | 283 | ||
284 | switch (cmd) { | 284 | switch (cmd) { |
285 | case REQ_PARK_HEADS: | 285 | case REQ_PARK_HEADS: |
@@ -545,6 +545,7 @@ repeat: | |||
545 | goto plug_device; | 545 | goto plug_device; |
546 | } | 546 | } |
547 | 547 | ||
548 | scsi_req(rq)->resid_len = blk_rq_bytes(rq); | ||
548 | hwif->rq = rq; | 549 | hwif->rq = rq; |
549 | 550 | ||
550 | spin_unlock_irq(&hwif->lock); | 551 | spin_unlock_irq(&hwif->lock); |
diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c index d05db2469209..a5d22c6e956a 100644 --- a/drivers/ide/ide-ioctls.c +++ b/drivers/ide/ide-ioctls.c | |||
@@ -126,6 +126,7 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg) | |||
126 | struct request *rq; | 126 | struct request *rq; |
127 | 127 | ||
128 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); | 128 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); |
129 | scsi_req_init(rq); | ||
129 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; | 130 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; |
130 | err = blk_execute_rq(drive->queue, NULL, rq, 0); | 131 | err = blk_execute_rq(drive->queue, NULL, rq, 0); |
131 | blk_put_request(rq); | 132 | blk_put_request(rq); |
@@ -222,9 +223,10 @@ static int generic_drive_reset(ide_drive_t *drive) | |||
222 | int ret = 0; | 223 | int ret = 0; |
223 | 224 | ||
224 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); | 225 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); |
226 | scsi_req_init(rq); | ||
225 | rq->cmd_type = REQ_TYPE_DRV_PRIV; | 227 | rq->cmd_type = REQ_TYPE_DRV_PRIV; |
226 | rq->cmd_len = 1; | 228 | scsi_req(rq)->cmd_len = 1; |
227 | rq->cmd[0] = REQ_DRIVE_RESET; | 229 | scsi_req(rq)->cmd[0] = REQ_DRIVE_RESET; |
228 | if (blk_execute_rq(drive->queue, NULL, rq, 1)) | 230 | if (blk_execute_rq(drive->queue, NULL, rq, 1)) |
229 | ret = rq->errors; | 231 | ret = rq->errors; |
230 | blk_put_request(rq); | 232 | blk_put_request(rq); |
diff --git a/drivers/ide/ide-park.c b/drivers/ide/ide-park.c index 2d7dca56dd24..c37604a75097 100644 --- a/drivers/ide/ide-park.c +++ b/drivers/ide/ide-park.c | |||
@@ -32,8 +32,9 @@ static void issue_park_cmd(ide_drive_t *drive, unsigned long timeout) | |||
32 | spin_unlock_irq(&hwif->lock); | 32 | spin_unlock_irq(&hwif->lock); |
33 | 33 | ||
34 | rq = blk_get_request(q, READ, __GFP_RECLAIM); | 34 | rq = blk_get_request(q, READ, __GFP_RECLAIM); |
35 | rq->cmd[0] = REQ_PARK_HEADS; | 35 | scsi_req_init(rq); |
36 | rq->cmd_len = 1; | 36 | scsi_req(rq)->cmd[0] = REQ_PARK_HEADS; |
37 | scsi_req(rq)->cmd_len = 1; | ||
37 | rq->cmd_type = REQ_TYPE_DRV_PRIV; | 38 | rq->cmd_type = REQ_TYPE_DRV_PRIV; |
38 | rq->special = &timeout; | 39 | rq->special = &timeout; |
39 | rc = blk_execute_rq(q, NULL, rq, 1); | 40 | rc = blk_execute_rq(q, NULL, rq, 1); |
@@ -46,11 +47,12 @@ static void issue_park_cmd(ide_drive_t *drive, unsigned long timeout) | |||
46 | * timeout has expired, so power management will be reenabled. | 47 | * timeout has expired, so power management will be reenabled. |
47 | */ | 48 | */ |
48 | rq = blk_get_request(q, READ, GFP_NOWAIT); | 49 | rq = blk_get_request(q, READ, GFP_NOWAIT); |
50 | scsi_req_init(rq); | ||
49 | if (IS_ERR(rq)) | 51 | if (IS_ERR(rq)) |
50 | goto out; | 52 | goto out; |
51 | 53 | ||
52 | rq->cmd[0] = REQ_UNPARK_HEADS; | 54 | scsi_req(rq)->cmd[0] = REQ_UNPARK_HEADS; |
53 | rq->cmd_len = 1; | 55 | scsi_req(rq)->cmd_len = 1; |
54 | rq->cmd_type = REQ_TYPE_DRV_PRIV; | 56 | rq->cmd_type = REQ_TYPE_DRV_PRIV; |
55 | elv_add_request(q, rq, ELEVATOR_INSERT_FRONT); | 57 | elv_add_request(q, rq, ELEVATOR_INSERT_FRONT); |
56 | 58 | ||
@@ -64,7 +66,7 @@ ide_startstop_t ide_do_park_unpark(ide_drive_t *drive, struct request *rq) | |||
64 | struct ide_taskfile *tf = &cmd.tf; | 66 | struct ide_taskfile *tf = &cmd.tf; |
65 | 67 | ||
66 | memset(&cmd, 0, sizeof(cmd)); | 68 | memset(&cmd, 0, sizeof(cmd)); |
67 | if (rq->cmd[0] == REQ_PARK_HEADS) { | 69 | if (scsi_req(rq)->cmd[0] == REQ_PARK_HEADS) { |
68 | drive->sleep = *(unsigned long *)rq->special; | 70 | drive->sleep = *(unsigned long *)rq->special; |
69 | drive->dev_flags |= IDE_DFLAG_SLEEPING; | 71 | drive->dev_flags |= IDE_DFLAG_SLEEPING; |
70 | tf->command = ATA_CMD_IDLEIMMEDIATE; | 72 | tf->command = ATA_CMD_IDLEIMMEDIATE; |
diff --git a/drivers/ide/ide-pm.c b/drivers/ide/ide-pm.c index a015acdffb39..f6767aba7cfb 100644 --- a/drivers/ide/ide-pm.c +++ b/drivers/ide/ide-pm.c | |||
@@ -19,6 +19,7 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg) | |||
19 | 19 | ||
20 | memset(&rqpm, 0, sizeof(rqpm)); | 20 | memset(&rqpm, 0, sizeof(rqpm)); |
21 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); | 21 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); |
22 | scsi_req_init(rq); | ||
22 | rq->cmd_type = REQ_TYPE_ATA_PM_SUSPEND; | 23 | rq->cmd_type = REQ_TYPE_ATA_PM_SUSPEND; |
23 | rq->special = &rqpm; | 24 | rq->special = &rqpm; |
24 | rqpm.pm_step = IDE_PM_START_SUSPEND; | 25 | rqpm.pm_step = IDE_PM_START_SUSPEND; |
@@ -89,6 +90,7 @@ int generic_ide_resume(struct device *dev) | |||
89 | 90 | ||
90 | memset(&rqpm, 0, sizeof(rqpm)); | 91 | memset(&rqpm, 0, sizeof(rqpm)); |
91 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); | 92 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); |
93 | scsi_req_init(rq); | ||
92 | rq->cmd_type = REQ_TYPE_ATA_PM_RESUME; | 94 | rq->cmd_type = REQ_TYPE_ATA_PM_RESUME; |
93 | rq->rq_flags |= RQF_PREEMPT; | 95 | rq->rq_flags |= RQF_PREEMPT; |
94 | rq->special = &rqpm; | 96 | rq->special = &rqpm; |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 330e319419e6..a74ae8df4bb8 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -741,6 +741,14 @@ static void ide_port_tune_devices(ide_hwif_t *hwif) | |||
741 | } | 741 | } |
742 | } | 742 | } |
743 | 743 | ||
744 | static int ide_init_rq(struct request_queue *q, struct request *rq, gfp_t gfp) | ||
745 | { | ||
746 | struct ide_request *req = blk_mq_rq_to_pdu(rq); | ||
747 | |||
748 | req->sreq.sense = req->sense; | ||
749 | return 0; | ||
750 | } | ||
751 | |||
744 | /* | 752 | /* |
745 | * init request queue | 753 | * init request queue |
746 | */ | 754 | */ |
@@ -758,11 +766,18 @@ static int ide_init_queue(ide_drive_t *drive) | |||
758 | * limits and LBA48 we could raise it but as yet | 766 | * limits and LBA48 we could raise it but as yet |
759 | * do not. | 767 | * do not. |
760 | */ | 768 | */ |
761 | 769 | q = blk_alloc_queue_node(GFP_KERNEL, hwif_to_node(hwif)); | |
762 | q = blk_init_queue_node(do_ide_request, NULL, hwif_to_node(hwif)); | ||
763 | if (!q) | 770 | if (!q) |
764 | return 1; | 771 | return 1; |
765 | 772 | ||
773 | q->request_fn = do_ide_request; | ||
774 | q->init_rq_fn = ide_init_rq; | ||
775 | q->cmd_size = sizeof(struct ide_request); | ||
776 | if (blk_init_allocated_queue(q) < 0) { | ||
777 | blk_cleanup_queue(q); | ||
778 | return 1; | ||
779 | } | ||
780 | |||
766 | q->queuedata = drive; | 781 | q->queuedata = drive; |
767 | blk_queue_segment_boundary(q, 0xffff); | 782 | blk_queue_segment_boundary(q, 0xffff); |
768 | 783 | ||
@@ -1131,10 +1146,12 @@ static void ide_port_init_devices_data(ide_hwif_t *hwif) | |||
1131 | ide_port_for_each_dev(i, drive, hwif) { | 1146 | ide_port_for_each_dev(i, drive, hwif) { |
1132 | u8 j = (hwif->index * MAX_DRIVES) + i; | 1147 | u8 j = (hwif->index * MAX_DRIVES) + i; |
1133 | u16 *saved_id = drive->id; | 1148 | u16 *saved_id = drive->id; |
1149 | struct request *saved_sense_rq = drive->sense_rq; | ||
1134 | 1150 | ||
1135 | memset(drive, 0, sizeof(*drive)); | 1151 | memset(drive, 0, sizeof(*drive)); |
1136 | memset(saved_id, 0, SECTOR_SIZE); | 1152 | memset(saved_id, 0, SECTOR_SIZE); |
1137 | drive->id = saved_id; | 1153 | drive->id = saved_id; |
1154 | drive->sense_rq = saved_sense_rq; | ||
1138 | 1155 | ||
1139 | drive->media = ide_disk; | 1156 | drive->media = ide_disk; |
1140 | drive->select = (i << 4) | ATA_DEVICE_OBS; | 1157 | drive->select = (i << 4) | ATA_DEVICE_OBS; |
@@ -1241,6 +1258,7 @@ static void ide_port_free_devices(ide_hwif_t *hwif) | |||
1241 | int i; | 1258 | int i; |
1242 | 1259 | ||
1243 | ide_port_for_each_dev(i, drive, hwif) { | 1260 | ide_port_for_each_dev(i, drive, hwif) { |
1261 | kfree(drive->sense_rq); | ||
1244 | kfree(drive->id); | 1262 | kfree(drive->id); |
1245 | kfree(drive); | 1263 | kfree(drive); |
1246 | } | 1264 | } |
@@ -1248,11 +1266,10 @@ static void ide_port_free_devices(ide_hwif_t *hwif) | |||
1248 | 1266 | ||
1249 | static int ide_port_alloc_devices(ide_hwif_t *hwif, int node) | 1267 | static int ide_port_alloc_devices(ide_hwif_t *hwif, int node) |
1250 | { | 1268 | { |
1269 | ide_drive_t *drive; | ||
1251 | int i; | 1270 | int i; |
1252 | 1271 | ||
1253 | for (i = 0; i < MAX_DRIVES; i++) { | 1272 | for (i = 0; i < MAX_DRIVES; i++) { |
1254 | ide_drive_t *drive; | ||
1255 | |||
1256 | drive = kzalloc_node(sizeof(*drive), GFP_KERNEL, node); | 1273 | drive = kzalloc_node(sizeof(*drive), GFP_KERNEL, node); |
1257 | if (drive == NULL) | 1274 | if (drive == NULL) |
1258 | goto out_nomem; | 1275 | goto out_nomem; |
@@ -1267,12 +1284,21 @@ static int ide_port_alloc_devices(ide_hwif_t *hwif, int node) | |||
1267 | */ | 1284 | */ |
1268 | drive->id = kzalloc_node(SECTOR_SIZE, GFP_KERNEL, node); | 1285 | drive->id = kzalloc_node(SECTOR_SIZE, GFP_KERNEL, node); |
1269 | if (drive->id == NULL) | 1286 | if (drive->id == NULL) |
1270 | goto out_nomem; | 1287 | goto out_free_drive; |
1288 | |||
1289 | drive->sense_rq = kmalloc(sizeof(struct request) + | ||
1290 | sizeof(struct ide_request), GFP_KERNEL); | ||
1291 | if (!drive->sense_rq) | ||
1292 | goto out_free_id; | ||
1271 | 1293 | ||
1272 | hwif->devices[i] = drive; | 1294 | hwif->devices[i] = drive; |
1273 | } | 1295 | } |
1274 | return 0; | 1296 | return 0; |
1275 | 1297 | ||
1298 | out_free_id: | ||
1299 | kfree(drive->id); | ||
1300 | out_free_drive: | ||
1301 | kfree(drive); | ||
1276 | out_nomem: | 1302 | out_nomem: |
1277 | ide_port_free_devices(hwif); | 1303 | ide_port_free_devices(hwif); |
1278 | return -ENOMEM; | 1304 | return -ENOMEM; |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 9ecf4e35adcd..f6bc1e2bb035 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -282,7 +282,7 @@ static void idetape_analyze_error(ide_drive_t *drive) | |||
282 | 282 | ||
283 | /* correct remaining bytes to transfer */ | 283 | /* correct remaining bytes to transfer */ |
284 | if (pc->flags & PC_FLAG_DMA_ERROR) | 284 | if (pc->flags & PC_FLAG_DMA_ERROR) |
285 | rq->resid_len = tape->blk_size * get_unaligned_be32(&sense[3]); | 285 | scsi_req(rq)->resid_len = tape->blk_size * get_unaligned_be32(&sense[3]); |
286 | 286 | ||
287 | /* | 287 | /* |
288 | * If error was the result of a zero-length read or write command, | 288 | * If error was the result of a zero-length read or write command, |
@@ -316,7 +316,7 @@ static void idetape_analyze_error(ide_drive_t *drive) | |||
316 | pc->flags |= PC_FLAG_ABORT; | 316 | pc->flags |= PC_FLAG_ABORT; |
317 | } | 317 | } |
318 | if (!(pc->flags & PC_FLAG_ABORT) && | 318 | if (!(pc->flags & PC_FLAG_ABORT) && |
319 | (blk_rq_bytes(rq) - rq->resid_len)) | 319 | (blk_rq_bytes(rq) - scsi_req(rq)->resid_len)) |
320 | pc->retries = IDETAPE_MAX_PC_RETRIES + 1; | 320 | pc->retries = IDETAPE_MAX_PC_RETRIES + 1; |
321 | } | 321 | } |
322 | } | 322 | } |
@@ -348,7 +348,7 @@ static int ide_tape_callback(ide_drive_t *drive, int dsc) | |||
348 | "itself - Aborting request!\n"); | 348 | "itself - Aborting request!\n"); |
349 | } else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) { | 349 | } else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) { |
350 | unsigned int blocks = | 350 | unsigned int blocks = |
351 | (blk_rq_bytes(rq) - rq->resid_len) / tape->blk_size; | 351 | (blk_rq_bytes(rq) - scsi_req(rq)->resid_len) / tape->blk_size; |
352 | 352 | ||
353 | tape->avg_size += blocks * tape->blk_size; | 353 | tape->avg_size += blocks * tape->blk_size; |
354 | 354 | ||
@@ -560,7 +560,7 @@ static void ide_tape_create_rw_cmd(idetape_tape_t *tape, | |||
560 | pc->flags |= PC_FLAG_WRITING; | 560 | pc->flags |= PC_FLAG_WRITING; |
561 | } | 561 | } |
562 | 562 | ||
563 | memcpy(rq->cmd, pc->c, 12); | 563 | memcpy(scsi_req(rq)->cmd, pc->c, 12); |
564 | } | 564 | } |
565 | 565 | ||
566 | static ide_startstop_t idetape_do_request(ide_drive_t *drive, | 566 | static ide_startstop_t idetape_do_request(ide_drive_t *drive, |
@@ -570,10 +570,11 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
570 | idetape_tape_t *tape = drive->driver_data; | 570 | idetape_tape_t *tape = drive->driver_data; |
571 | struct ide_atapi_pc *pc = NULL; | 571 | struct ide_atapi_pc *pc = NULL; |
572 | struct ide_cmd cmd; | 572 | struct ide_cmd cmd; |
573 | struct scsi_request *req = scsi_req(rq); | ||
573 | u8 stat; | 574 | u8 stat; |
574 | 575 | ||
575 | ide_debug_log(IDE_DBG_RQ, "cmd: 0x%x, sector: %llu, nr_sectors: %u", | 576 | ide_debug_log(IDE_DBG_RQ, "cmd: 0x%x, sector: %llu, nr_sectors: %u", |
576 | rq->cmd[0], (unsigned long long)blk_rq_pos(rq), | 577 | req->cmd[0], (unsigned long long)blk_rq_pos(rq), |
577 | blk_rq_sectors(rq)); | 578 | blk_rq_sectors(rq)); |
578 | 579 | ||
579 | BUG_ON(!(rq->cmd_type == REQ_TYPE_DRV_PRIV || | 580 | BUG_ON(!(rq->cmd_type == REQ_TYPE_DRV_PRIV || |
@@ -592,7 +593,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
592 | stat = hwif->tp_ops->read_status(hwif); | 593 | stat = hwif->tp_ops->read_status(hwif); |
593 | 594 | ||
594 | if ((drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) == 0 && | 595 | if ((drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) == 0 && |
595 | (rq->cmd[13] & REQ_IDETAPE_PC2) == 0) | 596 | (req->cmd[13] & REQ_IDETAPE_PC2) == 0) |
596 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; | 597 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; |
597 | 598 | ||
598 | if (drive->dev_flags & IDE_DFLAG_POST_RESET) { | 599 | if (drive->dev_flags & IDE_DFLAG_POST_RESET) { |
@@ -609,7 +610,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
609 | } else if (time_after(jiffies, tape->dsc_timeout)) { | 610 | } else if (time_after(jiffies, tape->dsc_timeout)) { |
610 | printk(KERN_ERR "ide-tape: %s: DSC timeout\n", | 611 | printk(KERN_ERR "ide-tape: %s: DSC timeout\n", |
611 | tape->name); | 612 | tape->name); |
612 | if (rq->cmd[13] & REQ_IDETAPE_PC2) { | 613 | if (req->cmd[13] & REQ_IDETAPE_PC2) { |
613 | idetape_media_access_finished(drive); | 614 | idetape_media_access_finished(drive); |
614 | return ide_stopped; | 615 | return ide_stopped; |
615 | } else { | 616 | } else { |
@@ -626,23 +627,23 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
626 | tape->postponed_rq = false; | 627 | tape->postponed_rq = false; |
627 | } | 628 | } |
628 | 629 | ||
629 | if (rq->cmd[13] & REQ_IDETAPE_READ) { | 630 | if (req->cmd[13] & REQ_IDETAPE_READ) { |
630 | pc = &tape->queued_pc; | 631 | pc = &tape->queued_pc; |
631 | ide_tape_create_rw_cmd(tape, pc, rq, READ_6); | 632 | ide_tape_create_rw_cmd(tape, pc, rq, READ_6); |
632 | goto out; | 633 | goto out; |
633 | } | 634 | } |
634 | if (rq->cmd[13] & REQ_IDETAPE_WRITE) { | 635 | if (req->cmd[13] & REQ_IDETAPE_WRITE) { |
635 | pc = &tape->queued_pc; | 636 | pc = &tape->queued_pc; |
636 | ide_tape_create_rw_cmd(tape, pc, rq, WRITE_6); | 637 | ide_tape_create_rw_cmd(tape, pc, rq, WRITE_6); |
637 | goto out; | 638 | goto out; |
638 | } | 639 | } |
639 | if (rq->cmd[13] & REQ_IDETAPE_PC1) { | 640 | if (req->cmd[13] & REQ_IDETAPE_PC1) { |
640 | pc = (struct ide_atapi_pc *)rq->special; | 641 | pc = (struct ide_atapi_pc *)rq->special; |
641 | rq->cmd[13] &= ~(REQ_IDETAPE_PC1); | 642 | req->cmd[13] &= ~(REQ_IDETAPE_PC1); |
642 | rq->cmd[13] |= REQ_IDETAPE_PC2; | 643 | req->cmd[13] |= REQ_IDETAPE_PC2; |
643 | goto out; | 644 | goto out; |
644 | } | 645 | } |
645 | if (rq->cmd[13] & REQ_IDETAPE_PC2) { | 646 | if (req->cmd[13] & REQ_IDETAPE_PC2) { |
646 | idetape_media_access_finished(drive); | 647 | idetape_media_access_finished(drive); |
647 | return ide_stopped; | 648 | return ide_stopped; |
648 | } | 649 | } |
@@ -853,8 +854,9 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int size) | |||
853 | BUG_ON(size < 0 || size % tape->blk_size); | 854 | BUG_ON(size < 0 || size % tape->blk_size); |
854 | 855 | ||
855 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); | 856 | rq = blk_get_request(drive->queue, READ, __GFP_RECLAIM); |
857 | scsi_req_init(rq); | ||
856 | rq->cmd_type = REQ_TYPE_DRV_PRIV; | 858 | rq->cmd_type = REQ_TYPE_DRV_PRIV; |
857 | rq->cmd[13] = cmd; | 859 | scsi_req(rq)->cmd[13] = cmd; |
858 | rq->rq_disk = tape->disk; | 860 | rq->rq_disk = tape->disk; |
859 | rq->__sector = tape->first_frame; | 861 | rq->__sector = tape->first_frame; |
860 | 862 | ||
@@ -868,7 +870,7 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int size) | |||
868 | blk_execute_rq(drive->queue, tape->disk, rq, 0); | 870 | blk_execute_rq(drive->queue, tape->disk, rq, 0); |
869 | 871 | ||
870 | /* calculate the number of transferred bytes and update buffer state */ | 872 | /* calculate the number of transferred bytes and update buffer state */ |
871 | size -= rq->resid_len; | 873 | size -= scsi_req(rq)->resid_len; |
872 | tape->cur = tape->buf; | 874 | tape->cur = tape->buf; |
873 | if (cmd == REQ_IDETAPE_READ) | 875 | if (cmd == REQ_IDETAPE_READ) |
874 | tape->valid = size; | 876 | tape->valid = size; |
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index a716693417a3..a393e13b8007 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -431,6 +431,7 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf, | |||
431 | int rw = !(cmd->tf_flags & IDE_TFLAG_WRITE) ? READ : WRITE; | 431 | int rw = !(cmd->tf_flags & IDE_TFLAG_WRITE) ? READ : WRITE; |
432 | 432 | ||
433 | rq = blk_get_request(drive->queue, rw, __GFP_RECLAIM); | 433 | rq = blk_get_request(drive->queue, rw, __GFP_RECLAIM); |
434 | scsi_req_init(rq); | ||
434 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; | 435 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; |
435 | 436 | ||
436 | /* | 437 | /* |
diff --git a/drivers/ide/sis5513.c b/drivers/ide/sis5513.c index 247853ea1368..c3062b53056f 100644 --- a/drivers/ide/sis5513.c +++ b/drivers/ide/sis5513.c | |||
@@ -54,7 +54,7 @@ | |||
54 | #define DRV_NAME "sis5513" | 54 | #define DRV_NAME "sis5513" |
55 | 55 | ||
56 | /* registers layout and init values are chipset family dependent */ | 56 | /* registers layout and init values are chipset family dependent */ |
57 | 57 | #undef ATA_16 | |
58 | #define ATA_16 0x01 | 58 | #define ATA_16 0x01 |
59 | #define ATA_33 0x02 | 59 | #define ATA_33 0x02 |
60 | #define ATA_66 0x03 | 60 | #define ATA_66 0x03 |
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index 7ee1667acde4..b8c4b2ba7519 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
@@ -2320,10 +2320,10 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, | |||
2320 | SmpPassthroughReply_t *smprep; | 2320 | SmpPassthroughReply_t *smprep; |
2321 | 2321 | ||
2322 | smprep = (SmpPassthroughReply_t *)ioc->sas_mgmt.reply; | 2322 | smprep = (SmpPassthroughReply_t *)ioc->sas_mgmt.reply; |
2323 | memcpy(req->sense, smprep, sizeof(*smprep)); | 2323 | memcpy(scsi_req(req)->sense, smprep, sizeof(*smprep)); |
2324 | req->sense_len = sizeof(*smprep); | 2324 | scsi_req(req)->sense_len = sizeof(*smprep); |
2325 | req->resid_len = 0; | 2325 | scsi_req(req)->resid_len = 0; |
2326 | rsp->resid_len -= smprep->ResponseDataLength; | 2326 | scsi_req(rsp)->resid_len -= smprep->ResponseDataLength; |
2327 | } else { | 2327 | } else { |
2328 | printk(MYIOC_s_ERR_FMT | 2328 | printk(MYIOC_s_ERR_FMT |
2329 | "%s: smp passthru reply failed to be returned\n", | 2329 | "%s: smp passthru reply failed to be returned\n", |
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c index 919736a74ffa..aa76f36abe03 100644 --- a/drivers/scsi/libfc/fc_lport.c +++ b/drivers/scsi/libfc/fc_lport.c | |||
@@ -2095,7 +2095,7 @@ int fc_lport_bsg_request(struct bsg_job *job) | |||
2095 | 2095 | ||
2096 | bsg_reply->reply_payload_rcv_len = 0; | 2096 | bsg_reply->reply_payload_rcv_len = 0; |
2097 | if (rsp) | 2097 | if (rsp) |
2098 | rsp->resid_len = job->reply_payload.payload_len; | 2098 | scsi_req(rsp)->resid_len = job->reply_payload.payload_len; |
2099 | 2099 | ||
2100 | mutex_lock(&lport->lp_mutex); | 2100 | mutex_lock(&lport->lp_mutex); |
2101 | 2101 | ||
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c index 022bb6e10d98..570b2cb2da43 100644 --- a/drivers/scsi/libsas/sas_expander.c +++ b/drivers/scsi/libsas/sas_expander.c | |||
@@ -2174,12 +2174,12 @@ int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, | |||
2174 | bio_data(rsp->bio), blk_rq_bytes(rsp)); | 2174 | bio_data(rsp->bio), blk_rq_bytes(rsp)); |
2175 | if (ret > 0) { | 2175 | if (ret > 0) { |
2176 | /* positive number is the untransferred residual */ | 2176 | /* positive number is the untransferred residual */ |
2177 | rsp->resid_len = ret; | 2177 | scsi_req(rsp)->resid_len = ret; |
2178 | req->resid_len = 0; | 2178 | scsi_req(req)->resid_len = 0; |
2179 | ret = 0; | 2179 | ret = 0; |
2180 | } else if (ret == 0) { | 2180 | } else if (ret == 0) { |
2181 | rsp->resid_len = 0; | 2181 | scsi_req(rsp)->resid_len = 0; |
2182 | req->resid_len = 0; | 2182 | scsi_req(req)->resid_len = 0; |
2183 | } | 2183 | } |
2184 | 2184 | ||
2185 | return ret; | 2185 | return ret; |
diff --git a/drivers/scsi/libsas/sas_host_smp.c b/drivers/scsi/libsas/sas_host_smp.c index d24792575169..45cbbc44f4d7 100644 --- a/drivers/scsi/libsas/sas_host_smp.c +++ b/drivers/scsi/libsas/sas_host_smp.c | |||
@@ -274,15 +274,15 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, | |||
274 | 274 | ||
275 | switch (req_data[1]) { | 275 | switch (req_data[1]) { |
276 | case SMP_REPORT_GENERAL: | 276 | case SMP_REPORT_GENERAL: |
277 | req->resid_len -= 8; | 277 | scsi_req(req)->resid_len -= 8; |
278 | rsp->resid_len -= 32; | 278 | scsi_req(rsp)->resid_len -= 32; |
279 | resp_data[2] = SMP_RESP_FUNC_ACC; | 279 | resp_data[2] = SMP_RESP_FUNC_ACC; |
280 | resp_data[9] = sas_ha->num_phys; | 280 | resp_data[9] = sas_ha->num_phys; |
281 | break; | 281 | break; |
282 | 282 | ||
283 | case SMP_REPORT_MANUF_INFO: | 283 | case SMP_REPORT_MANUF_INFO: |
284 | req->resid_len -= 8; | 284 | scsi_req(req)->resid_len -= 8; |
285 | rsp->resid_len -= 64; | 285 | scsi_req(rsp)->resid_len -= 64; |
286 | resp_data[2] = SMP_RESP_FUNC_ACC; | 286 | resp_data[2] = SMP_RESP_FUNC_ACC; |
287 | memcpy(resp_data + 12, shost->hostt->name, | 287 | memcpy(resp_data + 12, shost->hostt->name, |
288 | SAS_EXPANDER_VENDOR_ID_LEN); | 288 | SAS_EXPANDER_VENDOR_ID_LEN); |
@@ -295,13 +295,13 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, | |||
295 | break; | 295 | break; |
296 | 296 | ||
297 | case SMP_DISCOVER: | 297 | case SMP_DISCOVER: |
298 | req->resid_len -= 16; | 298 | scsi_req(req)->resid_len -= 16; |
299 | if ((int)req->resid_len < 0) { | 299 | if ((int)scsi_req(req)->resid_len < 0) { |
300 | req->resid_len = 0; | 300 | scsi_req(req)->resid_len = 0; |
301 | error = -EINVAL; | 301 | error = -EINVAL; |
302 | goto out; | 302 | goto out; |
303 | } | 303 | } |
304 | rsp->resid_len -= 56; | 304 | scsi_req(rsp)->resid_len -= 56; |
305 | sas_host_smp_discover(sas_ha, resp_data, req_data[9]); | 305 | sas_host_smp_discover(sas_ha, resp_data, req_data[9]); |
306 | break; | 306 | break; |
307 | 307 | ||
@@ -311,13 +311,13 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, | |||
311 | break; | 311 | break; |
312 | 312 | ||
313 | case SMP_REPORT_PHY_SATA: | 313 | case SMP_REPORT_PHY_SATA: |
314 | req->resid_len -= 16; | 314 | scsi_req(req)->resid_len -= 16; |
315 | if ((int)req->resid_len < 0) { | 315 | if ((int)scsi_req(req)->resid_len < 0) { |
316 | req->resid_len = 0; | 316 | scsi_req(req)->resid_len = 0; |
317 | error = -EINVAL; | 317 | error = -EINVAL; |
318 | goto out; | 318 | goto out; |
319 | } | 319 | } |
320 | rsp->resid_len -= 60; | 320 | scsi_req(rsp)->resid_len -= 60; |
321 | sas_report_phy_sata(sas_ha, resp_data, req_data[9]); | 321 | sas_report_phy_sata(sas_ha, resp_data, req_data[9]); |
322 | break; | 322 | break; |
323 | 323 | ||
@@ -331,15 +331,15 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, | |||
331 | int to_write = req_data[4]; | 331 | int to_write = req_data[4]; |
332 | 332 | ||
333 | if (blk_rq_bytes(req) < base_frame_size + to_write * 4 || | 333 | if (blk_rq_bytes(req) < base_frame_size + to_write * 4 || |
334 | req->resid_len < base_frame_size + to_write * 4) { | 334 | scsi_req(req)->resid_len < base_frame_size + to_write * 4) { |
335 | resp_data[2] = SMP_RESP_INV_FRM_LEN; | 335 | resp_data[2] = SMP_RESP_INV_FRM_LEN; |
336 | break; | 336 | break; |
337 | } | 337 | } |
338 | 338 | ||
339 | to_write = sas_host_smp_write_gpio(sas_ha, resp_data, req_data[2], | 339 | to_write = sas_host_smp_write_gpio(sas_ha, resp_data, req_data[2], |
340 | req_data[3], to_write, &req_data[8]); | 340 | req_data[3], to_write, &req_data[8]); |
341 | req->resid_len -= base_frame_size + to_write * 4; | 341 | scsi_req(req)->resid_len -= base_frame_size + to_write * 4; |
342 | rsp->resid_len -= 8; | 342 | scsi_req(rsp)->resid_len -= 8; |
343 | break; | 343 | break; |
344 | } | 344 | } |
345 | 345 | ||
@@ -348,13 +348,13 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req, | |||
348 | break; | 348 | break; |
349 | 349 | ||
350 | case SMP_PHY_CONTROL: | 350 | case SMP_PHY_CONTROL: |
351 | req->resid_len -= 44; | 351 | scsi_req(req)->resid_len -= 44; |
352 | if ((int)req->resid_len < 0) { | 352 | if ((int)scsi_req(req)->resid_len < 0) { |
353 | req->resid_len = 0; | 353 | scsi_req(req)->resid_len = 0; |
354 | error = -EINVAL; | 354 | error = -EINVAL; |
355 | goto out; | 355 | goto out; |
356 | } | 356 | } |
357 | rsp->resid_len -= 8; | 357 | scsi_req(rsp)->resid_len -= 8; |
358 | sas_phy_control(sas_ha, req_data[9], req_data[10], | 358 | sas_phy_control(sas_ha, req_data[9], req_data[10], |
359 | req_data[32] >> 4, req_data[33] >> 4, | 359 | req_data[32] >> 4, req_data[33] >> 4, |
360 | resp_data); | 360 | resp_data); |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_transport.c b/drivers/scsi/mpt3sas/mpt3sas_transport.c index 7f1d5785bc30..e7a7a704a315 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_transport.c +++ b/drivers/scsi/mpt3sas/mpt3sas_transport.c | |||
@@ -2057,10 +2057,10 @@ _transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, | |||
2057 | ioc->name, __func__, | 2057 | ioc->name, __func__, |
2058 | le16_to_cpu(mpi_reply->ResponseDataLength))); | 2058 | le16_to_cpu(mpi_reply->ResponseDataLength))); |
2059 | 2059 | ||
2060 | memcpy(req->sense, mpi_reply, sizeof(*mpi_reply)); | 2060 | memcpy(scsi_req(req)->sense, mpi_reply, sizeof(*mpi_reply)); |
2061 | req->sense_len = sizeof(*mpi_reply); | 2061 | scsi_req(req)->sense_len = sizeof(*mpi_reply); |
2062 | req->resid_len = 0; | 2062 | scsi_req(req)->resid_len = 0; |
2063 | rsp->resid_len -= | 2063 | scsi_req(rsp)->resid_len -= |
2064 | le16_to_cpu(mpi_reply->ResponseDataLength); | 2064 | le16_to_cpu(mpi_reply->ResponseDataLength); |
2065 | 2065 | ||
2066 | /* check if the resp needs to be copied from the allocated | 2066 | /* check if the resp needs to be copied from the allocated |
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c index ef99f62831fb..fcb040eebf47 100644 --- a/drivers/scsi/osd/osd_initiator.c +++ b/drivers/scsi/osd/osd_initiator.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #include <scsi/osd_sense.h> | 48 | #include <scsi/osd_sense.h> |
49 | 49 | ||
50 | #include <scsi/scsi_device.h> | 50 | #include <scsi/scsi_device.h> |
51 | #include <scsi/scsi_request.h> | ||
51 | 52 | ||
52 | #include "osd_debug.h" | 53 | #include "osd_debug.h" |
53 | 54 | ||
@@ -477,11 +478,13 @@ static void _set_error_resid(struct osd_request *or, struct request *req, | |||
477 | { | 478 | { |
478 | or->async_error = error; | 479 | or->async_error = error; |
479 | or->req_errors = req->errors ? : error; | 480 | or->req_errors = req->errors ? : error; |
480 | or->sense_len = req->sense_len; | 481 | or->sense_len = scsi_req(req)->sense_len; |
482 | if (or->sense_len) | ||
483 | memcpy(or->sense, scsi_req(req)->sense, or->sense_len); | ||
481 | if (or->out.req) | 484 | if (or->out.req) |
482 | or->out.residual = or->out.req->resid_len; | 485 | or->out.residual = scsi_req(or->out.req)->resid_len; |
483 | if (or->in.req) | 486 | if (or->in.req) |
484 | or->in.residual = or->in.req->resid_len; | 487 | or->in.residual = scsi_req(or->in.req)->resid_len; |
485 | } | 488 | } |
486 | 489 | ||
487 | int osd_execute_request(struct osd_request *or) | 490 | int osd_execute_request(struct osd_request *or) |
@@ -1565,7 +1568,7 @@ static struct request *_make_request(struct request_queue *q, bool has_write, | |||
1565 | req = blk_get_request(q, has_write ? WRITE : READ, flags); | 1568 | req = blk_get_request(q, has_write ? WRITE : READ, flags); |
1566 | if (IS_ERR(req)) | 1569 | if (IS_ERR(req)) |
1567 | return req; | 1570 | return req; |
1568 | blk_rq_set_block_pc(req); | 1571 | scsi_req_init(req); |
1569 | 1572 | ||
1570 | for_each_bio(bio) { | 1573 | for_each_bio(bio) { |
1571 | struct bio *bounce_bio = bio; | 1574 | struct bio *bounce_bio = bio; |
@@ -1599,8 +1602,6 @@ static int _init_blk_request(struct osd_request *or, | |||
1599 | 1602 | ||
1600 | req->timeout = or->timeout; | 1603 | req->timeout = or->timeout; |
1601 | req->retries = or->retries; | 1604 | req->retries = or->retries; |
1602 | req->sense = or->sense; | ||
1603 | req->sense_len = 0; | ||
1604 | 1605 | ||
1605 | if (has_out) { | 1606 | if (has_out) { |
1606 | or->out.req = req; | 1607 | or->out.req = req; |
@@ -1612,7 +1613,7 @@ static int _init_blk_request(struct osd_request *or, | |||
1612 | ret = PTR_ERR(req); | 1613 | ret = PTR_ERR(req); |
1613 | goto out; | 1614 | goto out; |
1614 | } | 1615 | } |
1615 | blk_rq_set_block_pc(req); | 1616 | scsi_req_init(req); |
1616 | or->in.req = or->request->next_rq = req; | 1617 | or->in.req = or->request->next_rq = req; |
1617 | } | 1618 | } |
1618 | } else if (has_in) | 1619 | } else if (has_in) |
@@ -1699,8 +1700,8 @@ int osd_finalize_request(struct osd_request *or, | |||
1699 | 1700 | ||
1700 | osd_sec_sign_cdb(&or->cdb, cap_key); | 1701 | osd_sec_sign_cdb(&or->cdb, cap_key); |
1701 | 1702 | ||
1702 | or->request->cmd = or->cdb.buff; | 1703 | scsi_req(or->request)->cmd = or->cdb.buff; |
1703 | or->request->cmd_len = _osd_req_cdb_len(or); | 1704 | scsi_req(or->request)->cmd_len = _osd_req_cdb_len(or); |
1704 | 1705 | ||
1705 | return 0; | 1706 | return 0; |
1706 | } | 1707 | } |
diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index e8196c55b633..d314aa5c71cf 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c | |||
@@ -322,6 +322,7 @@ static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt) | |||
322 | /* Wakeup from interrupt */ | 322 | /* Wakeup from interrupt */ |
323 | static void osst_end_async(struct request *req, int update) | 323 | static void osst_end_async(struct request *req, int update) |
324 | { | 324 | { |
325 | struct scsi_request *rq = scsi_req(req); | ||
325 | struct osst_request *SRpnt = req->end_io_data; | 326 | struct osst_request *SRpnt = req->end_io_data; |
326 | struct osst_tape *STp = SRpnt->stp; | 327 | struct osst_tape *STp = SRpnt->stp; |
327 | struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data; | 328 | struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data; |
@@ -330,6 +331,8 @@ static void osst_end_async(struct request *req, int update) | |||
330 | #if DEBUG | 331 | #if DEBUG |
331 | STp->write_pending = 0; | 332 | STp->write_pending = 0; |
332 | #endif | 333 | #endif |
334 | if (rq->sense_len) | ||
335 | memcpy(SRpnt->sense, rq->sense, SCSI_SENSE_BUFFERSIZE); | ||
333 | if (SRpnt->waiting) | 336 | if (SRpnt->waiting) |
334 | complete(SRpnt->waiting); | 337 | complete(SRpnt->waiting); |
335 | 338 | ||
@@ -357,6 +360,7 @@ static int osst_execute(struct osst_request *SRpnt, const unsigned char *cmd, | |||
357 | int use_sg, int timeout, int retries) | 360 | int use_sg, int timeout, int retries) |
358 | { | 361 | { |
359 | struct request *req; | 362 | struct request *req; |
363 | struct scsi_request *rq; | ||
360 | struct page **pages = NULL; | 364 | struct page **pages = NULL; |
361 | struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data; | 365 | struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data; |
362 | 366 | ||
@@ -367,7 +371,8 @@ static int osst_execute(struct osst_request *SRpnt, const unsigned char *cmd, | |||
367 | if (IS_ERR(req)) | 371 | if (IS_ERR(req)) |
368 | return DRIVER_ERROR << 24; | 372 | return DRIVER_ERROR << 24; |
369 | 373 | ||
370 | blk_rq_set_block_pc(req); | 374 | rq = scsi_req(req); |
375 | scsi_req_init(req); | ||
371 | req->rq_flags |= RQF_QUIET; | 376 | req->rq_flags |= RQF_QUIET; |
372 | 377 | ||
373 | SRpnt->bio = NULL; | 378 | SRpnt->bio = NULL; |
@@ -404,11 +409,9 @@ static int osst_execute(struct osst_request *SRpnt, const unsigned char *cmd, | |||
404 | goto free_req; | 409 | goto free_req; |
405 | } | 410 | } |
406 | 411 | ||
407 | req->cmd_len = cmd_len; | 412 | rq->cmd_len = cmd_len; |
408 | memset(req->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */ | 413 | memset(rq->cmd, 0, BLK_MAX_CDB); /* ATAPI hates garbage after CDB */ |
409 | memcpy(req->cmd, cmd, req->cmd_len); | 414 | memcpy(rq->cmd, cmd, rq->cmd_len); |
410 | req->sense = SRpnt->sense; | ||
411 | req->sense_len = 0; | ||
412 | req->timeout = timeout; | 415 | req->timeout = timeout; |
413 | req->retries = retries; | 416 | req->retries = retries; |
414 | req->end_io_data = SRpnt; | 417 | req->end_io_data = SRpnt; |
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index 1bf8061ff803..40ca75bbcb9d 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.c +++ b/drivers/scsi/qla2xxx/qla_bsg.c | |||
@@ -921,7 +921,7 @@ qla2x00_process_loopback(struct bsg_job *bsg_job) | |||
921 | 921 | ||
922 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | 922 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + |
923 | sizeof(response) + sizeof(uint8_t); | 923 | sizeof(response) + sizeof(uint8_t); |
924 | fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | 924 | fw_sts_ptr = ((uint8_t *)scsi_req(bsg_job->req)->sense) + |
925 | sizeof(struct fc_bsg_reply); | 925 | sizeof(struct fc_bsg_reply); |
926 | memcpy(fw_sts_ptr, response, sizeof(response)); | 926 | memcpy(fw_sts_ptr, response, sizeof(response)); |
927 | fw_sts_ptr += sizeof(response); | 927 | fw_sts_ptr += sizeof(response); |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index dc88a09f9043..67e157d81da8 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -1468,7 +1468,8 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1468 | type, sp->handle, comp_status, fw_status[1], fw_status[2], | 1468 | type, sp->handle, comp_status, fw_status[1], fw_status[2], |
1469 | le16_to_cpu(((struct els_sts_entry_24xx *) | 1469 | le16_to_cpu(((struct els_sts_entry_24xx *) |
1470 | pkt)->total_byte_count)); | 1470 | pkt)->total_byte_count)); |
1471 | fw_sts_ptr = ((uint8_t*)bsg_job->req->sense) + sizeof(struct fc_bsg_reply); | 1471 | fw_sts_ptr = ((uint8_t*)scsi_req(bsg_job->req)->sense) + |
1472 | sizeof(struct fc_bsg_reply); | ||
1472 | memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); | 1473 | memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); |
1473 | } | 1474 | } |
1474 | else { | 1475 | else { |
@@ -1482,7 +1483,8 @@ qla24xx_els_ct_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
1482 | pkt)->error_subcode_2)); | 1483 | pkt)->error_subcode_2)); |
1483 | res = DID_ERROR << 16; | 1484 | res = DID_ERROR << 16; |
1484 | bsg_reply->reply_payload_rcv_len = 0; | 1485 | bsg_reply->reply_payload_rcv_len = 0; |
1485 | fw_sts_ptr = ((uint8_t*)bsg_job->req->sense) + sizeof(struct fc_bsg_reply); | 1486 | fw_sts_ptr = ((uint8_t*)scsi_req(bsg_job->req)->sense) + |
1487 | sizeof(struct fc_bsg_reply); | ||
1486 | memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); | 1488 | memcpy( fw_sts_ptr, fw_status, sizeof(fw_status)); |
1487 | } | 1489 | } |
1488 | ql_dump_buffer(ql_dbg_user + ql_dbg_buffer, vha, 0x5056, | 1490 | ql_dump_buffer(ql_dbg_user + ql_dbg_buffer, vha, 0x5056, |
diff --git a/drivers/scsi/qla2xxx/qla_mr.c b/drivers/scsi/qla2xxx/qla_mr.c index 02f1de18bc2b..96c33e292eba 100644 --- a/drivers/scsi/qla2xxx/qla_mr.c +++ b/drivers/scsi/qla2xxx/qla_mr.c | |||
@@ -2244,7 +2244,7 @@ qlafx00_ioctl_iosb_entry(scsi_qla_host_t *vha, struct req_que *req, | |||
2244 | memcpy(fstatus.reserved_3, | 2244 | memcpy(fstatus.reserved_3, |
2245 | pkt->reserved_2, 20 * sizeof(uint8_t)); | 2245 | pkt->reserved_2, 20 * sizeof(uint8_t)); |
2246 | 2246 | ||
2247 | fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | 2247 | fw_sts_ptr = ((uint8_t *)scsi_req(bsg_job->req)->sense) + |
2248 | sizeof(struct fc_bsg_reply); | 2248 | sizeof(struct fc_bsg_reply); |
2249 | 2249 | ||
2250 | memcpy(fw_sts_ptr, (uint8_t *)&fstatus, | 2250 | memcpy(fw_sts_ptr, (uint8_t *)&fstatus, |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 7c084600827b..4b40f746d534 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -1968,6 +1968,7 @@ static void eh_lock_door_done(struct request *req, int uptodate) | |||
1968 | static void scsi_eh_lock_door(struct scsi_device *sdev) | 1968 | static void scsi_eh_lock_door(struct scsi_device *sdev) |
1969 | { | 1969 | { |
1970 | struct request *req; | 1970 | struct request *req; |
1971 | struct scsi_request *rq; | ||
1971 | 1972 | ||
1972 | /* | 1973 | /* |
1973 | * blk_get_request with GFP_KERNEL (__GFP_RECLAIM) sleeps until a | 1974 | * blk_get_request with GFP_KERNEL (__GFP_RECLAIM) sleeps until a |
@@ -1976,17 +1977,16 @@ static void scsi_eh_lock_door(struct scsi_device *sdev) | |||
1976 | req = blk_get_request(sdev->request_queue, READ, GFP_KERNEL); | 1977 | req = blk_get_request(sdev->request_queue, READ, GFP_KERNEL); |
1977 | if (IS_ERR(req)) | 1978 | if (IS_ERR(req)) |
1978 | return; | 1979 | return; |
1980 | rq = scsi_req(req); | ||
1981 | scsi_req_init(req); | ||
1979 | 1982 | ||
1980 | blk_rq_set_block_pc(req); | 1983 | rq->cmd[0] = ALLOW_MEDIUM_REMOVAL; |
1981 | 1984 | rq->cmd[1] = 0; | |
1982 | req->cmd[0] = ALLOW_MEDIUM_REMOVAL; | 1985 | rq->cmd[2] = 0; |
1983 | req->cmd[1] = 0; | 1986 | rq->cmd[3] = 0; |
1984 | req->cmd[2] = 0; | 1987 | rq->cmd[4] = SCSI_REMOVAL_PREVENT; |
1985 | req->cmd[3] = 0; | 1988 | rq->cmd[5] = 0; |
1986 | req->cmd[4] = SCSI_REMOVAL_PREVENT; | 1989 | rq->cmd_len = COMMAND_SIZE(rq->cmd[0]); |
1987 | req->cmd[5] = 0; | ||
1988 | |||
1989 | req->cmd_len = COMMAND_SIZE(req->cmd[0]); | ||
1990 | 1990 | ||
1991 | req->rq_flags |= RQF_QUIET; | 1991 | req->rq_flags |= RQF_QUIET; |
1992 | req->timeout = 10 * HZ; | 1992 | req->timeout = 10 * HZ; |
@@ -2355,7 +2355,7 @@ scsi_ioctl_reset(struct scsi_device *dev, int __user *arg) | |||
2355 | scmd = (struct scsi_cmnd *)(rq + 1); | 2355 | scmd = (struct scsi_cmnd *)(rq + 1); |
2356 | scsi_init_command(dev, scmd); | 2356 | scsi_init_command(dev, scmd); |
2357 | scmd->request = rq; | 2357 | scmd->request = rq; |
2358 | scmd->cmnd = rq->cmd; | 2358 | scmd->cmnd = scsi_req(rq)->cmd; |
2359 | 2359 | ||
2360 | scmd->scsi_done = scsi_reset_provider_done_command; | 2360 | scmd->scsi_done = scsi_reset_provider_done_command; |
2361 | memset(&scmd->sdb, 0, sizeof(scmd->sdb)); | 2361 | memset(&scmd->sdb, 0, sizeof(scmd->sdb)); |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 81ff5ad23b83..8188e5c71f75 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -220,21 +220,21 @@ static int __scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, | |||
220 | { | 220 | { |
221 | struct request *req; | 221 | struct request *req; |
222 | int write = (data_direction == DMA_TO_DEVICE); | 222 | int write = (data_direction == DMA_TO_DEVICE); |
223 | struct scsi_request *rq; | ||
223 | int ret = DRIVER_ERROR << 24; | 224 | int ret = DRIVER_ERROR << 24; |
224 | 225 | ||
225 | req = blk_get_request(sdev->request_queue, write, __GFP_RECLAIM); | 226 | req = blk_get_request(sdev->request_queue, write, __GFP_RECLAIM); |
226 | if (IS_ERR(req)) | 227 | if (IS_ERR(req)) |
227 | return ret; | 228 | return ret; |
228 | blk_rq_set_block_pc(req); | 229 | rq = scsi_req(req); |
230 | scsi_req_init(req); | ||
229 | 231 | ||
230 | if (bufflen && blk_rq_map_kern(sdev->request_queue, req, | 232 | if (bufflen && blk_rq_map_kern(sdev->request_queue, req, |
231 | buffer, bufflen, __GFP_RECLAIM)) | 233 | buffer, bufflen, __GFP_RECLAIM)) |
232 | goto out; | 234 | goto out; |
233 | 235 | ||
234 | req->cmd_len = COMMAND_SIZE(cmd[0]); | 236 | rq->cmd_len = COMMAND_SIZE(cmd[0]); |
235 | memcpy(req->cmd, cmd, req->cmd_len); | 237 | memcpy(rq->cmd, cmd, rq->cmd_len); |
236 | req->sense = sense; | ||
237 | req->sense_len = 0; | ||
238 | req->retries = retries; | 238 | req->retries = retries; |
239 | req->timeout = timeout; | 239 | req->timeout = timeout; |
240 | req->cmd_flags |= flags; | 240 | req->cmd_flags |= flags; |
@@ -251,11 +251,13 @@ static int __scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, | |||
251 | * is invalid. Prevent the garbage from being misinterpreted | 251 | * is invalid. Prevent the garbage from being misinterpreted |
252 | * and prevent security leaks by zeroing out the excess data. | 252 | * and prevent security leaks by zeroing out the excess data. |
253 | */ | 253 | */ |
254 | if (unlikely(req->resid_len > 0 && req->resid_len <= bufflen)) | 254 | if (unlikely(rq->resid_len > 0 && rq->resid_len <= bufflen)) |
255 | memset(buffer + (bufflen - req->resid_len), 0, req->resid_len); | 255 | memset(buffer + (bufflen - rq->resid_len), 0, rq->resid_len); |
256 | 256 | ||
257 | if (resid) | 257 | if (resid) |
258 | *resid = req->resid_len; | 258 | *resid = rq->resid_len; |
259 | if (sense && rq->sense_len) | ||
260 | memcpy(sense, rq->sense, SCSI_SENSE_BUFFERSIZE); | ||
259 | ret = req->errors; | 261 | ret = req->errors; |
260 | out: | 262 | out: |
261 | blk_put_request(req); | 263 | blk_put_request(req); |
@@ -806,16 +808,13 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
806 | 808 | ||
807 | if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */ | 809 | if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */ |
808 | if (result) { | 810 | if (result) { |
809 | if (sense_valid && req->sense) { | 811 | if (sense_valid) { |
810 | /* | 812 | /* |
811 | * SG_IO wants current and deferred errors | 813 | * SG_IO wants current and deferred errors |
812 | */ | 814 | */ |
813 | int len = 8 + cmd->sense_buffer[7]; | 815 | scsi_req(req)->sense_len = |
814 | 816 | min(8 + cmd->sense_buffer[7], | |
815 | if (len > SCSI_SENSE_BUFFERSIZE) | 817 | SCSI_SENSE_BUFFERSIZE); |
816 | len = SCSI_SENSE_BUFFERSIZE; | ||
817 | memcpy(req->sense, cmd->sense_buffer, len); | ||
818 | req->sense_len = len; | ||
819 | } | 818 | } |
820 | if (!sense_deferred) | 819 | if (!sense_deferred) |
821 | error = __scsi_error_from_host_byte(cmd, result); | 820 | error = __scsi_error_from_host_byte(cmd, result); |
@@ -825,14 +824,14 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
825 | */ | 824 | */ |
826 | req->errors = cmd->result; | 825 | req->errors = cmd->result; |
827 | 826 | ||
828 | req->resid_len = scsi_get_resid(cmd); | 827 | scsi_req(req)->resid_len = scsi_get_resid(cmd); |
829 | 828 | ||
830 | if (scsi_bidi_cmnd(cmd)) { | 829 | if (scsi_bidi_cmnd(cmd)) { |
831 | /* | 830 | /* |
832 | * Bidi commands Must be complete as a whole, | 831 | * Bidi commands Must be complete as a whole, |
833 | * both sides at once. | 832 | * both sides at once. |
834 | */ | 833 | */ |
835 | req->next_rq->resid_len = scsi_in(cmd)->resid; | 834 | scsi_req(req->next_rq)->resid_len = scsi_in(cmd)->resid; |
836 | if (scsi_end_request(req, 0, blk_rq_bytes(req), | 835 | if (scsi_end_request(req, 0, blk_rq_bytes(req), |
837 | blk_rq_bytes(req->next_rq))) | 836 | blk_rq_bytes(req->next_rq))) |
838 | BUG(); | 837 | BUG(); |
@@ -1165,7 +1164,10 @@ void scsi_init_command(struct scsi_device *dev, struct scsi_cmnd *cmd) | |||
1165 | void *prot = cmd->prot_sdb; | 1164 | void *prot = cmd->prot_sdb; |
1166 | unsigned long flags; | 1165 | unsigned long flags; |
1167 | 1166 | ||
1168 | memset(cmd, 0, sizeof(*cmd)); | 1167 | /* zero out the cmd, except for the embedded scsi_request */ |
1168 | memset((char *)cmd + sizeof(cmd->req), 0, | ||
1169 | sizeof(*cmd) - sizeof(cmd->req)); | ||
1170 | |||
1169 | cmd->device = dev; | 1171 | cmd->device = dev; |
1170 | cmd->sense_buffer = buf; | 1172 | cmd->sense_buffer = buf; |
1171 | cmd->prot_sdb = prot; | 1173 | cmd->prot_sdb = prot; |
@@ -1197,7 +1199,8 @@ static int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req) | |||
1197 | memset(&cmd->sdb, 0, sizeof(cmd->sdb)); | 1199 | memset(&cmd->sdb, 0, sizeof(cmd->sdb)); |
1198 | } | 1200 | } |
1199 | 1201 | ||
1200 | cmd->cmd_len = req->cmd_len; | 1202 | cmd->cmd_len = scsi_req(req)->cmd_len; |
1203 | cmd->cmnd = scsi_req(req)->cmd; | ||
1201 | cmd->transfersize = blk_rq_bytes(req); | 1204 | cmd->transfersize = blk_rq_bytes(req); |
1202 | cmd->allowed = req->retries; | 1205 | cmd->allowed = req->retries; |
1203 | return BLKPREP_OK; | 1206 | return BLKPREP_OK; |
@@ -1217,6 +1220,7 @@ static int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req) | |||
1217 | return ret; | 1220 | return ret; |
1218 | } | 1221 | } |
1219 | 1222 | ||
1223 | cmd->cmnd = scsi_req(req)->cmd = scsi_req(req)->__cmd; | ||
1220 | memset(cmd->cmnd, 0, BLK_MAX_CDB); | 1224 | memset(cmd->cmnd, 0, BLK_MAX_CDB); |
1221 | return scsi_cmd_to_driver(cmd)->init_command(cmd); | 1225 | return scsi_cmd_to_driver(cmd)->init_command(cmd); |
1222 | } | 1226 | } |
@@ -1355,7 +1359,6 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) | |||
1355 | 1359 | ||
1356 | cmd->tag = req->tag; | 1360 | cmd->tag = req->tag; |
1357 | cmd->request = req; | 1361 | cmd->request = req; |
1358 | cmd->cmnd = req->cmd; | ||
1359 | cmd->prot_op = SCSI_PROT_NORMAL; | 1362 | cmd->prot_op = SCSI_PROT_NORMAL; |
1360 | 1363 | ||
1361 | ret = scsi_setup_cmnd(sdev, req); | 1364 | ret = scsi_setup_cmnd(sdev, req); |
@@ -1874,7 +1877,9 @@ static int scsi_mq_prep_fn(struct request *req) | |||
1874 | unsigned char *sense_buf = cmd->sense_buffer; | 1877 | unsigned char *sense_buf = cmd->sense_buffer; |
1875 | struct scatterlist *sg; | 1878 | struct scatterlist *sg; |
1876 | 1879 | ||
1877 | memset(cmd, 0, sizeof(struct scsi_cmnd)); | 1880 | /* zero out the cmd, except for the embedded scsi_request */ |
1881 | memset((char *)cmd + sizeof(cmd->req), 0, | ||
1882 | sizeof(*cmd) - sizeof(cmd->req)); | ||
1878 | 1883 | ||
1879 | req->special = cmd; | 1884 | req->special = cmd; |
1880 | 1885 | ||
@@ -1884,7 +1889,6 @@ static int scsi_mq_prep_fn(struct request *req) | |||
1884 | 1889 | ||
1885 | cmd->tag = req->tag; | 1890 | cmd->tag = req->tag; |
1886 | 1891 | ||
1887 | cmd->cmnd = req->cmd; | ||
1888 | cmd->prot_op = SCSI_PROT_NORMAL; | 1892 | cmd->prot_op = SCSI_PROT_NORMAL; |
1889 | 1893 | ||
1890 | INIT_LIST_HEAD(&cmd->list); | 1894 | INIT_LIST_HEAD(&cmd->list); |
@@ -1959,7 +1963,6 @@ static int scsi_queue_rq(struct blk_mq_hw_ctx *hctx, | |||
1959 | if (!scsi_host_queue_ready(q, shost, sdev)) | 1963 | if (!scsi_host_queue_ready(q, shost, sdev)) |
1960 | goto out_dec_target_busy; | 1964 | goto out_dec_target_busy; |
1961 | 1965 | ||
1962 | |||
1963 | if (!(req->rq_flags & RQF_DONTPREP)) { | 1966 | if (!(req->rq_flags & RQF_DONTPREP)) { |
1964 | ret = prep_to_mq(scsi_mq_prep_fn(req)); | 1967 | ret = prep_to_mq(scsi_mq_prep_fn(req)); |
1965 | if (ret != BLK_MQ_RQ_QUEUE_OK) | 1968 | if (ret != BLK_MQ_RQ_QUEUE_OK) |
@@ -2036,6 +2039,7 @@ static int scsi_init_request(void *data, struct request *rq, | |||
2036 | scsi_alloc_sense_buffer(shost, GFP_KERNEL, numa_node); | 2039 | scsi_alloc_sense_buffer(shost, GFP_KERNEL, numa_node); |
2037 | if (!cmd->sense_buffer) | 2040 | if (!cmd->sense_buffer) |
2038 | return -ENOMEM; | 2041 | return -ENOMEM; |
2042 | cmd->req.sense = cmd->sense_buffer; | ||
2039 | return 0; | 2043 | return 0; |
2040 | } | 2044 | } |
2041 | 2045 | ||
@@ -2125,6 +2129,7 @@ static int scsi_init_rq(struct request_queue *q, struct request *rq, gfp_t gfp) | |||
2125 | cmd->sense_buffer = scsi_alloc_sense_buffer(shost, gfp, NUMA_NO_NODE); | 2129 | cmd->sense_buffer = scsi_alloc_sense_buffer(shost, gfp, NUMA_NO_NODE); |
2126 | if (!cmd->sense_buffer) | 2130 | if (!cmd->sense_buffer) |
2127 | goto fail; | 2131 | goto fail; |
2132 | cmd->req.sense = cmd->sense_buffer; | ||
2128 | 2133 | ||
2129 | if (scsi_host_get_prot(shost) >= SHOST_DIX_TYPE0_PROTECTION) { | 2134 | if (scsi_host_get_prot(shost) >= SHOST_DIX_TYPE0_PROTECTION) { |
2130 | cmd->prot_sdb = kmem_cache_zalloc(scsi_sdb_cache, gfp); | 2135 | cmd->prot_sdb = kmem_cache_zalloc(scsi_sdb_cache, gfp); |
diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index 60b651bfaa01..126a5ee00987 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/bsg.h> | 33 | #include <linux/bsg.h> |
34 | 34 | ||
35 | #include <scsi/scsi.h> | 35 | #include <scsi/scsi.h> |
36 | #include <scsi/scsi_request.h> | ||
36 | #include <scsi/scsi_device.h> | 37 | #include <scsi/scsi_device.h> |
37 | #include <scsi/scsi_host.h> | 38 | #include <scsi/scsi_host.h> |
38 | #include <scsi/scsi_transport.h> | 39 | #include <scsi/scsi_transport.h> |
@@ -177,6 +178,10 @@ static void sas_smp_request(struct request_queue *q, struct Scsi_Host *shost, | |||
177 | while ((req = blk_fetch_request(q)) != NULL) { | 178 | while ((req = blk_fetch_request(q)) != NULL) { |
178 | spin_unlock_irq(q->queue_lock); | 179 | spin_unlock_irq(q->queue_lock); |
179 | 180 | ||
181 | scsi_req(req)->resid_len = blk_rq_bytes(req); | ||
182 | if (req->next_rq) | ||
183 | scsi_req(req->next_rq)->resid_len = | ||
184 | blk_rq_bytes(req->next_rq); | ||
180 | handler = to_sas_internal(shost->transportt)->f->smp_handler; | 185 | handler = to_sas_internal(shost->transportt)->f->smp_handler; |
181 | ret = handler(shost, rphy, req); | 186 | ret = handler(shost, rphy, req); |
182 | req->errors = ret; | 187 | req->errors = ret; |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 0b09638fa39b..c779986edb43 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -781,7 +781,7 @@ static int sd_setup_discard_cmnd(struct scsi_cmnd *cmd) | |||
781 | rq->special_vec.bv_len = len; | 781 | rq->special_vec.bv_len = len; |
782 | 782 | ||
783 | rq->rq_flags |= RQF_SPECIAL_PAYLOAD; | 783 | rq->rq_flags |= RQF_SPECIAL_PAYLOAD; |
784 | rq->resid_len = len; | 784 | scsi_req(rq)->resid_len = len; |
785 | 785 | ||
786 | ret = scsi_init_io(cmd); | 786 | ret = scsi_init_io(cmd); |
787 | out: | 787 | out: |
@@ -1164,7 +1164,7 @@ static void sd_uninit_command(struct scsi_cmnd *SCpnt) | |||
1164 | if (rq->rq_flags & RQF_SPECIAL_PAYLOAD) | 1164 | if (rq->rq_flags & RQF_SPECIAL_PAYLOAD) |
1165 | __free_page(rq->special_vec.bv_page); | 1165 | __free_page(rq->special_vec.bv_page); |
1166 | 1166 | ||
1167 | if (SCpnt->cmnd != rq->cmd) { | 1167 | if (SCpnt->cmnd != scsi_req(rq)->cmd) { |
1168 | mempool_free(SCpnt->cmnd, sd_cdb_pool); | 1168 | mempool_free(SCpnt->cmnd, sd_cdb_pool); |
1169 | SCpnt->cmnd = NULL; | 1169 | SCpnt->cmnd = NULL; |
1170 | SCpnt->cmd_len = 0; | 1170 | SCpnt->cmd_len = 0; |
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index dbe5b4b95df0..226a8def7a8b 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
@@ -781,9 +781,7 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, | |||
781 | } | 781 | } |
782 | if (atomic_read(&sdp->detaching)) { | 782 | if (atomic_read(&sdp->detaching)) { |
783 | if (srp->bio) { | 783 | if (srp->bio) { |
784 | if (srp->rq->cmd != srp->rq->__cmd) | 784 | scsi_req_free_cmd(scsi_req(srp->rq)); |
785 | kfree(srp->rq->cmd); | ||
786 | |||
787 | blk_end_request_all(srp->rq, -EIO); | 785 | blk_end_request_all(srp->rq, -EIO); |
788 | srp->rq = NULL; | 786 | srp->rq = NULL; |
789 | } | 787 | } |
@@ -1279,6 +1277,7 @@ static void | |||
1279 | sg_rq_end_io(struct request *rq, int uptodate) | 1277 | sg_rq_end_io(struct request *rq, int uptodate) |
1280 | { | 1278 | { |
1281 | struct sg_request *srp = rq->end_io_data; | 1279 | struct sg_request *srp = rq->end_io_data; |
1280 | struct scsi_request *req = scsi_req(rq); | ||
1282 | Sg_device *sdp; | 1281 | Sg_device *sdp; |
1283 | Sg_fd *sfp; | 1282 | Sg_fd *sfp; |
1284 | unsigned long iflags; | 1283 | unsigned long iflags; |
@@ -1297,9 +1296,9 @@ sg_rq_end_io(struct request *rq, int uptodate) | |||
1297 | if (unlikely(atomic_read(&sdp->detaching))) | 1296 | if (unlikely(atomic_read(&sdp->detaching))) |
1298 | pr_info("%s: device detaching\n", __func__); | 1297 | pr_info("%s: device detaching\n", __func__); |
1299 | 1298 | ||
1300 | sense = rq->sense; | 1299 | sense = req->sense; |
1301 | result = rq->errors; | 1300 | result = rq->errors; |
1302 | resid = rq->resid_len; | 1301 | resid = req->resid_len; |
1303 | 1302 | ||
1304 | SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sdp, | 1303 | SCSI_LOG_TIMEOUT(4, sg_printk(KERN_INFO, sdp, |
1305 | "sg_cmd_done: pack_id=%d, res=0x%x\n", | 1304 | "sg_cmd_done: pack_id=%d, res=0x%x\n", |
@@ -1333,6 +1332,10 @@ sg_rq_end_io(struct request *rq, int uptodate) | |||
1333 | sdp->device->changed = 1; | 1332 | sdp->device->changed = 1; |
1334 | } | 1333 | } |
1335 | } | 1334 | } |
1335 | |||
1336 | if (req->sense_len) | ||
1337 | memcpy(srp->sense_b, req->sense, SCSI_SENSE_BUFFERSIZE); | ||
1338 | |||
1336 | /* Rely on write phase to clean out srp status values, so no "else" */ | 1339 | /* Rely on write phase to clean out srp status values, so no "else" */ |
1337 | 1340 | ||
1338 | /* | 1341 | /* |
@@ -1342,8 +1345,7 @@ sg_rq_end_io(struct request *rq, int uptodate) | |||
1342 | * blk_rq_unmap_user() can be called from user context. | 1345 | * blk_rq_unmap_user() can be called from user context. |
1343 | */ | 1346 | */ |
1344 | srp->rq = NULL; | 1347 | srp->rq = NULL; |
1345 | if (rq->cmd != rq->__cmd) | 1348 | scsi_req_free_cmd(scsi_req(rq)); |
1346 | kfree(rq->cmd); | ||
1347 | __blk_put_request(rq->q, rq); | 1349 | __blk_put_request(rq->q, rq); |
1348 | 1350 | ||
1349 | write_lock_irqsave(&sfp->rq_list_lock, iflags); | 1351 | write_lock_irqsave(&sfp->rq_list_lock, iflags); |
@@ -1658,6 +1660,7 @@ sg_start_req(Sg_request *srp, unsigned char *cmd) | |||
1658 | { | 1660 | { |
1659 | int res; | 1661 | int res; |
1660 | struct request *rq; | 1662 | struct request *rq; |
1663 | struct scsi_request *req; | ||
1661 | Sg_fd *sfp = srp->parentfp; | 1664 | Sg_fd *sfp = srp->parentfp; |
1662 | sg_io_hdr_t *hp = &srp->header; | 1665 | sg_io_hdr_t *hp = &srp->header; |
1663 | int dxfer_len = (int) hp->dxfer_len; | 1666 | int dxfer_len = (int) hp->dxfer_len; |
@@ -1700,17 +1703,17 @@ sg_start_req(Sg_request *srp, unsigned char *cmd) | |||
1700 | kfree(long_cmdp); | 1703 | kfree(long_cmdp); |
1701 | return PTR_ERR(rq); | 1704 | return PTR_ERR(rq); |
1702 | } | 1705 | } |
1706 | req = scsi_req(rq); | ||
1703 | 1707 | ||
1704 | blk_rq_set_block_pc(rq); | 1708 | scsi_req_init(rq); |
1705 | 1709 | ||
1706 | if (hp->cmd_len > BLK_MAX_CDB) | 1710 | if (hp->cmd_len > BLK_MAX_CDB) |
1707 | rq->cmd = long_cmdp; | 1711 | req->cmd = long_cmdp; |
1708 | memcpy(rq->cmd, cmd, hp->cmd_len); | 1712 | memcpy(req->cmd, cmd, hp->cmd_len); |
1709 | rq->cmd_len = hp->cmd_len; | 1713 | req->cmd_len = hp->cmd_len; |
1710 | 1714 | ||
1711 | srp->rq = rq; | 1715 | srp->rq = rq; |
1712 | rq->end_io_data = srp; | 1716 | rq->end_io_data = srp; |
1713 | rq->sense = srp->sense_b; | ||
1714 | rq->retries = SG_DEFAULT_RETRIES; | 1717 | rq->retries = SG_DEFAULT_RETRIES; |
1715 | 1718 | ||
1716 | if ((dxfer_len <= 0) || (dxfer_dir == SG_DXFER_NONE)) | 1719 | if ((dxfer_len <= 0) || (dxfer_dir == SG_DXFER_NONE)) |
@@ -1786,8 +1789,7 @@ sg_finish_rem_req(Sg_request *srp) | |||
1786 | ret = blk_rq_unmap_user(srp->bio); | 1789 | ret = blk_rq_unmap_user(srp->bio); |
1787 | 1790 | ||
1788 | if (srp->rq) { | 1791 | if (srp->rq) { |
1789 | if (srp->rq->cmd != srp->rq->__cmd) | 1792 | scsi_req_free_cmd(scsi_req(srp->rq)); |
1790 | kfree(srp->rq->cmd); | ||
1791 | blk_put_request(srp->rq); | 1793 | blk_put_request(srp->rq); |
1792 | } | 1794 | } |
1793 | 1795 | ||
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 5f35b863e1a7..4af900100a24 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c | |||
@@ -475,7 +475,7 @@ static void st_do_stats(struct scsi_tape *STp, struct request *req) | |||
475 | ktime_t now; | 475 | ktime_t now; |
476 | 476 | ||
477 | now = ktime_get(); | 477 | now = ktime_get(); |
478 | if (req->cmd[0] == WRITE_6) { | 478 | if (scsi_req(req)->cmd[0] == WRITE_6) { |
479 | now = ktime_sub(now, STp->stats->write_time); | 479 | now = ktime_sub(now, STp->stats->write_time); |
480 | atomic64_add(ktime_to_ns(now), &STp->stats->tot_write_time); | 480 | atomic64_add(ktime_to_ns(now), &STp->stats->tot_write_time); |
481 | atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); | 481 | atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); |
@@ -489,7 +489,7 @@ static void st_do_stats(struct scsi_tape *STp, struct request *req) | |||
489 | } else | 489 | } else |
490 | atomic64_add(atomic_read(&STp->stats->last_write_size), | 490 | atomic64_add(atomic_read(&STp->stats->last_write_size), |
491 | &STp->stats->write_byte_cnt); | 491 | &STp->stats->write_byte_cnt); |
492 | } else if (req->cmd[0] == READ_6) { | 492 | } else if (scsi_req(req)->cmd[0] == READ_6) { |
493 | now = ktime_sub(now, STp->stats->read_time); | 493 | now = ktime_sub(now, STp->stats->read_time); |
494 | atomic64_add(ktime_to_ns(now), &STp->stats->tot_read_time); | 494 | atomic64_add(ktime_to_ns(now), &STp->stats->tot_read_time); |
495 | atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); | 495 | atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); |
@@ -514,15 +514,18 @@ static void st_do_stats(struct scsi_tape *STp, struct request *req) | |||
514 | static void st_scsi_execute_end(struct request *req, int uptodate) | 514 | static void st_scsi_execute_end(struct request *req, int uptodate) |
515 | { | 515 | { |
516 | struct st_request *SRpnt = req->end_io_data; | 516 | struct st_request *SRpnt = req->end_io_data; |
517 | struct scsi_request *rq = scsi_req(req); | ||
517 | struct scsi_tape *STp = SRpnt->stp; | 518 | struct scsi_tape *STp = SRpnt->stp; |
518 | struct bio *tmp; | 519 | struct bio *tmp; |
519 | 520 | ||
520 | STp->buffer->cmdstat.midlevel_result = SRpnt->result = req->errors; | 521 | STp->buffer->cmdstat.midlevel_result = SRpnt->result = req->errors; |
521 | STp->buffer->cmdstat.residual = req->resid_len; | 522 | STp->buffer->cmdstat.residual = rq->resid_len; |
522 | 523 | ||
523 | st_do_stats(STp, req); | 524 | st_do_stats(STp, req); |
524 | 525 | ||
525 | tmp = SRpnt->bio; | 526 | tmp = SRpnt->bio; |
527 | if (rq->sense_len) | ||
528 | memcpy(SRpnt->sense, rq->sense, SCSI_SENSE_BUFFERSIZE); | ||
526 | if (SRpnt->waiting) | 529 | if (SRpnt->waiting) |
527 | complete(SRpnt->waiting); | 530 | complete(SRpnt->waiting); |
528 | 531 | ||
@@ -535,6 +538,7 @@ static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd, | |||
535 | int timeout, int retries) | 538 | int timeout, int retries) |
536 | { | 539 | { |
537 | struct request *req; | 540 | struct request *req; |
541 | struct scsi_request *rq; | ||
538 | struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data; | 542 | struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data; |
539 | int err = 0; | 543 | int err = 0; |
540 | int write = (data_direction == DMA_TO_DEVICE); | 544 | int write = (data_direction == DMA_TO_DEVICE); |
@@ -544,8 +548,8 @@ static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd, | |||
544 | GFP_KERNEL); | 548 | GFP_KERNEL); |
545 | if (IS_ERR(req)) | 549 | if (IS_ERR(req)) |
546 | return DRIVER_ERROR << 24; | 550 | return DRIVER_ERROR << 24; |
547 | 551 | rq = scsi_req(req); | |
548 | blk_rq_set_block_pc(req); | 552 | scsi_req_init(req); |
549 | req->rq_flags |= RQF_QUIET; | 553 | req->rq_flags |= RQF_QUIET; |
550 | 554 | ||
551 | mdata->null_mapped = 1; | 555 | mdata->null_mapped = 1; |
@@ -571,11 +575,9 @@ static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd, | |||
571 | } | 575 | } |
572 | 576 | ||
573 | SRpnt->bio = req->bio; | 577 | SRpnt->bio = req->bio; |
574 | req->cmd_len = COMMAND_SIZE(cmd[0]); | 578 | rq->cmd_len = COMMAND_SIZE(cmd[0]); |
575 | memset(req->cmd, 0, BLK_MAX_CDB); | 579 | memset(rq->cmd, 0, BLK_MAX_CDB); |
576 | memcpy(req->cmd, cmd, req->cmd_len); | 580 | memcpy(rq->cmd, cmd, rq->cmd_len); |
577 | req->sense = SRpnt->sense; | ||
578 | req->sense_len = 0; | ||
579 | req->timeout = timeout; | 581 | req->timeout = timeout; |
580 | req->retries = retries; | 582 | req->retries = retries; |
581 | req->end_io_data = SRpnt; | 583 | req->end_io_data = SRpnt; |
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index 04d7aa7390d0..e52f4e1a4675 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c | |||
@@ -1013,7 +1013,7 @@ pscsi_execute_cmd(struct se_cmd *cmd) | |||
1013 | goto fail; | 1013 | goto fail; |
1014 | } | 1014 | } |
1015 | 1015 | ||
1016 | blk_rq_set_block_pc(req); | 1016 | scsi_req_init(req); |
1017 | 1017 | ||
1018 | if (sgl) { | 1018 | if (sgl) { |
1019 | ret = pscsi_map_sg(cmd, sgl, sgl_nents, req); | 1019 | ret = pscsi_map_sg(cmd, sgl, sgl_nents, req); |
@@ -1023,10 +1023,8 @@ pscsi_execute_cmd(struct se_cmd *cmd) | |||
1023 | 1023 | ||
1024 | req->end_io = pscsi_req_done; | 1024 | req->end_io = pscsi_req_done; |
1025 | req->end_io_data = cmd; | 1025 | req->end_io_data = cmd; |
1026 | req->cmd_len = scsi_command_size(pt->pscsi_cdb); | 1026 | scsi_req(req)->cmd_len = scsi_command_size(pt->pscsi_cdb); |
1027 | req->cmd = &pt->pscsi_cdb[0]; | 1027 | scsi_req(req)->cmd = &pt->pscsi_cdb[0]; |
1028 | req->sense = &pt->pscsi_sense[0]; | ||
1029 | req->sense_len = 0; | ||
1030 | if (pdv->pdv_sd->type == TYPE_DISK) | 1028 | if (pdv->pdv_sd->type == TYPE_DISK) |
1031 | req->timeout = PS_TIMEOUT_DISK; | 1029 | req->timeout = PS_TIMEOUT_DISK; |
1032 | else | 1030 | else |
@@ -1075,7 +1073,7 @@ static void pscsi_req_done(struct request *req, int uptodate) | |||
1075 | struct pscsi_plugin_task *pt = cmd->priv; | 1073 | struct pscsi_plugin_task *pt = cmd->priv; |
1076 | 1074 | ||
1077 | pt->pscsi_result = req->errors; | 1075 | pt->pscsi_result = req->errors; |
1078 | pt->pscsi_resid = req->resid_len; | 1076 | pt->pscsi_resid = scsi_req(req)->resid_len; |
1079 | 1077 | ||
1080 | cmd->scsi_status = status_byte(pt->pscsi_result) << 1; | 1078 | cmd->scsi_status = status_byte(pt->pscsi_result) << 1; |
1081 | if (cmd->scsi_status) { | 1079 | if (cmd->scsi_status) { |
@@ -1096,6 +1094,7 @@ static void pscsi_req_done(struct request *req, int uptodate) | |||
1096 | break; | 1094 | break; |
1097 | } | 1095 | } |
1098 | 1096 | ||
1097 | memcpy(pt->pscsi_sense, scsi_req(req)->sense, TRANSPORT_SENSE_BUFFER); | ||
1099 | __blk_put_request(req->q, req); | 1098 | __blk_put_request(req->q, req); |
1100 | kfree(pt); | 1099 | kfree(pt); |
1101 | } | 1100 | } |
diff --git a/fs/nfsd/blocklayout.c b/fs/nfsd/blocklayout.c index 0780ff864539..930d98caab5b 100644 --- a/fs/nfsd/blocklayout.c +++ b/fs/nfsd/blocklayout.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/nfsd/debug.h> | 10 | #include <linux/nfsd/debug.h> |
11 | #include <scsi/scsi_proto.h> | 11 | #include <scsi/scsi_proto.h> |
12 | #include <scsi/scsi_common.h> | 12 | #include <scsi/scsi_common.h> |
13 | #include <scsi/scsi_request.h> | ||
13 | 14 | ||
14 | #include "blocklayoutxdr.h" | 15 | #include "blocklayoutxdr.h" |
15 | #include "pnfs.h" | 16 | #include "pnfs.h" |
@@ -213,6 +214,7 @@ static int nfsd4_scsi_identify_device(struct block_device *bdev, | |||
213 | { | 214 | { |
214 | struct request_queue *q = bdev->bd_disk->queue; | 215 | struct request_queue *q = bdev->bd_disk->queue; |
215 | struct request *rq; | 216 | struct request *rq; |
217 | struct scsi_request *req; | ||
216 | size_t bufflen = 252, len, id_len; | 218 | size_t bufflen = 252, len, id_len; |
217 | u8 *buf, *d, type, assoc; | 219 | u8 *buf, *d, type, assoc; |
218 | int error; | 220 | int error; |
@@ -226,18 +228,19 @@ static int nfsd4_scsi_identify_device(struct block_device *bdev, | |||
226 | error = -ENOMEM; | 228 | error = -ENOMEM; |
227 | goto out_free_buf; | 229 | goto out_free_buf; |
228 | } | 230 | } |
229 | blk_rq_set_block_pc(rq); | 231 | req = scsi_req(rq); |
232 | scsi_req_init(rq); | ||
230 | 233 | ||
231 | error = blk_rq_map_kern(q, rq, buf, bufflen, GFP_KERNEL); | 234 | error = blk_rq_map_kern(q, rq, buf, bufflen, GFP_KERNEL); |
232 | if (error) | 235 | if (error) |
233 | goto out_put_request; | 236 | goto out_put_request; |
234 | 237 | ||
235 | rq->cmd[0] = INQUIRY; | 238 | req->cmd[0] = INQUIRY; |
236 | rq->cmd[1] = 1; | 239 | req->cmd[1] = 1; |
237 | rq->cmd[2] = 0x83; | 240 | req->cmd[2] = 0x83; |
238 | rq->cmd[3] = bufflen >> 8; | 241 | req->cmd[3] = bufflen >> 8; |
239 | rq->cmd[4] = bufflen & 0xff; | 242 | req->cmd[4] = bufflen & 0xff; |
240 | rq->cmd_len = COMMAND_SIZE(INQUIRY); | 243 | req->cmd_len = COMMAND_SIZE(INQUIRY); |
241 | 244 | ||
242 | error = blk_execute_rq(rq->q, NULL, rq, 1); | 245 | error = blk_execute_rq(rq->q, NULL, rq, 1); |
243 | if (error) { | 246 | if (error) { |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 461b7cf6af1d..e4c5f284fe2d 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -128,8 +128,6 @@ typedef __u32 __bitwise req_flags_t; | |||
128 | #define RQF_NOMERGE_FLAGS \ | 128 | #define RQF_NOMERGE_FLAGS \ |
129 | (RQF_STARTED | RQF_SOFTBARRIER | RQF_FLUSH_SEQ | RQF_SPECIAL_PAYLOAD) | 129 | (RQF_STARTED | RQF_SOFTBARRIER | RQF_FLUSH_SEQ | RQF_SPECIAL_PAYLOAD) |
130 | 130 | ||
131 | #define BLK_MAX_CDB 16 | ||
132 | |||
133 | /* | 131 | /* |
134 | * Try to put the fields that are referenced together in the same cacheline. | 132 | * Try to put the fields that are referenced together in the same cacheline. |
135 | * | 133 | * |
@@ -227,17 +225,7 @@ struct request { | |||
227 | 225 | ||
228 | int errors; | 226 | int errors; |
229 | 227 | ||
230 | /* | ||
231 | * when request is used as a packet command carrier | ||
232 | */ | ||
233 | unsigned char __cmd[BLK_MAX_CDB]; | ||
234 | unsigned char *cmd; | ||
235 | unsigned short cmd_len; | ||
236 | |||
237 | unsigned int extra_len; /* length of alignment and padding */ | 228 | unsigned int extra_len; /* length of alignment and padding */ |
238 | unsigned int sense_len; | ||
239 | unsigned int resid_len; /* residual count */ | ||
240 | void *sense; | ||
241 | 229 | ||
242 | unsigned long deadline; | 230 | unsigned long deadline; |
243 | struct list_head timeout_list; | 231 | struct list_head timeout_list; |
@@ -925,7 +913,6 @@ extern void blk_rq_init(struct request_queue *q, struct request *rq); | |||
925 | extern void blk_put_request(struct request *); | 913 | extern void blk_put_request(struct request *); |
926 | extern void __blk_put_request(struct request_queue *, struct request *); | 914 | extern void __blk_put_request(struct request_queue *, struct request *); |
927 | extern struct request *blk_get_request(struct request_queue *, int, gfp_t); | 915 | extern struct request *blk_get_request(struct request_queue *, int, gfp_t); |
928 | extern void blk_rq_set_block_pc(struct request *); | ||
929 | extern void blk_requeue_request(struct request_queue *, struct request *); | 916 | extern void blk_requeue_request(struct request_queue *, struct request *); |
930 | extern int blk_lld_busy(struct request_queue *q); | 917 | extern int blk_lld_busy(struct request_queue *q); |
931 | extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src, | 918 | extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src, |
diff --git a/include/linux/ide.h b/include/linux/ide.h index a633898f36ac..086fbe172817 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/mutex.h> | 20 | #include <linux/mutex.h> |
21 | /* for request_sense */ | 21 | /* for request_sense */ |
22 | #include <linux/cdrom.h> | 22 | #include <linux/cdrom.h> |
23 | #include <scsi/scsi_cmnd.h> | ||
23 | #include <asm/byteorder.h> | 24 | #include <asm/byteorder.h> |
24 | #include <asm/io.h> | 25 | #include <asm/io.h> |
25 | 26 | ||
@@ -52,6 +53,11 @@ enum ata_cmd_type_bits { | |||
52 | ((rq)->cmd_type == REQ_TYPE_ATA_PM_SUSPEND || \ | 53 | ((rq)->cmd_type == REQ_TYPE_ATA_PM_SUSPEND || \ |
53 | (rq)->cmd_type == REQ_TYPE_ATA_PM_RESUME) | 54 | (rq)->cmd_type == REQ_TYPE_ATA_PM_RESUME) |
54 | 55 | ||
56 | struct ide_request { | ||
57 | struct scsi_request sreq; | ||
58 | u8 sense[SCSI_SENSE_BUFFERSIZE]; | ||
59 | }; | ||
60 | |||
55 | /* Error codes returned in rq->errors to the higher part of the driver. */ | 61 | /* Error codes returned in rq->errors to the higher part of the driver. */ |
56 | enum { | 62 | enum { |
57 | IDE_DRV_ERROR_GENERAL = 101, | 63 | IDE_DRV_ERROR_GENERAL = 101, |
@@ -579,7 +585,7 @@ struct ide_drive_s { | |||
579 | 585 | ||
580 | /* current sense rq and buffer */ | 586 | /* current sense rq and buffer */ |
581 | bool sense_rq_armed; | 587 | bool sense_rq_armed; |
582 | struct request sense_rq; | 588 | struct request *sense_rq; |
583 | struct request_sense sense_data; | 589 | struct request_sense sense_data; |
584 | }; | 590 | }; |
585 | 591 | ||
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index 9fc1aecfc813..f708f1acfc50 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/timer.h> | 8 | #include <linux/timer.h> |
9 | #include <linux/scatterlist.h> | 9 | #include <linux/scatterlist.h> |
10 | #include <scsi/scsi_device.h> | 10 | #include <scsi/scsi_device.h> |
11 | #include <scsi/scsi_request.h> | ||
11 | 12 | ||
12 | struct Scsi_Host; | 13 | struct Scsi_Host; |
13 | struct scsi_driver; | 14 | struct scsi_driver; |
@@ -57,6 +58,7 @@ struct scsi_pointer { | |||
57 | #define SCMD_TAGGED (1 << 0) | 58 | #define SCMD_TAGGED (1 << 0) |
58 | 59 | ||
59 | struct scsi_cmnd { | 60 | struct scsi_cmnd { |
61 | struct scsi_request req; | ||
60 | struct scsi_device *device; | 62 | struct scsi_device *device; |
61 | struct list_head list; /* scsi_cmnd participates in queue lists */ | 63 | struct list_head list; /* scsi_cmnd participates in queue lists */ |
62 | struct list_head eh_entry; /* entry for the host eh_cmd_q */ | 64 | struct list_head eh_entry; /* entry for the host eh_cmd_q */ |
diff --git a/include/scsi/scsi_request.h b/include/scsi/scsi_request.h new file mode 100644 index 000000000000..ba0aeb980f7e --- /dev/null +++ b/include/scsi/scsi_request.h | |||
@@ -0,0 +1,30 @@ | |||
1 | #ifndef _SCSI_SCSI_REQUEST_H | ||
2 | #define _SCSI_SCSI_REQUEST_H | ||
3 | |||
4 | #include <linux/blk-mq.h> | ||
5 | |||
6 | #define BLK_MAX_CDB 16 | ||
7 | |||
8 | struct scsi_request { | ||
9 | unsigned char __cmd[BLK_MAX_CDB]; | ||
10 | unsigned char *cmd; | ||
11 | unsigned short cmd_len; | ||
12 | unsigned int sense_len; | ||
13 | unsigned int resid_len; /* residual count */ | ||
14 | void *sense; | ||
15 | }; | ||
16 | |||
17 | static inline struct scsi_request *scsi_req(struct request *rq) | ||
18 | { | ||
19 | return blk_mq_rq_to_pdu(rq); | ||
20 | } | ||
21 | |||
22 | static inline void scsi_req_free_cmd(struct scsi_request *req) | ||
23 | { | ||
24 | if (req->cmd != req->__cmd) | ||
25 | kfree(req->cmd); | ||
26 | } | ||
27 | |||
28 | void scsi_req_init(struct request *); | ||
29 | |||
30 | #endif /* _SCSI_SCSI_REQUEST_H */ | ||