Skip to content

Commit

Permalink
[libata] wrap kmap_atomic(KM_IRQ0) with local_irq_save/restore()
Browse files Browse the repository at this point in the history
Interrupts must be disabled if using kmap_atomic(KM_IRQ0), but that was
not the case in a few code paths coming directly from ATA driver
interrupt handlers (which use spin_lock rather than spin_lock_irqsave).

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
  • Loading branch information
Jeff Garzik committed Mar 1, 2008
1 parent 931506d commit b445c56
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions drivers/ata/libata-scsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1694,12 +1694,17 @@ void ata_scsi_rbuf_fill(struct ata_scsi_args *args,
u8 *rbuf;
unsigned int buflen, rc;
struct scsi_cmnd *cmd = args->cmd;
unsigned long flags;

local_irq_save(flags);

buflen = ata_scsi_rbuf_get(cmd, &rbuf);
memset(rbuf, 0, buflen);
rc = actor(args, rbuf, buflen);
ata_scsi_rbuf_put(cmd, rbuf);

local_irq_restore(flags);

if (rc == 0)
cmd->result = SAM_STAT_GOOD;
args->done(cmd);
Expand Down Expand Up @@ -2473,6 +2478,9 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) {
u8 *buf = NULL;
unsigned int buflen;
unsigned long flags;

local_irq_save(flags);

buflen = ata_scsi_rbuf_get(cmd, &buf);

Expand All @@ -2490,6 +2498,8 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
}

ata_scsi_rbuf_put(cmd, buf);

local_irq_restore(flags);
}

cmd->result = SAM_STAT_GOOD;
Expand Down

0 comments on commit b445c56

Please sign in to comment.