aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDarrick J. Wong <djwong@us.ibm.com>2006-11-14 09:55:41 -0500
committerJeff Garzik <jeff@garzik.org>2006-11-14 09:55:41 -0500
commit253b92ecbd3d2e9f5a79fc7632c89ac74bff16c4 (patch)
tree8153c5044d97f5a46ee57329a9895256ab161500
parent3f9dd27a22ff79b6b6c4eccd19e4063bff0ddc7e (diff)
libata: fix double-completion on error
A curious thing happens, however, when ata_qc_new_init fails to get an ata_queued_cmd: First, ata_qc_new_init handles the failure like this: cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1); done(cmd); Then, we return to ata_scsi_translate and do this: err_mem: cmd->result = (DID_ERROR << 16); done(cmd); It appears to me that first we set a status code indicating that we're ok but the device queue is full and finish the command, but then we blow away that status code and replace it with an error flag and finish the command a second time! That does not seem to be desirable behavior since we merely want the I/O to wait until a command slot frees up, not send errors up the block layer. In the err_mem case, we should simply exit out of ata_scsi_translate instead. Signed-off-by: Darrick J. Wong <djwong@us.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/ata/libata-scsi.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 7af2a4ba4990..5c1fc467fc7f 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -1612,9 +1612,9 @@ early_finish:
1612 1612
1613err_did: 1613err_did:
1614 ata_qc_free(qc); 1614 ata_qc_free(qc);
1615err_mem:
1616 cmd->result = (DID_ERROR << 16); 1615 cmd->result = (DID_ERROR << 16);
1617 done(cmd); 1616 done(cmd);
1617err_mem:
1618 DPRINTK("EXIT - internal\n"); 1618 DPRINTK("EXIT - internal\n");
1619 return 0; 1619 return 0;
1620 1620