summaryrefslogtreecommitdiffstats
path: root/sys/coda
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2000-12-15 00:12:30 +0000
committerjhb <jhb@FreeBSD.org>2000-12-15 00:12:30 +0000
commite086882f9137cb74515a9c9ce90d600e9456abb7 (patch)
tree47918ee284d126dd62cc86be43b960291f488b73 /sys/coda
parent03f20c1a8474364ab08db8ce1b0118705eb6f011 (diff)
downloadFreeBSD-src-e086882f9137cb74515a9c9ce90d600e9456abb7.zip
FreeBSD-src-e086882f9137cb74515a9c9ce90d600e9456abb7.tar.gz
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.
Diffstat (limited to 'sys/coda')
-rw-r--r--sys/coda/coda_vfsops.c16
1 files changed, 14 insertions, 2 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));)
OpenPOWER on IntegriCloud