From: Damien Le Moal <dlemoal@kernel.org>
To: linux-ide@vger.kernel.org, Niklas Cassel <cassel@kernel.org>
Subject: [PATCH] ata: libata-core: always apply all quirks matching for a device
Date: Thu, 15 Oct 2026 00:03:39 +0900 [thread overview]
Message-ID: <20261014150340.2410073-1-dlemoal@kernel.org> (raw)
ata_dev_quirks() uses the first entry in __ata_dev_quirks[] that
matches the device and ignores all later entries. Commit 38d431229bfb
("ata: libata: exclude FUA support for known buggy drives") appended
three ATA_QUIRK_NO_FUA entries to the end of the table, with model
patterns meant to cover whole product lines. Earlier entries already
match some or all of these drives, so NO_FUA is not always applied:
- "INTEL*SSDSC2CT*" never takes effect. Every model it matches also
matches the earlier "INTEL*SSD*" entry, so these drives only get
ATA_QUIRK_ZERO_AFTER_TRIM.
- "WDC*WD2500J*" does not take effect for "WDC WD2500JD-*" drives,
which match the earlier ATA_QUIRK_WD_BROKEN_LPM entry.
- "OCZ-VERTEX*" does not take effect for "OCZ-VERTEX" drives with
firmware "1.30", which match the earlier ATA_QUIRK_BROKEN_HPA entry.
Avoid this particular issue and make ata_dev_quirks() more solid by
getting all quirk flags from all entries of the __ata_dev_quirks array
matching the device model and firmware revision. With this change,
regardless of the order in which entries are added to the __ata_dev_quirks
array, all required quirk flags will always be applied to a device.
Fixes: 38d431229bfb ("ata: libata: exclude FUA support for known buggy drives")
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
drivers/ata/libata-core.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 682c58889715..e53a410a817e 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -4514,6 +4514,7 @@ static u64 ata_dev_quirks(const struct ata_device *dev)
unsigned char model_num[ATA_ID_PROD_LEN + 1];
unsigned char model_rev[ATA_ID_FW_REV_LEN + 1];
const struct ata_dev_quirks_entry *ad = __ata_dev_quirks;
+ u64 quirks = 0;
/* dev->quirks is an u64. */
BUILD_BUG_ON(__ATA_QUIRK_MAX > 64);
@@ -4521,16 +4522,18 @@ static u64 ata_dev_quirks(const struct ata_device *dev)
ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev));
+ /* Get the quirks for all matching entries */
while (ad->model_num) {
if (glob_match(ad->model_num, model_num) &&
(!ad->model_rev || glob_match(ad->model_rev, model_rev))) {
ata_dev_print_quirks(dev, model_num, model_rev,
ad->quirks);
- return ad->quirks;
+ quirks |= ad->quirks;
}
ad++;
}
- return 0;
+
+ return quirks;
}
static u64 ata_dev_get_max_sec_quirk_value(struct ata_device *dev)
--
2.55.0
next reply other threads:[~2026-10-14 15:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-14 15:03 Damien Le Moal [this message]
2026-10-14 15:11 ` [PATCH] ata: libata-core: always apply all quirks matching for a device sashiko-bot
2026-10-14 15:21 ` Damien Le Moal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261014150340.2410073-1-dlemoal@kernel.org \
--to=dlemoal@kernel.org \
--cc=cassel@kernel.org \
--cc=linux-ide@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.