Author: mav
Date: Wed Sep 16 09:59:05 2015
New Revision: 287855
URL: https://svnweb.freebsd.org/changeset/base/287855

Log:
  Don't flap the HA link if sysctl is reset to the same value.

Modified:
  head/sys/cam/ctl/ctl_ha.c

Modified: head/sys/cam/ctl/ctl_ha.c
==============================================================================
--- head/sys/cam/ctl/ctl_ha.c   Wed Sep 16 07:26:18 2015        (r287854)
+++ head/sys/cam/ctl/ctl_ha.c   Wed Sep 16 09:59:05 2015        (r287855)
@@ -622,28 +622,33 @@ ctl_ha_peer_sysctl(SYSCTL_HANDLER_ARGS)
        struct ha_softc *softc = (struct ha_softc *)arg1;
        struct sockaddr_in *sa;
        int error, b1, b2, b3, b4, p, num;
+       char buf[128];
 
-       error = sysctl_handle_string(oidp, softc->ha_peer,
-           sizeof(softc->ha_peer), req);
-       if ((error != 0) || (req->newptr == NULL))
+       strlcpy(buf, softc->ha_peer, sizeof(buf));
+       error = sysctl_handle_string(oidp, buf, sizeof(buf), req);
+       if ((error != 0) || (req->newptr == NULL) ||
+           strncmp(buf, softc->ha_peer, sizeof(buf)) == 0)
                return (error);
 
        sa = &softc->ha_peer_in;
        mtx_lock(&softc->ha_lock);
-       if ((num = sscanf(softc->ha_peer, "connect %d.%d.%d.%d:%d",
+       if ((num = sscanf(buf, "connect %d.%d.%d.%d:%d",
            &b1, &b2, &b3, &b4, &p)) >= 4) {
                softc->ha_connect = 1;
                softc->ha_listen = 0;
-       } else if ((num = sscanf(softc->ha_peer, "listen %d.%d.%d.%d:%d",
+       } else if ((num = sscanf(buf, "listen %d.%d.%d.%d:%d",
            &b1, &b2, &b3, &b4, &p)) >= 4) {
                softc->ha_connect = 0;
                softc->ha_listen = 1;
        } else {
                softc->ha_connect = 0;
                softc->ha_listen = 0;
-               if (softc->ha_peer[0] != 0)
+               if (buf[0] != 0) {
+                       buf[0] = 0;
                        error = EINVAL;
+               }
        }
+       strlcpy(softc->ha_peer, buf, sizeof(softc->ha_peer));
        if (softc->ha_connect || softc->ha_listen) {
                memset(sa, 0, sizeof(*sa));
                sa->sin_len = sizeof(struct sockaddr_in);
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to