diff options
Diffstat (limited to 'usr/src/uts/common/io/devinfo.c')
| -rw-r--r-- | usr/src/uts/common/io/devinfo.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/usr/src/uts/common/io/devinfo.c b/usr/src/uts/common/io/devinfo.c index a61d0b1bfa..1672e5311a 100644 --- a/usr/src/uts/common/io/devinfo.c +++ b/usr/src/uts/common/io/devinfo.c @@ -18,13 +18,12 @@ * * CDDL HEADER END */ + /* * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - /* * driver for accessing kernel devinfo tree. */ @@ -364,7 +363,7 @@ static struct dev_ops di_ops = { */ static struct modldrv modldrv = { &mod_driverops, - "DEVINFO Driver %I%", + "DEVINFO Driver", &di_ops }; @@ -2951,8 +2950,22 @@ di_getprop_add(int list, int dyn, struct di_state *st, struct dev_info *dip, pflags = aflags & ~DDI_PROP_TYPE_MASK; pflags |= DDI_PROP_DONTPASS | DDI_PROP_NOTPROM | DDI_PROP_CONSUMER_TYPED; - rv = (*prop_op)(pdevt, (dev_info_t)dip, PROP_LEN_AND_VAL_ALLOC, - pflags, name, &val, &len); + + /* + * Hold and exit across prop_op(9E) to avoid lock order + * issues between + * [ndi_devi_enter() ..prop_op(9E).. driver-lock] + * .vs. + * [..ioctl(9E).. driver-lock ..ddi_remove_minor_node(9F).. + * ndi_devi_enter()] + * ordering. + */ + ndi_hold_devi((dev_info_t *)dip); + ndi_devi_exit((dev_info_t *)dip, dip->devi_circular); + rv = (*prop_op)(pdevt, (dev_info_t *)dip, + PROP_LEN_AND_VAL_ALLOC, pflags, name, &val, &len); + ndi_devi_enter((dev_info_t *)dip, &dip->devi_circular); + ndi_rele_devi((dev_info_t *)dip); if (rv == DDI_PROP_SUCCESS) { need_free = 1; /* dynamic prop obtained */ |
