diff options
author | Mark Lord <kernel@teksavvy.com> | 2010-04-07 13:52:08 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2010-04-08 12:53:57 -0400 |
commit | 45c4d015a92f72ec47acd0c7557abdc0c8a6499d (patch) | |
tree | 8c71c959f3c7c04647336cca27dc18e3cd0bbe0b /include/linux/ata.h | |
parent | cf90bfe2ebaf9d32f37acbebb7425c280fd6cd30 (diff) |
libata: Fix accesses at LBA28 boundary (old bug, but nasty) (v2)
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>
Diffstat (limited to 'include/linux/ata.h')
-rw-r--r-- | include/linux/ata.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/include/linux/ata.h b/include/linux/ata.h index b4c85e2adef5..700c5b9b3583 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -1025,8 +1025,8 @@ static inline int ata_ok(u8 status) | |||
1025 | 1025 | ||
1026 | static inline int lba_28_ok(u64 block, u32 n_block) | 1026 | static inline int lba_28_ok(u64 block, u32 n_block) |
1027 | { | 1027 | { |
1028 | /* check the ending block number */ | 1028 | /* check the ending block number: must be LESS THAN 0x0fffffff */ |
1029 | return ((block + n_block) < ((u64)1 << 28)) && (n_block <= 256); | 1029 | return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= 256); |
1030 | } | 1030 | } |
1031 | 1031 | ||
1032 | static inline int lba_48_ok(u64 block, u32 n_block) | 1032 | static inline int lba_48_ok(u64 block, u32 n_block) |