scsi: scsi_dh_alua: Prevent duplicate pg info print in alua_rtpg()
authorJohn Pittman <jpittman@redhat.com>
Wed, 31 Mar 2021 18:16:56 +0000 (14:16 -0400)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 6 Apr 2021 03:20:38 +0000 (23:20 -0400)
Due to the frequency that alua_rtpg() is called, the path group info print
within can print the same info multiple times in the logs, subsequent
prints adding no new information or value.

To reproduce:

    # modprobe scsi_debug vpd_use_hostno=0
    # systemctl start multipathd.service

To fix, check stored values, only printing at alua attach/activate and if
any of the values change.

Link: https://lore.kernel.org/r/20210331181656.5046-1-jpittman@redhat.com
Reviewed-by: David Jeffery <djeffery@redhat.com>
Reviewed-by: Laurence Oberman <loberman@redhat.com>
Signed-off-by: John Pittman <jpittman@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/device_handler/scsi_dh_alua.c

index ea436a1..7438ed4 100644 (file)
@@ -515,6 +515,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
        struct scsi_sense_hdr sense_hdr;
        struct alua_port_group *tmp_pg;
        int len, k, off, bufflen = ALUA_RTPG_SIZE;
+       int group_id_old, state_old, pref_old, valid_states_old;
        unsigned char *desc, *buff;
        unsigned err, retval;
        unsigned int tpg_desc_tbl_off;
@@ -522,6 +523,11 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
        unsigned long flags;
        bool transitioning_sense = false;
 
+       group_id_old = pg->group_id;
+       state_old = pg->state;
+       pref_old = pg->pref;
+       valid_states_old = pg->valid_states;
+
        if (!pg->expiry) {
                unsigned long transition_tmo = ALUA_FAILOVER_TIMEOUT * HZ;
 
@@ -686,17 +692,19 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
        if (transitioning_sense)
                pg->state = SCSI_ACCESS_STATE_TRANSITIONING;
 
-       sdev_printk(KERN_INFO, sdev,
-                   "%s: port group %02x state %c %s supports %c%c%c%c%c%c%c\n",
-                   ALUA_DH_NAME, pg->group_id, print_alua_state(pg->state),
-                   pg->pref ? "preferred" : "non-preferred",
-                   pg->valid_states&TPGS_SUPPORT_TRANSITION?'T':'t',
-                   pg->valid_states&TPGS_SUPPORT_OFFLINE?'O':'o',
-                   pg->valid_states&TPGS_SUPPORT_LBA_DEPENDENT?'L':'l',
-                   pg->valid_states&TPGS_SUPPORT_UNAVAILABLE?'U':'u',
-                   pg->valid_states&TPGS_SUPPORT_STANDBY?'S':'s',
-                   pg->valid_states&TPGS_SUPPORT_NONOPTIMIZED?'N':'n',
-                   pg->valid_states&TPGS_SUPPORT_OPTIMIZED?'A':'a');
+       if (group_id_old != pg->group_id || state_old != pg->state ||
+               pref_old != pg->pref || valid_states_old != pg->valid_states)
+               sdev_printk(KERN_INFO, sdev,
+                       "%s: port group %02x state %c %s supports %c%c%c%c%c%c%c\n",
+                       ALUA_DH_NAME, pg->group_id, print_alua_state(pg->state),
+                       pg->pref ? "preferred" : "non-preferred",
+                       pg->valid_states&TPGS_SUPPORT_TRANSITION?'T':'t',
+                       pg->valid_states&TPGS_SUPPORT_OFFLINE?'O':'o',
+                       pg->valid_states&TPGS_SUPPORT_LBA_DEPENDENT?'L':'l',
+                       pg->valid_states&TPGS_SUPPORT_UNAVAILABLE?'U':'u',
+                       pg->valid_states&TPGS_SUPPORT_STANDBY?'S':'s',
+                       pg->valid_states&TPGS_SUPPORT_NONOPTIMIZED?'N':'n',
+                       pg->valid_states&TPGS_SUPPORT_OPTIMIZED?'A':'a');
 
        switch (pg->state) {
        case SCSI_ACCESS_STATE_TRANSITIONING: