]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ata: libata: Print device quirks only once
authorDamien Le Moal <dlemoal@kernel.org>
Thu, 1 Aug 2024 09:04:22 +0000 (18:04 +0900)
committerDamien Le Moal <dlemoal@kernel.org>
Fri, 2 Aug 2024 00:29:55 +0000 (09:29 +0900)
In ata_dev_print_quirks(), return early if ata_dev_print_info() returns
false or if we already printed quirk information. This is to avoid
printing a device quirks multiple times (that is, each time
ata_dev_revalidate() is called).

To remember if ata_dev_print_quirks() was already executed, define the
EH context flag ATA_EHI_DID_PRINT_QUIRKS and set this flag in
ata_dev_print_quirks().

Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
Fixes: 58157d607aec ("ata: libata: Print quirks applied to devices")
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>
drivers/ata/libata-core.c
include/linux/libata.h

index b4fdb78579c8f93264968c61a66b7a5d402679f4..e4023fc288ac28785ee677c349004fc331865a44 100644 (file)
@@ -160,7 +160,7 @@ MODULE_DESCRIPTION("Library module for ATA devices");
 MODULE_LICENSE("GPL");
 MODULE_VERSION(DRV_VERSION);
 
-static inline bool ata_dev_print_info(struct ata_device *dev)
+static inline bool ata_dev_print_info(const struct ata_device *dev)
 {
        struct ata_eh_context *ehc = &dev->link->eh_context;
 
@@ -4025,10 +4025,16 @@ static void ata_dev_print_quirks(const struct ata_device *dev,
                                 const char *model, const char *rev,
                                 unsigned int quirks)
 {
+       struct ata_eh_context *ehc = &dev->link->eh_context;
        int n = 0, i;
        size_t sz;
        char *str;
 
+       if (!ata_dev_print_info(dev) || ehc->i.flags & ATA_EHI_DID_PRINT_QUIRKS)
+               return;
+
+       ehc->i.flags |= ATA_EHI_DID_PRINT_QUIRKS;
+
        if (!quirks)
                return;
 
index d5446e18d9dfff9eb6ba03024b8ec5786cd391a4..0279c0a6302f81200bedd8baa4fe09c7a454460f 100644 (file)
@@ -378,6 +378,7 @@ enum {
        ATA_EHI_PRINTINFO       = (1 << 18), /* print configuration info */
        ATA_EHI_SETMODE         = (1 << 19), /* configure transfer mode */
        ATA_EHI_POST_SETMODE    = (1 << 20), /* revalidating after setmode */
+       ATA_EHI_DID_PRINT_QUIRKS = (1 << 21), /* already printed quirks info */
 
        ATA_EHI_DID_RESET       = ATA_EHI_DID_SOFTRESET | ATA_EHI_DID_HARDRESET,