On Tue, Sep 17, 2024 at 11:58:58AM -0400, Benjamin Marzinski wrote:
> If the rport port_state is already Marginal, trying to set it to
> Marginal causes an error like the following:
> 
> multipathd[365376]: 
> /sys/devices/pci0000:c0/0000:c0:01.1/0000:c4:00.0/host0/rport-0:0-5/fc_remote_ports/rport-0:0-5:
>  failed to set port_state to marginal: Invalid argument
> 
> To avoid causing this confusing error message, check if the port_state
> is already marginal before trying to set it.
> 
> Cc: Muneendra Kumar <muneendra.ku...@broadcom.com>
> Signed-off-by: Benjamin Marzinski <bmarz...@redhat.com>

Ping. My in-kernel fix for this was accepted, but it would be nice to
have this work on older kernels as well.

-Ben

> ---
>  multipathd/fpin_handlers.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/multipathd/fpin_handlers.c b/multipathd/fpin_handlers.c
> index be087ca0..6b56f9b7 100644
> --- a/multipathd/fpin_handlers.c
> +++ b/multipathd/fpin_handlers.c
> @@ -169,9 +169,14 @@ fpin_els_add_li_frame(struct fc_nl_event *fc_event)
>  /*Sets the rport port_state to marginal*/
>  static void fpin_set_rport_marginal(struct udev_device *rport_dev)
>  {
> +     char old_value[20]; /* match kernel show_fc_rport_port_state() size */
>       static const char marginal[] = "Marginal";
>       ssize_t ret;
>  
> +     ret = sysfs_attr_get_value(rport_dev, "port_state",
> +                                old_value, sizeof(old_value));
> +     if (ret == sizeof(marginal) - 1 && strcmp(old_value, marginal) == 0)
> +             return;
>       ret = sysfs_attr_set_value(rport_dev, "port_state",
>                                  marginal, sizeof(marginal) - 1);
>       if (ret != sizeof(marginal) - 1)
> -- 
> 2.45.0
> 


Reply via email to