svn commit: r332645 - head/sbin/ifconfig
Kubilay Kocak
koobs at FreeBSD.org
Tue Apr 17 13:47:49 UTC 2018
On 17/04/2018 10:54 pm, Andrew Gallatin wrote:
> Author: gallatin
> Date: Tue Apr 17 12:54:58 2018
> New Revision: 332645
> URL: https://svnweb.freebsd.org/changeset/base/332645
>
> Log:
> Make lagg creation more fault tolerant
>
> - Warn, don't exit, when SIOCSLAGGPORT returns an error.
>
> When we exit with an error during lagg creation, a single
> failed NIC (which no longer attaches) can prevent lagg
> creation and other configuration, such as adding an IPv4
> address, and thus leave a machine unreachable.
>
> - Preserve non-EEXISTS errors for exit status from SIOCSLAGGPORT,
> in case scripts are looking for it. Hopefully this can be
> extended if other parts of ifconfig can allow a "soft" failure.
>
> - Improve the warning message to mention what lagg and what
> member are problematic.
>
> Reviewed by: jtl, glebius
> Sponsored by: Netflix
> Differential Revision: https://reviews.freebsd.org/D15046
MFC please?
> Modified:
> head/sbin/ifconfig/ifclone.c
> head/sbin/ifconfig/ifconfig.c
> head/sbin/ifconfig/ifconfig.h
> head/sbin/ifconfig/ifgroup.c
> head/sbin/ifconfig/iflagg.c
>
> Modified: head/sbin/ifconfig/ifclone.c
> ==============================================================================
> --- head/sbin/ifconfig/ifclone.c Tue Apr 17 12:52:30 2018 (r332644)
> +++ head/sbin/ifconfig/ifclone.c Tue Apr 17 12:54:58 2018 (r332645)
> @@ -181,7 +181,7 @@ static void
> clone_Copt_cb(const char *optarg __unused)
> {
> list_cloners();
> - exit(0);
> + exit(exit_code);
> }
> static struct option clone_Copt = { .opt = "C", .opt_usage = "[-C]", .cb = clone_Copt_cb };
>
>
> Modified: head/sbin/ifconfig/ifconfig.c
> ==============================================================================
> --- head/sbin/ifconfig/ifconfig.c Tue Apr 17 12:52:30 2018 (r332644)
> +++ head/sbin/ifconfig/ifconfig.c Tue Apr 17 12:54:58 2018 (r332645)
> @@ -99,6 +99,7 @@ int printifname = 0;
>
> int supmedia = 0;
> int printkeys = 0; /* Print keying material for interfaces. */
> +int exit_code = 0;
>
> /* Formatter Strings */
> char *f_inet, *f_inet6, *f_ether, *f_addr;
> @@ -485,7 +486,7 @@ main(int argc, char *argv[])
> errx(1, "%s: cloning name too long",
> ifname);
> ifconfig(argc, argv, 1, NULL);
> - exit(0);
> + exit(exit_code);
> }
> #ifdef JAIL
> /*
> @@ -499,7 +500,7 @@ main(int argc, char *argv[])
> errx(1, "%s: interface name too long",
> ifname);
> ifconfig(argc, argv, 0, NULL);
> - exit(0);
> + exit(exit_code);
> }
> #endif
> errx(1, "interface %s does not exist", ifname);
> @@ -597,7 +598,7 @@ main(int argc, char *argv[])
> freeifaddrs(ifap);
>
> freeformat();
> - exit(0);
> + exit(exit_code);
> }
>
> static struct afswtch *afs = NULL;
>
> Modified: head/sbin/ifconfig/ifconfig.h
> ==============================================================================
> --- head/sbin/ifconfig/ifconfig.h Tue Apr 17 12:52:30 2018 (r332644)
> +++ head/sbin/ifconfig/ifconfig.h Tue Apr 17 12:54:58 2018 (r332645)
> @@ -136,6 +136,7 @@ extern int printkeys;
> extern int newaddr;
> extern int verbose;
> extern int printifname;
> +extern int exit_code;
>
> void setifcap(const char *, int value, int s, const struct afswtch *);
>
>
> Modified: head/sbin/ifconfig/ifgroup.c
> ==============================================================================
> --- head/sbin/ifconfig/ifgroup.c Tue Apr 17 12:52:30 2018 (r332644)
> +++ head/sbin/ifconfig/ifgroup.c Tue Apr 17 12:54:58 2018 (r332645)
> @@ -140,7 +140,7 @@ printgroup(const char *groupname)
> if (ioctl(s, SIOCGIFGMEMB, (caddr_t)&ifgr) == -1) {
> if (errno == EINVAL || errno == ENOTTY ||
> errno == ENOENT)
> - exit(0);
> + exit(exit_code);
> else
> err(1, "SIOCGIFGMEMB");
> }
> @@ -159,7 +159,7 @@ printgroup(const char *groupname)
> }
> free(ifgr.ifgr_groups);
>
> - exit(0);
> + exit(exit_code);
> }
>
> static struct cmd group_cmds[] = {
>
> Modified: head/sbin/ifconfig/iflagg.c
> ==============================================================================
> --- head/sbin/ifconfig/iflagg.c Tue Apr 17 12:52:30 2018 (r332644)
> +++ head/sbin/ifconfig/iflagg.c Tue Apr 17 12:54:58 2018 (r332645)
> @@ -41,9 +41,17 @@ setlaggport(const char *val, int d, int s, const struc
> strlcpy(rp.rp_ifname, name, sizeof(rp.rp_ifname));
> strlcpy(rp.rp_portname, val, sizeof(rp.rp_portname));
>
> - /* Don't choke if the port is already in this lagg. */
> - if (ioctl(s, SIOCSLAGGPORT, &rp) && errno != EEXIST)
> - err(1, "SIOCSLAGGPORT");
> + /*
> + * Do not exit with an error here. Doing so permits a
> + * failed NIC to take down an entire lagg.
> + *
> + * Don't error at all if the port is already in the lagg.
> + */
> + if (ioctl(s, SIOCSLAGGPORT, &rp) && errno != EEXIST) {
> + warnx("%s %s: SIOCSLAGGPORT: %s",
> + name, val, strerror(errno));
> + exit_code = 1;
> + }
> }
>
> static void
> _______________________________________________
> svn-src-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"
>
More information about the svn-src-head
mailing list