svn commit: r332645 - head/sbin/ifconfig
Andrew Gallatin
gallatin at FreeBSD.org
Tue Apr 17 12:55:00 UTC 2018
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
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
More information about the svn-src-all
mailing list