]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
libata: Fix accesses at LBA28 boundary (old bug, but nasty) (v2)
authorMark Lord <kernel@teksavvy.com>
Wed, 7 Apr 2010 17:52:08 +0000 (13:52 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 12 May 2010 21:57:10 +0000 (14:57 -0700)
commit 45c4d015a92f72ec47acd0c7557abdc0c8a6499d upstream.

Most drives from Seagate, Hitachi, and possibly other brands,
do not allow LBA28 access to sector number 0x0fffffff (2^28 - 1).
So instead use LBA48 for such accesses.

This bug could bite a lot of systems, especially when the user has
taken care to align partitions to 4KB boundaries. On misaligned systems,
it is less likely to be encountered, since a 4KB read would end at
0x10000000 rather than at 0x0fffffff.

Signed-off-by: Mark Lord <mlord@pobox.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
include/linux/ata.h

index 4fb357312b3bf4b4484879fa5ede0942e39fb15f..89387962f5f57291b289846f92d55e8203ccaf11 100644 (file)
@@ -1000,8 +1000,8 @@ 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) < ((u64)1 << 28)) && (n_block <= 256);
+       /* check the ending block number: must be LESS THAN 0x0fffffff */
+       return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= 256);
 }
 
 static inline int lba_48_ok(u64 block, u32 n_block)