diff options
author | Mark Lord <liml@rtr.ca> | 2007-04-10 13:09:02 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-04-13 13:47:18 -0700 |
commit | 4e169f6ceff7af6a26e777fa87c28e41ffcd342e (patch) | |
tree | 4404f2679dc560a5b958e9d0af1bcfd9e3a72e84 | |
parent | c23bbe5978f98e7ae3a41f13dbf48d70c6651573 (diff) | |
download | linux-stable-4e169f6ceff7af6a26e777fa87c28e41ffcd342e.tar.gz linux-stable-4e169f6ceff7af6a26e777fa87c28e41ffcd342e.tar.bz2 linux-stable-4e169f6ceff7af6a26e777fa87c28e41ffcd342e.zip |
fix lba48 bug in libata fill_result_tf()
2.6.21 fix lba48 bug in libata fill_result_tf()
Current 2.6.21 libata does the following:
void ata_tf_read(struct ata_port *ap, struct ata_taskfile *tf)
{
struct ata_ioports *ioaddr = &ap->ioaddr;
tf->command = ata_check_status(ap);
...
if (tf->flags & ATA_TFLAG_LBA48) {
iowrite8(tf->ctl | ATA_HOB, ioaddr->ctl_addr);
tf->hob_feature = ioread8(ioaddr->error_addr);
...
}
}
...
static void fill_result_tf(struct ata_queued_cmd *qc)
{
struct ata_port *ap = qc->ap;
ap->ops->tf_read(ap, &qc->result_tf);
qc->result_tf.flags = qc->tf.flags;
}
Based on this, those last two statements fill_result_tf()
appear to me to be in the wrong order, in that the tf->flags
are uninitialized at the point where tf_read() is invoked.
So for lba48 commands, tf_read() won't be reading back the
full lba48 register contents..
Correct?
This patch corrects fill_result_tf() so that the flags
get copied to result_tf before they are used by tf_read().
Signed-off-by: Mark Lord <mlord@pobox.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Cc: Chuck Ebbert <cebbert@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/ata/libata-core.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index d6fcf0a1b7d8..1b258e2f0402 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -4742,8 +4742,8 @@ static void fill_result_tf(struct ata_queued_cmd *qc) { struct ata_port *ap = qc->ap; - ap->ops->tf_read(ap, &qc->result_tf); qc->result_tf.flags = qc->tf.flags; + ap->ops->tf_read(ap, &qc->result_tf); } /** |