diff options
author | jg <none@none> | 2005-10-20 10:49:58 -0700 |
---|---|---|
committer | jg <none@none> | 2005-10-20 10:49:58 -0700 |
commit | 0466df5963f0f19c6c9e2d61d5f3797bc532c11b (patch) | |
tree | e3cf6d39fa4467353a3abc99b8bea35cc71796ed /usr/src | |
parent | 11a8fa6cb17403e630122ac19b39a323c6e64142 (diff) | |
download | illumos-gate-0466df5963f0f19c6c9e2d61d5f3797bc532c11b.tar.gz |
6338586 devfs misuses global rootvp
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/fs/devfs/devfs_subr.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/usr/src/uts/common/fs/devfs/devfs_subr.c b/usr/src/uts/common/fs/devfs/devfs_subr.c index 21f31a43b2..0f53a24ca0 100644 --- a/usr/src/uts/common/fs/devfs/devfs_subr.c +++ b/usr/src/uts/common/fs/devfs/devfs_subr.c @@ -1472,7 +1472,7 @@ devfs_reset_perm(uint_t flags) */ static int -devfs_remdrv_rmdir(vnode_t *dirvp, const char *dir, vnode_t *rootvp) +devfs_remdrv_rmdir(vnode_t *dirvp, const char *dir, vnode_t *rvp) { int error; vnode_t *vp; @@ -1537,10 +1537,10 @@ devfs_remdrv_rmdir(vnode_t *dirvp, const char *dir, vnode_t *rootvp) vp->v_type == VCHR || vp->v_type == VBLK); if (vp->v_type == VDIR) { - error = devfs_remdrv_rmdir(vp, nm, rootvp); + error = devfs_remdrv_rmdir(vp, nm, rvp); if (error == 0) { error = VOP_RMDIR(dirvp, - (char *)nm, rootvp, kcred); + (char *)nm, rvp, kcred); dsysdebug(error, ("rem_drv %s/%s rmdir (%d)\n", dir, nm, error)); @@ -1583,18 +1583,19 @@ devfs_remdrv_cleanup(const char *dir, const char *nodename) int nodenamelen = strlen(nodename); char *nm; struct pathname pn; + vnode_t *rvp; /* root node of the underlying attribute fs */ dcmn_err5(("devfs_remdrv_cleanup: %s %s\n", dir, nodename)); if (error = pn_get((char *)dir, UIO_SYSSPACE, &pn)) return (0); - rootvp = dvroot->dv_attrvp; - ASSERT(rootvp != NULL); - VN_HOLD(rootvp); + rvp = dvroot->dv_attrvp; + ASSERT(rvp != NULL); + VN_HOLD(rvp); pn_skipslash(&pn); - dirvp = rootvp; + dirvp = rvp; VN_HOLD(dirvp); nm = kmem_alloc(MAXNAMELEN, KM_SLEEP); @@ -1603,13 +1604,13 @@ devfs_remdrv_cleanup(const char *dir, const char *nodename) ASSERT(dirvp->v_type == VDIR); (void) pn_getcomponent(&pn, nm); ASSERT((strcmp(nm, ".") != 0) && (strcmp(nm, "..") != 0)); - error = VOP_LOOKUP(dirvp, nm, &vp, NULL, 0, rootvp, kcred); + error = VOP_LOOKUP(dirvp, nm, &vp, NULL, 0, rvp, kcred); if (error) { dcmn_err5(("remdrv_cleanup %s lookup error %d\n", nm, error)); VN_RELE(dirvp); - if (dirvp != rootvp) - VN_RELE(rootvp); + if (dirvp != rvp) + VN_RELE(rvp); pn_free(&pn); kmem_free(nm, MAXNAMELEN); return (0); @@ -1620,8 +1621,8 @@ devfs_remdrv_cleanup(const char *dir, const char *nodename) } ASSERT(dirvp->v_type == VDIR); - if (dirvp != rootvp) - VN_RELE(rootvp); + if (dirvp != rvp) + VN_RELE(rvp); pn_free(&pn); kmem_free(nm, MAXNAMELEN); @@ -1677,10 +1678,10 @@ devfs_remdrv_cleanup(const char *dir, const char *nodename) vp->v_type == VCHR || vp->v_type == VBLK); if (vp->v_type == VDIR) { - error = devfs_remdrv_rmdir(vp, nm, rootvp); + error = devfs_remdrv_rmdir(vp, nm, rvp); if (error == 0) { error = VOP_RMDIR(dirvp, - (char *)nm, rootvp, kcred); + (char *)nm, rvp, kcred); dsysdebug(error, ("rem_drv %s/%s rmdir (%d)\n", dir, nm, error)); |