diff options
author | Borislav Petkov <petkovbb@gmail.com> | 2009-06-07 09:37:05 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-06-07 09:37:05 -0400 |
commit | 626542ca2277961aaa64855206574f8ca4f360e3 (patch) | |
tree | 88f2071580dbe02c43741dd112d8f7b98eea0938 | |
parent | ffddf1717b0d388879c646eaf6261a2b393c06ad (diff) |
ide-tape: change IDE_AFLAG_IGNORE_DSC non-atomically
There are two sites where the flag is being changed: ide_retry_pc
and idetape_do_request. Both codepaths are protected by hwif->busy
(ide_lock_port) and therefore we shouldn't need the atomic accesses.
Spotted-by: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r-- | drivers/ide/ide-atapi.c | 2 | ||||
-rw-r--r-- | drivers/ide/ide-tape.c | 12 |
2 files changed, 8 insertions, 6 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index afe5a4323879..fbcb8513a4c8 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
@@ -258,7 +258,7 @@ void ide_retry_pc(ide_drive_t *drive) | |||
258 | pc->req_xfer = sense_rq->data_len; | 258 | pc->req_xfer = sense_rq->data_len; |
259 | 259 | ||
260 | if (drive->media == ide_tape) | 260 | if (drive->media == ide_tape) |
261 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); | 261 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; |
262 | 262 | ||
263 | if (ide_queue_sense_rq(drive, pc)) | 263 | if (ide_queue_sense_rq(drive, pc)) |
264 | ide_complete_rq(drive, -EIO, blk_rq_bytes(drive->hwif->rq)); | 264 | ide_complete_rq(drive, -EIO, blk_rq_bytes(drive->hwif->rq)); |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 203bbeac182f..f1d3c7b2a2b5 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -656,15 +656,15 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
656 | 656 | ||
657 | if ((drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) == 0 && | 657 | if ((drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) == 0 && |
658 | (rq->cmd[13] & REQ_IDETAPE_PC2) == 0) | 658 | (rq->cmd[13] & REQ_IDETAPE_PC2) == 0) |
659 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); | 659 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; |
660 | 660 | ||
661 | if (drive->dev_flags & IDE_DFLAG_POST_RESET) { | 661 | if (drive->dev_flags & IDE_DFLAG_POST_RESET) { |
662 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); | 662 | drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC; |
663 | drive->dev_flags &= ~IDE_DFLAG_POST_RESET; | 663 | drive->dev_flags &= ~IDE_DFLAG_POST_RESET; |
664 | } | 664 | } |
665 | 665 | ||
666 | if (!test_and_clear_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags) && | 666 | if (!(drive->atapi_flags & IDE_AFLAG_IGNORE_DSC) && |
667 | (stat & ATA_DSC) == 0) { | 667 | !(stat & ATA_DSC)) { |
668 | if (postponed_rq == NULL) { | 668 | if (postponed_rq == NULL) { |
669 | tape->dsc_polling_start = jiffies; | 669 | tape->dsc_polling_start = jiffies; |
670 | tape->dsc_poll_freq = tape->best_dsc_rw_freq; | 670 | tape->dsc_poll_freq = tape->best_dsc_rw_freq; |
@@ -684,7 +684,9 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
684 | tape->dsc_poll_freq = IDETAPE_DSC_MA_SLOW; | 684 | tape->dsc_poll_freq = IDETAPE_DSC_MA_SLOW; |
685 | idetape_postpone_request(drive); | 685 | idetape_postpone_request(drive); |
686 | return ide_stopped; | 686 | return ide_stopped; |
687 | } | 687 | } else |
688 | drive->atapi_flags &= ~IDE_AFLAG_IGNORE_DSC; | ||
689 | |||
688 | if (rq->cmd[13] & REQ_IDETAPE_READ) { | 690 | if (rq->cmd[13] & REQ_IDETAPE_READ) { |
689 | pc = &tape->queued_pc; | 691 | pc = &tape->queued_pc; |
690 | ide_tape_create_rw_cmd(tape, pc, rq, READ_6); | 692 | ide_tape_create_rw_cmd(tape, pc, rq, READ_6); |