From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Mon, 16 Sep 2024 19:29:13 -0400 Subject: [PATCH] multipathd: checker port_state before setting it. 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. Signed-off-by: Benjamin Marzinski --- multipathd/fpin_handlers.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/multipathd/fpin_handlers.c b/multipathd/fpin_handlers.c index d5f7594d..c5b9785f 100644 --- a/multipathd/fpin_handlers.c +++ b/multipathd/fpin_handlers.c @@ -168,8 +168,16 @@ 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; sysfs_attr_set_value(rport_dev, "port_state", - "Marginal", strlen("Marginal")); + marginal, sizeof(marginal) - 1); } /*Add the marginal devices info into the list and return 0 on success*/