Commit 45c4d015 authored by Mark Lord's avatar Mark Lord Committed by Jeff Garzik

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: default avatarMark Lord <mlord@pobox.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent cf90bfe2
...@@ -1025,8 +1025,8 @@ static inline int ata_ok(u8 status) ...@@ -1025,8 +1025,8 @@ static inline int ata_ok(u8 status)
static inline int lba_28_ok(u64 block, u32 n_block) static inline int lba_28_ok(u64 block, u32 n_block)
{ {
/* check the ending block number */ /* check the ending block number: must be LESS THAN 0x0fffffff */
return ((block + n_block) < ((u64)1 << 28)) && (n_block <= 256); return ((block + n_block) < ((1 << 28) - 1)) && (n_block <= 256);
} }
static inline int lba_48_ok(u64 block, u32 n_block) static inline int lba_48_ok(u64 block, u32 n_block)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment