Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ata: libata-core: relax checks in ata_read_log_directory()

Commit 6d4405b16d37 ("ata: libata-core: Cache the general purpose log
directory") introduced caching of a device general purpose log directory
to avoid repeated access to this log page during device scan. This
change also added a check on this log page to verify that the log page
version is 0x0001 as mandated by the ACS specifications.

And it turns out that some devices do not bother reporting this version,
instead reporting a version 0, resulting in error messages such as:

ata6.00: Invalid log directory version 0x0000

and to the device being marked as not supporting the general purpose log
directory log page.

Since before commit 6d4405b16d37 the log page version check did not
exist and things were still working correctly for these devices, relax
ata_read_log_directory() version check and only warn about the invalid
log page version number without disabling access to the log directory
page.

Fixes: 6d4405b16d37 ("ata: libata-core: Cache the general purpose log directory")
Cc: stable@vger.kernel.org
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220635
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Niklas Cassel <cassel@kernel.org>

authored by

Damien Le Moal and committed by
Niklas Cassel
12d724f2 3a866087

+10 -7
+4 -7
drivers/ata/libata-core.c
··· 2174 2174 } 2175 2175 2176 2176 version = get_unaligned_le16(&dev->gp_log_dir[0]); 2177 - if (version != 0x0001) { 2178 - ata_dev_err(dev, "Invalid log directory version 0x%04x\n", 2179 - version); 2180 - ata_clear_log_directory(dev); 2181 - dev->quirks |= ATA_QUIRK_NO_LOG_DIR; 2182 - return -EINVAL; 2183 - } 2177 + if (version != 0x0001) 2178 + ata_dev_warn_once(dev, 2179 + "Invalid log directory version 0x%04x\n", 2180 + version); 2184 2181 2185 2182 return 0; 2186 2183 }
+6
include/linux/libata.h
··· 1594 1594 #define ata_dev_dbg(dev, fmt, ...) \ 1595 1595 ata_dev_printk(debug, dev, fmt, ##__VA_ARGS__) 1596 1596 1597 + #define ata_dev_warn_once(dev, fmt, ...) \ 1598 + pr_warn_once("ata%u.%02u: " fmt, \ 1599 + (dev)->link->ap->print_id, \ 1600 + (dev)->link->pmp + (dev)->devno, \ 1601 + ##__VA_ARGS__) 1602 + 1597 1603 static inline void ata_print_version_once(const struct device *dev, 1598 1604 const char *version) 1599 1605 {