libata: Fixup n_elem initialization
authorBrian King <brking@linux.vnet.ibm.com>
Wed, 17 Jan 2007 18:32:12 +0000 (12:32 -0600)
committerJeff Garzik <jeff@garzik.org>
Wed, 24 Jan 2007 07:04:34 +0000 (02:04 -0500)
Fixup the inialization of qc->n_elem. It currently gets
initialized to 1 for commands that do not transfer any data.
Fix this by initializing n_elem to 0 and only setting to 1
in ata_scsi_qc_new when there is data to transfer. This fixes
some problems seen with SATA devices attached to ipr adapters.

Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/ata/libata-scsi.c
include/linux/libata.h

index 836947da5b14de4f7e75859d2e500cb2001b31a4..7cc5a4a910a43fa48adc032ae44aae09c1ff73af 100644 (file)
@@ -372,7 +372,7 @@ struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
                if (cmd->use_sg) {
                        qc->__sg = (struct scatterlist *) cmd->request_buffer;
                        qc->n_elem = cmd->use_sg;
-               } else {
+               } else if (cmd->request_bufflen) {
                        qc->__sg = &qc->sgent;
                        qc->n_elem = 1;
                }
index e53a13ba7f7833275b54005a237153ac541ee288..65d318746ac61321f38bbb883da319bef54ad090 100644 (file)
@@ -1149,6 +1149,7 @@ static inline void ata_qc_reinit(struct ata_queued_cmd *qc)
        qc->cursect = qc->cursg = qc->cursg_ofs = 0;
        qc->nsect = 0;
        qc->nbytes = qc->curbytes = 0;
+       qc->n_elem = 0;
        qc->err_mask = 0;
 
        ata_tf_init(qc->dev, &qc->tf);