From e086882f9137cb74515a9c9ce90d600e9456abb7 Mon Sep 17 00:00:00 2001 From: jhb Date: Fri, 15 Dec 2000 00:12:30 +0000 Subject: When p_ucred is passed to the venus daemon, first grab the proc lock to protect the p_ucred pointer, obtain a seperate reference to the ucred, release the lock, and then pass in the new ucred reference. --- sys/coda/coda_vfsops.c | 16 ++++++++++++++-- sys/fs/coda/coda_vfsops.c | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/sys/coda/coda_vfsops.c b/sys/coda/coda_vfsops.c index 8fa46ff..b426e8e 100644 --- a/sys/coda/coda_vfsops.c +++ b/sys/coda/coda_vfsops.c @@ -294,6 +294,7 @@ coda_root(vfsp, vpp) int error; struct proc *p = curproc; /* XXX - bnoble */ ViceFid VFid; + struct ucred* uc; ENTRY; MARK_ENTRY(CODA_ROOT_STATS); @@ -317,7 +318,12 @@ coda_root(vfsp, vpp) } } - error = venus_root(vftomi(vfsp), p->p_ucred, p, &VFid); + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = venus_root(vftomi(vfsp), uc, p, &VFid); + crfree(uc); if (!error) { /* @@ -443,6 +449,7 @@ coda_fhtovp(vfsp, fhp, nam, vpp, exflagsp, creadanonp) int error; struct proc *p = curproc; /* XXX -mach */ ViceFid VFid; + struct ucred *uc; int vtype; ENTRY; @@ -456,7 +463,12 @@ coda_fhtovp(vfsp, fhp, nam, vpp, exflagsp, creadanonp) return(0); } - error = venus_fhtovp(vftomi(vfsp), &cfid->cfid_fid, p->p_ucred, p, &VFid, &vtype); + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = venus_fhtovp(vftomi(vfsp), &cfid->cfid_fid, uc, p, &VFid, &vtype); + crfree(uc); if (error) { CODADEBUG(CODA_VGET, myprintf(("vget error %d\n",error));) diff --git a/sys/fs/coda/coda_vfsops.c b/sys/fs/coda/coda_vfsops.c index 8fa46ff..b426e8e 100644 --- a/sys/fs/coda/coda_vfsops.c +++ b/sys/fs/coda/coda_vfsops.c @@ -294,6 +294,7 @@ coda_root(vfsp, vpp) int error; struct proc *p = curproc; /* XXX - bnoble */ ViceFid VFid; + struct ucred* uc; ENTRY; MARK_ENTRY(CODA_ROOT_STATS); @@ -317,7 +318,12 @@ coda_root(vfsp, vpp) } } - error = venus_root(vftomi(vfsp), p->p_ucred, p, &VFid); + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = venus_root(vftomi(vfsp), uc, p, &VFid); + crfree(uc); if (!error) { /* @@ -443,6 +449,7 @@ coda_fhtovp(vfsp, fhp, nam, vpp, exflagsp, creadanonp) int error; struct proc *p = curproc; /* XXX -mach */ ViceFid VFid; + struct ucred *uc; int vtype; ENTRY; @@ -456,7 +463,12 @@ coda_fhtovp(vfsp, fhp, nam, vpp, exflagsp, creadanonp) return(0); } - error = venus_fhtovp(vftomi(vfsp), &cfid->cfid_fid, p->p_ucred, p, &VFid, &vtype); + PROC_LOCK(p); + uc = p->p_ucred; + crhold(uc); + PROC_UNLOCK(p); + error = venus_fhtovp(vftomi(vfsp), &cfid->cfid_fid, uc, p, &VFid, &vtype); + crfree(uc); if (error) { CODADEBUG(CODA_VGET, myprintf(("vget error %d\n",error));) -- cgit v1.1