From f31d0140944777649798625457c6e38cdd5f4b33 Mon Sep 17 00:00:00 2001 From: jhb Date: Wed, 6 Dec 2000 01:45:20 +0000 Subject: Protect accesses to member of struct proc with the proc lock. --- sys/coda/coda_psdev.c | 7 +++++-- sys/coda/coda_venus.c | 4 ++++ sys/coda/coda_vnops.c | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) (limited to 'sys/coda') diff --git a/sys/coda/coda_psdev.c b/sys/coda/coda_psdev.c index 7d31eb8..18fda00 100644 --- a/sys/coda/coda_psdev.c +++ b/sys/coda/coda_psdev.c @@ -488,7 +488,7 @@ coda_call(mntinfo, inSize, outSize, buffer) int error; #ifdef CTL_C struct proc *p = curproc; - sigset_t psig_omask = p->p_sigmask; + sigset_t psig_omask; sigset_t tempset; int i; #endif @@ -544,8 +544,10 @@ coda_call(mntinfo, inSize, outSize, buffer) can not do this. A better solution is necessary. */ i = 0; + PROC_LOCK(p); + psig_omask = p->p_sigmask; do { - error = tsleep(&vmp->vm_sleep, + error = msleep(&vmp->vm_sleep, &p->p_mtx, (coda_call_sleep|coda_pcatch), "coda_call", hz*2); if (error == 0) @@ -597,6 +599,7 @@ coda_call(mntinfo, inSize, outSize, buffer) } } while (error && i++ < 128 && VC_OPEN(vcp)); p->p_sigmask = psig_omask; + PROC_UNLOCK(p); #else (void) tsleep(&vmp->vm_sleep, coda_call_sleep, "coda_call", 0); #endif diff --git a/sys/coda/coda_venus.c b/sys/coda/coda_venus.c index f273574..e022a4d 100644 --- a/sys/coda/coda_venus.c +++ b/sys/coda/coda_venus.c @@ -93,9 +93,13 @@ #define INIT_IN(in, op, ident, p) \ (in)->opcode = (op); \ + if (p) \ + PROC_LOCK(p); \ (in)->pid = p ? p->p_pid : -1; \ (in)->pgid = p ? p->p_pgid : -1; \ (in)->sid = (p && p->p_session && p->p_session->s_leader) ? (p->p_session->s_leader->p_pid) : -1; \ + if (p) \ + PROC_UNLOCK(p); \ if (ident != NOCRED) { \ (in)->cred.cr_uid = ident->cr_uid; \ (in)->cred.cr_groupid = ident->cr_gid; \ diff --git a/sys/coda/coda_vnops.c b/sys/coda/coda_vnops.c index c2e6bcf..496b58b 100644 --- a/sys/coda/coda_vnops.c +++ b/sys/coda/coda_vnops.c @@ -431,7 +431,9 @@ coda_rdwr(vp, uiop, rw, ioflag, cred, p) * venus won't have the correct size of the core when * it's completely written. */ + PROC_LOCK(p); if (cp->c_inode != 0 && !(p && (p->p_acflag & ACORE))) { + PROC_UNLOCK(p); igot_internally = 1; error = coda_grab_vnode(cp->c_device, cp->c_inode, &cfvp); if (error) { @@ -445,6 +447,7 @@ coda_rdwr(vp, uiop, rw, ioflag, cred, p) VOP_UNLOCK(cfvp, 0, p); } else { + PROC_UNLOCK(p); opened_internally = 1; MARK_INT_GEN(CODA_OPEN_STATS); error = VOP_OPEN(vp, (rw == UIO_READ ? FREAD : FWRITE), -- cgit v1.1