summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordh155122 <none@none>2007-04-16 19:43:30 -0700
committerdh155122 <none@none>2007-04-16 19:43:30 -0700
commit789e0dbbcdddab55f064dbca13950cb068a30efe (patch)
treee39c2a975459af378cbcae771ed4dae4e51793f9
parenta1e4879402b1a0a7c410577cff81f1ce31ace7af (diff)
downloadillumos-gate-789e0dbbcdddab55f064dbca13950cb068a30efe.tar.gz
6532455 ip-type exclusive IP instances with bge interfaces can't autoboot
6540253 libdladm should not rely on stat() to force a device to be attached 6543436 System panic due to assertion failed: qprocsareon(rq), file: ../../common/os/strsubr.c, line: 1210
-rw-r--r--usr/src/lib/libdladm/common/linkprop.c7
-rw-r--r--usr/src/uts/common/io/dld/dld_drv.c46
-rw-r--r--usr/src/uts/common/io/dld/dld_str.c2
3 files changed, 37 insertions, 18 deletions
diff --git a/usr/src/lib/libdladm/common/linkprop.c b/usr/src/lib/libdladm/common/linkprop.c
index 67b9f5e16c..0e0f990b7d 100644
--- a/usr/src/lib/libdladm/common/linkprop.c
+++ b/usr/src/lib/libdladm/common/linkprop.c
@@ -871,8 +871,6 @@ do_set_zone(const char *link, val_desc_t *vdp, uint_t val_cnt)
{
dladm_status_t status;
zoneid_t zid_old, zid_new;
- char buff[IF_NAMESIZE + 1];
- struct stat st;
if (val_cnt != 1)
return (DLADM_STATUS_BADVALCNT);
@@ -886,11 +884,6 @@ do_set_zone(const char *link, val_desc_t *vdp, uint_t val_cnt)
if (zid_new == zid_old)
return (DLADM_STATUS_OK);
- /* Do a stat to get the vlan created by MAC, if it's not there */
- (void) strcpy(buff, "/dev/");
- (void) strlcat(buff, link, IF_NAMESIZE);
- (void) stat(buff, &st);
-
if (zid_old != GLOBAL_ZONEID) {
if (dladm_rele_link(link, GLOBAL_ZONEID, B_TRUE) < 0)
return (dladm_errno2status(errno));
diff --git a/usr/src/uts/common/io/dld/dld_drv.c b/usr/src/uts/common/io/dld/dld_drv.c
index 6e3dc4eecc..f1fb5a0700 100644
--- a/usr/src/uts/common/io/dld/dld_drv.c
+++ b/usr/src/uts/common/io/dld/dld_drv.c
@@ -496,29 +496,55 @@ drv_hold_vlan(dld_ctl_str_t *ctls, mblk_t *mp)
queue_t *q = ctls->cs_wq;
dld_hold_vlan_t *dhv;
mblk_t *nmp;
- int err;
+ int err = EINVAL;
dls_vlan_t *dvp;
+ char mac[MAXNAMELEN];
+ dev_info_t *dip = NULL;
+ major_t major;
+ uint_t index;
nmp = mp->b_cont;
- if (nmp == NULL || MBLKL(nmp) < sizeof (dld_hold_vlan_t)) {
- err = EINVAL;
- miocnak(q, mp, 0, err);
- return;
- }
+ if (nmp == NULL || MBLKL(nmp) < sizeof (dld_hold_vlan_t))
+ goto failed;
+
dhv = (dld_hold_vlan_t *)nmp->b_rptr;
- if ((err = dls_vlan_hold(dhv->dhv_name, &dvp, B_TRUE)) != 0) {
- miocnak(q, mp, 0, err);
- return;
+ /*
+ * When a device instance without opens is detached, its
+ * dls_vlan_t will be destroyed. A subsequent DLDIOCHOLDVLAN
+ * invoked on this device instance will fail because
+ * dls_vlan_hold() does not create non-tagged vlans on demand.
+ * To handle this problem, we must force the creation of the
+ * dls_vlan_t (if it doesn't already exist) by calling
+ * ddi_hold_devi_by_instance() before calling dls_vlan_hold().
+ */
+ if (ddi_parse(dhv->dhv_name, mac, &index) != DDI_SUCCESS)
+ goto failed;
+
+ if (DLS_PPA2VID(index) == VLAN_ID_NONE && strcmp(mac, "aggr") != 0) {
+ if ((major = ddi_name_to_major(mac)) == (major_t)-1 ||
+ (dip = ddi_hold_devi_by_instance(major,
+ DLS_PPA2INST(index), 0)) == NULL)
+ goto failed;
}
+ err = dls_vlan_hold(dhv->dhv_name, &dvp, B_TRUE);
+ if (dip != NULL)
+ ddi_release_devi(dip);
+
+ if (err != 0)
+ goto failed;
+
if ((err = dls_vlan_setzoneid(dhv->dhv_name, dhv->dhv_zid,
dhv->dhv_docheck)) != 0) {
dls_vlan_rele(dvp);
- miocnak(q, mp, 0, err);
+ goto failed;
} else {
miocack(q, mp, 0, 0);
+ return;
}
+failed:
+ miocnak(q, mp, 0, err);
}
/*
diff --git a/usr/src/uts/common/io/dld/dld_str.c b/usr/src/uts/common/io/dld/dld_str.c
index 377e8c3be0..b150dd9344 100644
--- a/usr/src/uts/common/io/dld/dld_str.c
+++ b/usr/src/uts/common/io/dld/dld_str.c
@@ -288,7 +288,7 @@ dld_open(queue_t *rq, dev_t *devp, int flag, int sflag, cred_t *credp)
*/
t_uscalar_t ppa;
- if ((dls_ppa_from_minor(minor, &ppa)) != 0)
+ if ((err = dls_ppa_from_minor(minor, &ppa)) != 0)
goto failed;
if ((err = dld_str_attach(dsp, ppa)) != 0)