diff options
author | dh155122 <none@none> | 2007-04-16 19:43:30 -0700 |
---|---|---|
committer | dh155122 <none@none> | 2007-04-16 19:43:30 -0700 |
commit | 789e0dbbcdddab55f064dbca13950cb068a30efe (patch) | |
tree | e39c2a975459af378cbcae771ed4dae4e51793f9 | |
parent | a1e4879402b1a0a7c410577cff81f1ce31ace7af (diff) | |
download | illumos-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.c | 7 | ||||
-rw-r--r-- | usr/src/uts/common/io/dld/dld_drv.c | 46 | ||||
-rw-r--r-- | usr/src/uts/common/io/dld/dld_str.c | 2 |
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) |