From 54495a713bfea995556f9e1d6de5555fda458034 Mon Sep 17 00:00:00 2001 From: Jim Rees Date: Mon, 4 Nov 2002 23:35:37 +0000 Subject: [PATCH] openbsd-20021104 implement afs_root() --- src/afs/OBSD/osi_vfsops.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/afs/OBSD/osi_vfsops.c b/src/afs/OBSD/osi_vfsops.c index e2a5b93f1..e73a5c16e 100644 --- a/src/afs/OBSD/osi_vfsops.c +++ b/src/afs/OBSD/osi_vfsops.c @@ -300,11 +300,40 @@ int afs_root(struct mount *mp, struct vnode **vpp) { - int error; - error = afs_root(mp, vpp); - if (!error) - vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, curproc); /* return it locked */ - return error; + struct vrequest treq; + struct vcache *tvp; + int code; + + AFS_STATCNT(afs_root); + +#ifdef AFS_GLOBAL_SUNLOCK + mutex_enter(&afs_global_lock); +#endif + if (!(code = afs_InitReq(&treq, osi_curcred())) && + !(code = afs_CheckInit())) { + tvp = afs_GetVCache(&afs_rootFid, &treq, NULL, NULL); + if (tvp) { + /* There is really no reason to over-hold this bugger--it's held + by the root filesystem reference. */ + if (afs_globalVp != tvp) { + if (afs_globalVp) + AFS_RELE(AFSTOV(afs_globalVp)); + afs_globalVp = tvp; + AFS_HOLD(AFSTOV(afs_globalVp)); + } + AFSTOV(tvp)->v_flag |= VROOT; + afs_globalVFS = mp; + *vpp = AFSTOV(tvp); + } else + code = ENOENT; + } +#ifdef AFS_GLOBAL_SUNLOCK + mutex_exit(&afs_global_lock); +#endif + + if (!code) + vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, curproc); /* return it locked */ + return code; } int -- 2.39.5