• Mark Lord's avatar
    2.6.21 fix lba48 bug in libata fill_result_tf() · 4742d54f
    Mark Lord authored
    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: default avatarMark Lord <mlord@pobox.com>
    Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
    4742d54f
libata-core.c 156 KB