summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authordhain <none@none>2007-04-12 09:39:08 -0700
committerdhain <none@none>2007-04-12 09:39:08 -0700
commit1c070cc61610a26cde9ba1e3b72d1c83a2f1f505 (patch)
treef4b1bc77e07a5e6b11bb10c294c10bff56d8fa71 /usr/src
parent2278e7fc4650f16255db08e12d694bd293cc26d6 (diff)
downloadillumos-joyent-1c070cc61610a26cde9ba1e3b72d1c83a2f1f505.tar.gz
6525694 T2000 hangs at boot with S10u3 and three qlc PCI-E cards installed
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/devfs/devfs_vnops.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/usr/src/uts/common/fs/devfs/devfs_vnops.c b/usr/src/uts/common/fs/devfs/devfs_vnops.c
index c55295b0f6..e4d2a6150e 100644
--- a/usr/src/uts/common/fs/devfs/devfs_vnops.c
+++ b/usr/src/uts/common/fs/devfs/devfs_vnops.c
@@ -62,6 +62,7 @@
#include <fs/fs_subr.h>
#include <sys/fs/dv_node.h>
+#include <sys/sunndi.h>
extern struct vattr dv_vattr_dir, dv_vattr_file;
extern dev_t rconsdev;
@@ -861,6 +862,7 @@ devfs_readdir(struct vnode *dvp, struct uio *uiop, struct cred *cred, int *eofp)
int error;
struct vattr va;
size_t bufsz;
+ int circ;
ddv = VTODV(dvp);
dcmn_err2(("devfs_readdir %s: offset %lld len %ld\n",
@@ -882,6 +884,8 @@ devfs_readdir(struct vnode *dvp, struct uio *uiop, struct cred *cred, int *eofp)
/* Load the initial contents */
if (ddv->dv_flags & DV_BUILD) {
+ /* Lock the underlying devi structure */
+ ndi_devi_enter(ddv->dv_devi, &circ);
if (!rw_tryupgrade(&ddv->dv_contents)) {
rw_exit(&ddv->dv_contents);
rw_enter(&ddv->dv_contents, RW_WRITER);
@@ -892,6 +896,7 @@ devfs_readdir(struct vnode *dvp, struct uio *uiop, struct cred *cred, int *eofp)
dv_filldir(ddv);
rw_downgrade(&ddv->dv_contents);
+ ndi_devi_exit(ddv->dv_devi, circ);
}
soff = uiop->uio_loffset;