diff options
author | Jens Axboe <axboe@kernel.dk> | 2018-10-26 11:53:52 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-11-07 15:42:31 -0500 |
commit | 600335205b8d162891b5ef2e32343f5b8020efd8 (patch) | |
tree | 0f42d3369caf0aa805ef2c48cf4f8aa5bd2e83aa /drivers/ide/ide-atapi.c | |
parent | d0be12274dad242271fb2055275d10b67a0d7649 (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.c | 25 |
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); | |||
172 | void ide_prep_sense(ide_drive_t *drive, struct request *rq) | 172 | void 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 | ||
227 | int ide_queue_sense_rq(ide_drive_t *drive, void *special) | 236 | int 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 | } |
244 | EXPORT_SYMBOL_GPL(ide_queue_sense_rq); | 255 | EXPORT_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 | } |
278 | EXPORT_SYMBOL_GPL(ide_retry_pc); | 287 | EXPORT_SYMBOL_GPL(ide_retry_pc); |
279 | 288 | ||