diff options
author | sl108498 <none@none> | 2006-12-14 15:46:12 -0800 |
---|---|---|
committer | sl108498 <none@none> | 2006-12-14 15:46:12 -0800 |
commit | c1c0ebd597fd6db650197255bc1248c9f60afad8 (patch) | |
tree | 506d32f0a6e810933d277fae2b2741c032abe105 /usr/src/lib/libpool | |
parent | 16bd72582c60c40e83c55713078d05a462655a73 (diff) | |
download | illumos-joyent-c1c0ebd597fd6db650197255bc1248c9f60afad8.tar.gz |
6354498 rctl_local_replace_cb needs to remove new value when deletion fails
6504130 pool service not enabled when zone with tmp pool not booted before reboot
6504424 halting zones in parallel can fail, unable to unconfigure network interfaces
Diffstat (limited to 'usr/src/lib/libpool')
-rw-r--r-- | usr/src/lib/libpool/Makefile.com | 2 | ||||
-rw-r--r-- | usr/src/lib/libpool/common/pool.c | 27 |
2 files changed, 26 insertions, 3 deletions
diff --git a/usr/src/lib/libpool/Makefile.com b/usr/src/lib/libpool/Makefile.com index 0431dc906e..2468ac3cb2 100644 --- a/usr/src/lib/libpool/Makefile.com +++ b/usr/src/lib/libpool/Makefile.com @@ -44,7 +44,7 @@ include ../../Makefile.lib DYNFLAGS += -lxml2 LIBS = $(DYNLIB) $(LINTLIB) -LDLIBS += -lnvpair -lexacct -lc +LDLIBS += -lscf -lnvpair -lexacct -lc SRCDIR = ../common $(LINTLIB) := SRCS = $(SRCDIR)/$(LINTSRC) diff --git a/usr/src/lib/libpool/common/pool.c b/usr/src/lib/libpool/common/pool.c index 6fbd7b34d3..31e725e439 100644 --- a/usr/src/lib/libpool/common/pool.c +++ b/usr/src/lib/libpool/common/pool.c @@ -39,6 +39,7 @@ #include <errno.h> #include <ctype.h> #include <libintl.h> +#include <libscf.h> #include <pool.h> #include <signal.h> @@ -721,6 +722,7 @@ pool_set_status(int state) if (old_state != state) { int fd; pool_status_t status; + char *fmri; /* * Changing the status of pools is performed by enabling @@ -732,11 +734,12 @@ pool_set_status(int state) * synchronous using the library API as yet, so we use * the -s option provided by svcadm. */ - if (getenv("SMF_FMRI") == NULL) { + fmri = getenv("SMF_FMRI"); + if (fmri == NULL) { FILE *p; char *cmd; - if (state) { + if (state != 0) { cmd = "/usr/sbin/svcadm enable -s " \ SMF_SVC_INSTANCE; } else { @@ -755,6 +758,26 @@ pool_set_status(int state) return (PO_FAIL); } + /* + * If pools are being enabled/disabled by another smf service, + * enable the smf service instance. This must be done + * asynchronously as one service cannot synchronously + * enable/disable another. + */ + if (strcmp(fmri, SMF_SVC_INSTANCE) != 0) { + int res; + + if (state != 0) + res = smf_enable_instance(SMF_SVC_INSTANCE, 0); + else + res = smf_disable_instance(SMF_SVC_INSTANCE, 0); + + if (res != 0) { + (void) close(fd); + pool_seterror(POE_SYSTEM); + return (PO_FAIL); + } + } status.ps_io_state = state; if (ioctl(fd, POOL_STATUS, &status) < 0) { |