Print this page
OS-3007 dlmgmtd needs to work with non-native zones
OS-1572
OS-375 i_dls_mgmt_upcall()/dlmgmt_zfop() deadlock in dlmgmtd
OS-375-1
OS-327
*** 20,29 ****
--- 20,30 ----
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2014 Joyent, Inc. All rights reserved.
*/
/*
* The dlmgmtd daemon is started by the datalink-management SMF service.
* This daemon is used to manage <link name, linkid> mapping and the
*** 123,141 ****
}
(void) dlmgmt_set_doorfd(B_FALSE);
dlmgmt_door_fd = -1;
}
! int
dlmgmt_door_attach(zoneid_t zoneid, char *rootdir)
{
int fd;
int err = 0;
char doorpath[MAXPATHLEN];
! (void) snprintf(doorpath, sizeof (doorpath), "%s%s", rootdir,
! DLMGMT_DOOR);
/*
* Create the door file for dlmgmtd.
*/
if ((fd = open(doorpath, O_CREAT|O_RDONLY, 0644)) == -1) {
--- 124,151 ----
}
(void) dlmgmt_set_doorfd(B_FALSE);
dlmgmt_door_fd = -1;
}
! static int
dlmgmt_door_attach(zoneid_t zoneid, char *rootdir)
{
int fd;
int err = 0;
char doorpath[MAXPATHLEN];
+ struct stat statbuf;
! /* Handle running in a non-native branded zone (i.e. has /native) */
! (void) snprintf(doorpath, sizeof (doorpath), "%s/native%s",
! rootdir, DLMGMT_TMPFS_DIR);
! if (stat(doorpath, &statbuf) == 0) {
! (void) snprintf(doorpath, sizeof (doorpath), "%s/native%s",
! rootdir, DLMGMT_DOOR);
! } else {
! (void) snprintf(doorpath, sizeof (doorpath), "%s%s",
! rootdir, DLMGMT_DOOR);
! }
/*
* Create the door file for dlmgmtd.
*/
if ((fd = open(doorpath, O_CREAT|O_RDONLY, 0644)) == -1) {
*** 190,211 ****
* Create the DLMGMT_TMPFS_DIR directory.
*/
(void) snprintf(tmpfsdir, sizeof (tmpfsdir), "%s%s", rootdir,
DLMGMT_TMPFS_DIR);
if (stat(tmpfsdir, &statbuf) < 0) {
if (mkdir(tmpfsdir, (mode_t)0755) < 0)
return (errno);
} else if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
return (ENOTDIR);
}
if ((chmod(tmpfsdir, 0755) < 0) ||
(chown(tmpfsdir, UID_DLADM, GID_NETADM) < 0)) {
return (EPERM);
}
! if ((err = dlmgmt_db_init(zoneid)) != 0)
return (err);
return (dlmgmt_door_attach(zoneid, rootdir));
}
/*
--- 200,229 ----
* Create the DLMGMT_TMPFS_DIR directory.
*/
(void) snprintf(tmpfsdir, sizeof (tmpfsdir), "%s%s", rootdir,
DLMGMT_TMPFS_DIR);
if (stat(tmpfsdir, &statbuf) < 0) {
+ if (mkdir(tmpfsdir, (mode_t)0755) < 0) {
+ /*
+ * Handle running in a non-native branded zone
+ * (i.e. has /native)
+ */
+ (void) snprintf(tmpfsdir, sizeof (tmpfsdir),
+ "%s/native%s", rootdir, DLMGMT_TMPFS_DIR);
if (mkdir(tmpfsdir, (mode_t)0755) < 0)
return (errno);
+ }
} else if ((statbuf.st_mode & S_IFMT) != S_IFDIR) {
return (ENOTDIR);
}
if ((chmod(tmpfsdir, 0755) < 0) ||
(chown(tmpfsdir, UID_DLADM, GID_NETADM) < 0)) {
return (EPERM);
}
! if ((err = dlmgmt_db_init(zoneid, rootdir)) != 0)
return (err);
return (dlmgmt_door_attach(zoneid, rootdir));
}
/*
*** 212,222 ****
* Initialize each running zone.
*/
static int
dlmgmt_allzones_init(void)
{
! int err, i;
zoneid_t *zids = NULL;
uint_t nzids, nzids_saved;
if (zone_list(NULL, &nzids) != 0)
return (errno);
--- 230,240 ----
* Initialize each running zone.
*/
static int
dlmgmt_allzones_init(void)
{
! int i;
zoneid_t *zids = NULL;
uint_t nzids, nzids_saved;
if (zone_list(NULL, &nzids) != 0)
return (errno);
*** 233,247 ****
free(zids);
goto again;
}
for (i = 0; i < nzids; i++) {
! if ((err = dlmgmt_zone_init(zids[i])) != 0)
break;
}
free(zids);
! return (err);
}
static int
dlmgmt_init(void)
{
--- 251,291 ----
free(zids);
goto again;
}
for (i = 0; i < nzids; i++) {
! int res;
! zone_status_t status;
!
! /*
! * Skip over zones that have gone away or are going down
! * since we got the list. Process all zones in the list,
! * logging errors for any that failed.
! */
! if (zone_getattr(zids[i], ZONE_ATTR_STATUS, &status,
! sizeof (status)) < 0)
! continue;
! switch (status) {
! case ZONE_IS_SHUTTING_DOWN:
! case ZONE_IS_EMPTY:
! case ZONE_IS_DOWN:
! case ZONE_IS_DYING:
! case ZONE_IS_DEAD:
! /* FALLTHRU */
! continue;
! default:
break;
}
+ if ((res = dlmgmt_zone_init(zids[i])) != 0) {
+ (void) fprintf(stderr, "zone (%ld) init error %s",
+ zids[i], strerror(res));
+ dlmgmt_log(LOG_ERR, "zone (%d) init error %s",
+ zids[i], strerror(res));
+ }
+ }
free(zids);
! return (0);
}
static int
dlmgmt_init(void)
{
*** 260,269 ****
--- 304,315 ----
dlmgmt_log(LOG_ERR, "signal() for SIGTERM/INT failed: %s",
strerror(err));
return (err);
}
+ (void) unlink(ZONE_LOCK);
+
/*
* First derive the name of the cache file from the FMRI name. This
* cache name is used to keep active datalink configuration.
*/
if (debug) {