hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/ide/ide-atapi.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * ATAPI support.
34 */
....@@ -94,7 +95,7 @@
9495
9596 rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0);
9697 ide_req(rq)->type = ATA_PRIV_MISC;
97
- rq->special = (char *)pc;
98
+ ide_req(rq)->special = pc;
9899
99100 if (buf && bufflen) {
100101 error = blk_rq_map_kern(drive->queue, rq, buf, bufflen,
....@@ -172,8 +173,8 @@
172173 void ide_prep_sense(ide_drive_t *drive, struct request *rq)
173174 {
174175 struct request_sense *sense = &drive->sense_data;
175
- struct request *sense_rq = drive->sense_rq;
176
- struct scsi_request *req = scsi_req(sense_rq);
176
+ struct request *sense_rq;
177
+ struct scsi_request *req;
177178 unsigned int cmd_len, sense_len;
178179 int err;
179180
....@@ -196,9 +197,16 @@
196197 if (ata_sense_request(rq) || drive->sense_rq_armed)
197198 return;
198199
200
+ sense_rq = drive->sense_rq;
201
+ if (!sense_rq) {
202
+ sense_rq = blk_mq_alloc_request(drive->queue, REQ_OP_DRV_IN,
203
+ BLK_MQ_REQ_RESERVED | BLK_MQ_REQ_NOWAIT);
204
+ drive->sense_rq = sense_rq;
205
+ }
206
+ req = scsi_req(sense_rq);
207
+
199208 memset(sense, 0, sizeof(*sense));
200209
201
- blk_rq_init(rq->q, sense_rq);
202210 scsi_req_init(req);
203211
204212 err = blk_rq_map_kern(drive->queue, sense_rq, sense, sense_len,
....@@ -207,6 +215,8 @@
207215 if (printk_ratelimit())
208216 printk(KERN_WARNING PFX "%s: failed to map sense "
209217 "buffer\n", drive->name);
218
+ blk_mq_free_request(sense_rq);
219
+ drive->sense_rq = NULL;
210220 return;
211221 }
212222
....@@ -225,19 +235,28 @@
225235
226236 int ide_queue_sense_rq(ide_drive_t *drive, void *special)
227237 {
238
+ ide_hwif_t *hwif = drive->hwif;
239
+ struct request *sense_rq;
240
+ unsigned long flags;
241
+
242
+ spin_lock_irqsave(&hwif->lock, flags);
243
+
228244 /* deferred failure from ide_prep_sense() */
229245 if (!drive->sense_rq_armed) {
230246 printk(KERN_WARNING PFX "%s: error queuing a sense request\n",
231247 drive->name);
248
+ spin_unlock_irqrestore(&hwif->lock, flags);
232249 return -ENOMEM;
233250 }
234251
235
- drive->sense_rq->special = special;
252
+ sense_rq = drive->sense_rq;
253
+ ide_req(sense_rq)->special = special;
236254 drive->sense_rq_armed = false;
237255
238256 drive->hwif->rq = NULL;
239257
240
- elv_add_request(drive->queue, drive->sense_rq, ELEVATOR_INSERT_FRONT);
258
+ ide_insert_request_head(drive, sense_rq);
259
+ spin_unlock_irqrestore(&hwif->lock, flags);
241260 return 0;
242261 }
243262 EXPORT_SYMBOL_GPL(ide_queue_sense_rq);
....@@ -269,10 +288,8 @@
269288 */
270289 drive->hwif->rq = NULL;
271290 ide_requeue_and_plug(drive, failed_rq);
272
- if (ide_queue_sense_rq(drive, pc)) {
273
- blk_start_request(failed_rq);
291
+ if (ide_queue_sense_rq(drive, pc))
274292 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(failed_rq));
275
- }
276293 }
277294 EXPORT_SYMBOL_GPL(ide_retry_pc);
278295
....@@ -591,7 +608,7 @@
591608
592609 static ide_startstop_t ide_transfer_pc(ide_drive_t *drive)
593610 {
594
- struct ide_atapi_pc *uninitialized_var(pc);
611
+ struct ide_atapi_pc *pc;
595612 ide_hwif_t *hwif = drive->hwif;
596613 struct request *rq = hwif->rq;
597614 ide_expiry_t *expiry;