diff options
Diffstat (limited to 'drivers/ide/ide-atapi.c')
-rw-r--r-- | drivers/ide/ide-atapi.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index da58020a144e..33a28cde126c 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
@@ -235,21 +235,28 @@ EXPORT_SYMBOL_GPL(ide_prep_sense); | |||
235 | 235 | ||
236 | int ide_queue_sense_rq(ide_drive_t *drive, void *special) | 236 | int ide_queue_sense_rq(ide_drive_t *drive, void *special) |
237 | { | 237 | { |
238 | struct request *sense_rq = drive->sense_rq; | 238 | ide_hwif_t *hwif = drive->hwif; |
239 | struct request *sense_rq; | ||
240 | unsigned long flags; | ||
241 | |||
242 | spin_lock_irqsave(&hwif->lock, flags); | ||
239 | 243 | ||
240 | /* deferred failure from ide_prep_sense() */ | 244 | /* deferred failure from ide_prep_sense() */ |
241 | if (!drive->sense_rq_armed) { | 245 | if (!drive->sense_rq_armed) { |
242 | printk(KERN_WARNING PFX "%s: error queuing a sense request\n", | 246 | printk(KERN_WARNING PFX "%s: error queuing a sense request\n", |
243 | drive->name); | 247 | drive->name); |
248 | spin_unlock_irqrestore(&hwif->lock, flags); | ||
244 | return -ENOMEM; | 249 | return -ENOMEM; |
245 | } | 250 | } |
246 | 251 | ||
252 | sense_rq = drive->sense_rq; | ||
247 | ide_req(sense_rq)->special = special; | 253 | ide_req(sense_rq)->special = special; |
248 | drive->sense_rq_armed = false; | 254 | drive->sense_rq_armed = false; |
249 | 255 | ||
250 | drive->hwif->rq = NULL; | 256 | drive->hwif->rq = NULL; |
251 | 257 | ||
252 | ide_insert_request_head(drive, sense_rq); | 258 | ide_insert_request_head(drive, sense_rq); |
259 | spin_unlock_irqrestore(&hwif->lock, flags); | ||
253 | return 0; | 260 | return 0; |
254 | } | 261 | } |
255 | EXPORT_SYMBOL_GPL(ide_queue_sense_rq); | 262 | EXPORT_SYMBOL_GPL(ide_queue_sense_rq); |