lkml.org 
[lkml]   [2009]   [Sep]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 06/10] libata: fix off-by-one error in ata_tf_read_block()
    2.6.27-stable review patch.  If anyone has any objections, please let us know.

    ------------------
    From: Tejun Heo <htejun@gmail.com>

    commit ac8672ea922bde59acf50eaa1eaa1640a6395fd2 upstream.

    ata_tf_read_block() has off-by-one error when converting CHS address
    to LBA. The bug isn't very visible because ata_tf_read_block() is
    used only when generating sense data for a failed RW command and CHS
    addressing isn't used too often these days.

    This problem was spotted by Atsushi Nemoto.

    Signed-off-by: Tejun Heo <tj@kernel.org>
    Reported-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
    Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/ata/libata-core.c | 8 +++++++-
    1 file changed, 7 insertions(+), 1 deletion(-)

    --- a/drivers/ata/libata-core.c
    +++ b/drivers/ata/libata-core.c
    @@ -565,7 +565,13 @@ u64 ata_tf_read_block(struct ata_taskfil
    head = tf->device & 0xf;
    sect = tf->lbal;

    - block = (cyl * dev->heads + head) * dev->sectors + sect;
    + if (!sect) {
    + ata_dev_printk(dev, KERN_WARNING, "device reported "
    + "invalid CHS sector 0\n");
    + sect = 1; /* oh well */
    + }
    +
    + block = (cyl * dev->heads + head) * dev->sectors + sect - 1;
    }

    return block;



    \
     
     \ /
      Last update: 2009-09-17 00:23    [W:0.020 / U:29.648 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site