summaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-atapi.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2018-10-26 11:53:52 -0400
committerJens Axboe <axboe@kernel.dk>2018-11-07 15:42:31 -0500
commit600335205b8d162891b5ef2e32343f5b8020efd8 (patch)
tree0f42d3369caf0aa805ef2c48cf4f8aa5bd2e83aa /drivers/ide/ide-atapi.c
parentd0be12274dad242271fb2055275d10b67a0d7649 (diff)
ide: convert to blk-mq
ide-disk and ide-cd tested as working just fine, ide-tape and ide-floppy haven't. But the latter don't require changes, so they should work without issue. Add helper function to insert a request from a work queue, since we cannot invoke the blk-mq request insertion from IRQ context. Cc: David Miller <davem@davemloft.net> Reviewed-by: Hannes Reinecke <hare@suse.com> Tested-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/ide/ide-atapi.c')
-rw-r--r--drivers/ide/ide-atapi.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c
index 8b2b72b93885..33210bc67618 100644
--- a/drivers/ide/ide-atapi.c
+++ b/drivers/ide/ide-atapi.c
@@ -172,8 +172,8 @@ EXPORT_SYMBOL_GPL(ide_create_request_sense_cmd);
172void ide_prep_sense(ide_drive_t *drive, struct request *rq) 172void ide_prep_sense(ide_drive_t *drive, struct request *rq)
173{ 173{
174 struct request_sense *sense = &drive->sense_data; 174 struct request_sense *sense = &drive->sense_data;
175 struct request *sense_rq = drive->sense_rq; 175 struct request *sense_rq;
176 struct scsi_request *req = scsi_req(sense_rq); 176 struct scsi_request *req;
177 unsigned int cmd_len, sense_len; 177 unsigned int cmd_len, sense_len;
178 int err; 178 int err;
179 179
@@ -196,9 +196,16 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq)
196 if (ata_sense_request(rq) || drive->sense_rq_armed) 196 if (ata_sense_request(rq) || drive->sense_rq_armed)
197 return; 197 return;
198 198
199 sense_rq = drive->sense_rq;
200 if (!sense_rq) {
201 sense_rq = blk_mq_alloc_request(drive->queue, REQ_OP_DRV_IN,
202 BLK_MQ_REQ_RESERVED | BLK_MQ_REQ_NOWAIT);
203 drive->sense_rq = sense_rq;
204 }
205 req = scsi_req(sense_rq);
206
199 memset(sense, 0, sizeof(*sense)); 207 memset(sense, 0, sizeof(*sense));
200 208
201 blk_rq_init(rq->q, sense_rq);
202 scsi_req_init(req); 209 scsi_req_init(req);
203 210
204 err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len, 211 err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len,
@@ -207,6 +214,8 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq)
207 if (printk_ratelimit()) 214 if (printk_ratelimit())
208 printk(KERN_WARNING PFX "%s: failed to map sense " 215 printk(KERN_WARNING PFX "%s: failed to map sense "
209 "buffer\n", drive->name); 216 "buffer\n", drive->name);
217 blk_mq_free_request(sense_rq);
218 drive->sense_rq = NULL;
210 return; 219 return;
211 } 220 }
212 221
@@ -226,6 +235,8 @@ EXPORT_SYMBOL_GPL(ide_prep_sense);
226 235
227int ide_queue_sense_rq(ide_drive_t *drive, void *special) 236int ide_queue_sense_rq(ide_drive_t *drive, void *special)
228{ 237{
238 struct request *sense_rq = drive->sense_rq;
239
229 /* deferred failure from ide_prep_sense() */ 240 /* deferred failure from ide_prep_sense() */
230 if (!drive->sense_rq_armed) { 241 if (!drive->sense_rq_armed) {
231 printk(KERN_WARNING PFX "%s: error queuing a sense request\n", 242 printk(KERN_WARNING PFX "%s: error queuing a sense request\n",
@@ -233,12 +244,12 @@ int ide_queue_sense_rq(ide_drive_t *drive, void *special)
233 return -ENOMEM; 244 return -ENOMEM;
234 } 245 }
235 246
236 drive->sense_rq->special = special; 247 sense_rq->special = special;
237 drive->sense_rq_armed = false; 248 drive->sense_rq_armed = false;
238 249
239 drive->hwif->rq = NULL; 250 drive->hwif->rq = NULL;
240 251
241 elv_add_request(drive->queue, drive->sense_rq, ELEVATOR_INSERT_FRONT); 252 ide_insert_request_head(drive, sense_rq);
242 return 0; 253 return 0;
243} 254}
244EXPORT_SYMBOL_GPL(ide_queue_sense_rq); 255EXPORT_SYMBOL_GPL(ide_queue_sense_rq);
@@ -270,10 +281,8 @@ void ide_retry_pc(ide_drive_t *drive)
270 */ 281 */
271 drive->hwif->rq = NULL; 282 drive->hwif->rq = NULL;
272 ide_requeue_and_plug(drive, failed_rq); 283 ide_requeue_and_plug(drive, failed_rq);
273 if (ide_queue_sense_rq(drive, pc)) { 284 if (ide_queue_sense_rq(drive, pc))
274 blk_start_request(failed_rq);
275 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(failed_rq)); 285 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(failed_rq));
276 }
277} 286}
278EXPORT_SYMBOL_GPL(ide_retry_pc); 287EXPORT_SYMBOL_GPL(ide_retry_pc);
279 288