summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2000-12-06 01:45:20 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2000-12-06 01:45:20 +0000
commitf3a16450d01983343c03232124e6100c84effbd0 (patch)
treefa4d1c9ae8a7c4c229207e26daa0ce4f68f5deb0
parenta263238c86db701b3ed957d317e5a37acf739de9 (diff)
Notes
-rw-r--r--sys/coda/coda_psdev.c7
-rw-r--r--sys/coda/coda_venus.c4
-rw-r--r--sys/coda/coda_vnops.c3
-rw-r--r--sys/fs/coda/coda_psdev.c7
-rw-r--r--sys/fs/coda/coda_venus.c4
-rw-r--r--sys/fs/coda/coda_vnops.c3
6 files changed, 24 insertions, 4 deletions
diff --git a/sys/coda/coda_psdev.c b/sys/coda/coda_psdev.c
index 7d31eb8438c0..18fda00447a0 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 f27357498d45..e022a4d817b6 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 c2e6bcfbacff..496b58b34351 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),
diff --git a/sys/fs/coda/coda_psdev.c b/sys/fs/coda/coda_psdev.c
index 7d31eb8438c0..18fda00447a0 100644
--- a/sys/fs/coda/coda_psdev.c
+++ b/sys/fs/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/fs/coda/coda_venus.c b/sys/fs/coda/coda_venus.c
index f27357498d45..e022a4d817b6 100644
--- a/sys/fs/coda/coda_venus.c
+++ b/sys/fs/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/fs/coda/coda_vnops.c b/sys/fs/coda/coda_vnops.c
index c2e6bcfbacff..496b58b34351 100644
--- a/sys/fs/coda/coda_vnops.c
+++ b/sys/fs/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),