Re: [PATCH] LBA28/LBA48 off-by-one bug in ata.h

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Jeff,

I never saw the below acked or nacked.  I don't see it in 2.6.27-rc3-next.

Did you have any thoughts?

Greg

On Sat, May 3, 2008 at 4:29 AM, Taisuke Yamada <tai@xxxxxxxxxxxx> wrote:
> Hi.
>
> I recently bought 3 HGST P7K500-series 500GB SATA drives and
> had trouble accessing the block right on the LBA28-LBA48 border.
> Here's how it fails (same for all 3 drives):
>
>  # dd if=/dev/sdc bs=512 count=1 skip=268435455 > /dev/null
>  dd: reading `/dev/sdc': Input/output error
>  0+0 records in
>  0+0 records out
>  0 bytes (0 B) copied, 0.288033 seconds, 0.0 kB/s
>  # dmesg
>  ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
>  ata1.00: BMDMA stat 0x25
>  ata1.00: cmd c8/00:08:f8:ff:ff/00:00:00:00:00/ef tag 0 dma 4096 in
>  res 51/04:08:f8:ff:ff/00:00:00:00:00/ef Emask 0x1 (device error)
>  ata1.00: status: { DRDY ERR }
>  ata1.00: error: { ABRT }
>  ata1.00: configured for UDMA/33
>  ata1: EH complete
>  ...
>
> After some investigations, it turned out this seems to be caused
> by misinterpretation of the ATA specification on LBA28 access.
> Following part is the code in question:
>
>  === include/linux/ata.h ===
>  static inline int lba_28_ok(u64 block, u32 n_block)
>  {
>    /* check the ending block number */
>    return ((block + n_block - 1) < ((u64)1 << 28)) && (n_block <= 256);
>  }
>
> HGST drive (sometimes) fails with LBA28 access of {block = 0xfffffff,
> n_block = 1}, and this behavior seems to be comformant. Other drives,
> including other HGST drives are not that strict, through.
>
> From the ATA specification:
> (http://www.t13.org/Documents/UploadedDocuments/project/d1410r3b-ATA-ATAPI-6.pdf)
>
>  8.15.29  Word (61:60): Total number of user addressable sectors
>  This field contains a value that is one greater than the total number
>  of user addressable sectors (see 6.2). The maximum value that shall
>  be placed in this field is 0FFFFFFFh.
>
> So the driver shouldn't use the value of 0xfffffff for LBA28 request
> as this exceeds maximum user addressable sector. The logical maximum
> value for LBA28 is 0xffffffe.
>
> The obvious fix is to cut "- 1" part, and the patch attached just do
> that. I've been using the patched kernel for about a month now, and
> the same fix is also floating on the net for some time. So I believe
> this fix works reliably.
>
> Just FYI, many Windows/Intel platform users also seems to be struck
> by this, and HGST has issued a note pointing to Intel ICH8/9 driver.
>
>  "28-bit LBA command is being used to access LBAs 29-bits in length"
> http://www.hitachigst.com/hddt/knowtree.nsf/cffe836ed7c12018862565b000530c74/b531b8bce8745fb78825740f00580e23
>
> Also, *BSDs seems to have similar fix included sometime around ~2004,
> through I have not checked out exact portion of the code.
>
> I do not subscribe to the list, so Cc: me if further discussion is
> needed.
>
> Best Regards,
> --
> Taisuke Yamada
>
> --- linux-2.6.24/include/linux/ata.h.orig       2008-05-03 16:08:13.224811900 +0900
> +++ linux-2.6.24/include/linux/ata.h    2008-04-01 20:33:44.460619700 +0900
> @@ -599,7 +599,7 @@ static inline int ata_ok(u8 status)
>  static inline int lba_28_ok(u64 block, u32 n_block)
>  {
>        /* check the ending block number */
> -       return ((block + n_block - 1) < ((u64)1 << 28)) && (n_block <= 256);
> +       return ((block + n_block) < ((u64)1 << 28)) && (n_block <= 256);
>  }
>
>  static inline int lba_48_ok(u64 block, u32 n_block)
>
>



-- 
Greg Freemyer
Litigation Triage Solutions Specialist
http://www.linkedin.com/in/gregfreemyer
First 99 Days Litigation White Paper -
http://www.norcrossgroup.com/forms/whitepapers/99%20Days%20whitepaper.pdf

The Norcross Group
The Intersection of Evidence & Technology
http://www.norcrossgroup.com
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Filesystems]     [Linux SCSI]     [Linux RAID]     [Git]     [Kernel Newbies]     [Linux Newbie]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Samba]     [Device Mapper]

  Powered by Linux