History

libata: fix reading concurrent positioning ranges log

The concurrent positioning ranges log is not a fixed size and may depend on how many ranges are supported by the device. This patch uses the size reported in the GPL directory to determine the number of pages supported by the device before attempting to read this log page. This resolves this error from the dmesg output: ata6.00: Read log 0x47 page 0x00 failed, Emask 0x1

Tyler Erickson committed 4 years ago

Commit c745dfc1 parent 10d6bdf1 file · +13 −8Browse files

Unified · Split

drivers/ata/libata-core.c+13−8
@@ -2010,16 +2010,16 @@ retry: · 2009 unmodified lines
2010 return err_mask;2010 return err_mask;
2011}2011}
2012 2012
2013static bool ata_log_supported(struct ata_device *dev, u8 log)2013static int ata_log_supported(struct ata_device *dev, u8 log)
2014{2014{
2015 struct ata_port *ap = dev->link->ap;2015 struct ata_port *ap = dev->link->ap;
2016 2016
2017 if (dev->horkage & ATA_HORKAGE_NO_LOG_DIR)2017 if (dev->horkage & ATA_HORKAGE_NO_LOG_DIR)
2018 return false;2018 return 0;
2019 2019
2020 if (ata_read_log_page(dev, ATA_LOG_DIRECTORY, 0, ap->sector_buf, 1))2020 if (ata_read_log_page(dev, ATA_LOG_DIRECTORY, 0, ap->sector_buf, 1))
2021 return false;2021 return 0;
2022 return get_unaligned_le16(&ap->sector_buf[log * 2]) ? true : false;2022 return get_unaligned_le16(&ap->sector_buf[log * 2]);
2023}2023}
2024 2024
2025static bool ata_identify_page_supported(struct ata_device *dev, u8 page)2025static bool ata_identify_page_supported(struct ata_device *dev, u8 page)
@@ -2455,15 +2455,20 @@ static void ata_dev_config_cpr(struct ata_device *dev) · 429 unmodified lines
2455 struct ata_cpr_log *cpr_log = NULL;2455 struct ata_cpr_log *cpr_log = NULL;
2456 u8 *desc, *buf = NULL;2456 u8 *desc, *buf = NULL;
2457 2457
2458 if (ata_id_major_version(dev->id) < 11 ||2458 if (ata_id_major_version(dev->id) < 11)
2459 !ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES))2459 goto out;
2460
2461 buf_len = ata_log_supported(dev, ATA_LOG_CONCURRENT_POSITIONING_RANGES);
2462 if (buf_len == 0)
2460 goto out;2463 goto out;
2461 2464
2462 /*2465 /*
2463 * Read the concurrent positioning ranges log (0x47). We can have at2466 * Read the concurrent positioning ranges log (0x47). We can have at
2464 * most 255 32B range descriptors plus a 64B header.2467 * most 255 32B range descriptors plus a 64B header. This log varies in
2468 * size, so use the size reported in the GPL directory. Reading beyond
2469 * the supported length will result in an error.
2465 */2470 */
2466 buf_len = (64 + 255 * 32 + 511) & ~511;2471 buf_len <<= 9;
2467 buf = kzalloc(buf_len, GFP_KERNEL);2472 buf = kzalloc(buf_len, GFP_KERNEL);
2468 if (!buf)2473 if (!buf)
2469 goto out;2474 goto out;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t