From: Alan Cox Ok this is a different approach to handling it - knowing it is an off by one so we can handle the drive if clipped Signed-off-by: Alan Cox Signed-off-by: Andrew Morton --- drivers/ata/libata-core.c | 7 +++++++ include/linux/libata.h | 1 + 2 files changed, 8 insertions(+) diff -puN drivers/ata/libata-core.c~st340823a-hpa-and-libata drivers/ata/libata-core.c --- a/drivers/ata/libata-core.c~st340823a-hpa-and-libata +++ a/drivers/ata/libata-core.c @@ -996,6 +996,10 @@ static u64 ata_hpa_resize(struct ata_dev else hpa_sectors = ata_read_native_max_address(dev); + /* Reports one sector too many */ + if (hpa_sectors && (dev->horkage & ATA_HORKAGE_HPA_SIZE)) + hpa_sectors--; + if (hpa_sectors > sectors) { ata_dev_printk(dev, KERN_INFO, "Host Protected Area detected:\n" @@ -3919,6 +3923,9 @@ static const struct ata_blacklist_entry { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA }, { "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA }, + /* Devices which report 1 sector over size HPA */ + { "ST340823A", NULL, ATA_HORKAGE_HPA_SIZE, }, + /* End Marker */ { } }; diff -puN include/linux/libata.h~st340823a-hpa-and-libata include/linux/libata.h --- a/include/linux/libata.h~st340823a-hpa-and-libata +++ a/include/linux/libata.h @@ -315,6 +315,7 @@ enum { ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ ATA_HORKAGE_MAX_SEC_128 = (1 << 3), /* Limit max sects to 128 */ ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ + ATA_HORKAGE_HPA_SIZE = (1 << 5), /* Reports native size off by one */ /* DMA mask for user DMA control: User visible values do not renumber */ _