diff options
| author | Willem Riede <wrlk@riede.org> | 2005-11-09 17:18:22 -0500 | 
|---|---|---|
| committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2005-11-09 17:18:22 -0500 | 
| commit | 0046b06a367cd853efd3223ce60143f3a7952522 (patch) | |
| tree | 5c531a7d07e2f8ebb14e6e9cb2004e566c0bb225 | |
| parent | e851b620e775c9f0e00b1c7e35072d6b98097cb9 (diff) | |
[PATCH] ide: ide-scsi fails to call idescsi_check_condition for things like "Medium not present"
This patch started life as a response to fedora specific ide subsystem changes
that made error handling of my ATAPI tape drive fail; the specifics are in
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=160868
The insertion of the statement rq->errors = err; near the end of
ide_end_drive_cmd() in drivers/ide/ide-io.c means that rq->errors does not
contain what it needs to in idescsi_end_request() in drivers/scsi/ide-scsi.c
anymore. Recent mainline kernels now also have this change.
The patch below makes ide-scsi whole.
Signed-off-by: Willem Riede <wrlk@riede.org>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
| -rw-r--r-- | drivers/scsi/ide-scsi.c | 5 | 
1 files changed, 3 insertions, 2 deletions
| diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index c888af4a4562..3553da0e1cd5 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
| @@ -395,6 +395,7 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs) | |||
| 395 | int log = test_bit(IDESCSI_LOG_CMD, &scsi->log); | 395 | int log = test_bit(IDESCSI_LOG_CMD, &scsi->log); | 
| 396 | struct Scsi_Host *host; | 396 | struct Scsi_Host *host; | 
| 397 | u8 *scsi_buf; | 397 | u8 *scsi_buf; | 
| 398 | int errors = rq->errors; | ||
| 398 | unsigned long flags; | 399 | unsigned long flags; | 
| 399 | 400 | ||
| 400 | if (!(rq->flags & (REQ_SPECIAL|REQ_SENSE))) { | 401 | if (!(rq->flags & (REQ_SPECIAL|REQ_SENSE))) { | 
| @@ -421,11 +422,11 @@ static int idescsi_end_request (ide_drive_t *drive, int uptodate, int nrsecs) | |||
| 421 | printk (KERN_WARNING "ide-scsi: %s: timed out for %lu\n", | 422 | printk (KERN_WARNING "ide-scsi: %s: timed out for %lu\n", | 
| 422 | drive->name, pc->scsi_cmd->serial_number); | 423 | drive->name, pc->scsi_cmd->serial_number); | 
| 423 | pc->scsi_cmd->result = DID_TIME_OUT << 16; | 424 | pc->scsi_cmd->result = DID_TIME_OUT << 16; | 
| 424 | } else if (rq->errors >= ERROR_MAX) { | 425 | } else if (errors >= ERROR_MAX) { | 
| 425 | pc->scsi_cmd->result = DID_ERROR << 16; | 426 | pc->scsi_cmd->result = DID_ERROR << 16; | 
| 426 | if (log) | 427 | if (log) | 
| 427 | printk ("ide-scsi: %s: I/O error for %lu\n", drive->name, pc->scsi_cmd->serial_number); | 428 | printk ("ide-scsi: %s: I/O error for %lu\n", drive->name, pc->scsi_cmd->serial_number); | 
| 428 | } else if (rq->errors) { | 429 | } else if (errors) { | 
| 429 | if (log) | 430 | if (log) | 
| 430 | printk ("ide-scsi: %s: check condition for %lu\n", drive->name, pc->scsi_cmd->serial_number); | 431 | printk ("ide-scsi: %s: check condition for %lu\n", drive->name, pc->scsi_cmd->serial_number); | 
| 431 | if (!idescsi_check_condition(drive, rq)) | 432 | if (!idescsi_check_condition(drive, rq)) | 
