int linprocfs_allocvp (struct mount *, struct vnode **, long, pfstype);
int linprocfs_sstep (struct proc *);
void linprocfs_fix_sstep (struct proc *);
+struct proc *linprocfs_pfind(pid_t pfs_pid);
#if 0
int linprocfs_read_regs (struct proc *, struct reg *);
int linprocfs_write_regs (struct proc *, struct reg *);
return (0);
}
+/*
+ * Try to find the calling pid. Note that pfind()
+ * now references the proc structure to be returned
+ * and needs to be released later with PRELE().
+ */
+struct proc *
+linprocfs_pfind(pid_t pfs_pid)
+{
+ struct proc *p = NULL;
+
+ if (pfs_pid == 0) {
+ p = &proc0;
+ PHOLD(p);
+ } else {
+ p = pfind(pfs_pid);
+ }
+
+ return p;
+}
+
int
linprocfs_rw(struct vop_read_args *ap)
{
curp = td->td_proc;
KKASSERT(curp);
- p = pfind(pfs->pfs_pid);
- if (p == NULL)
- return (EINVAL);
+ p = linprocfs_pfind(pfs->pfs_pid);
+ if (p == NULL) {
+ rtval = EINVAL;
+ goto out;
+ }
if (p->p_pid == 1 && securelevel > 0 && uio->uio_rw == UIO_WRITE) {
- PRELE(p);
- return (EACCES);
+ rtval = EACCES;
+ goto out;
}
lp = FIRST_LWP_IN_PROC(p);
LWPHOLD(lp);
break;
}
LWPRELE(lp);
- PRELE(p);
lwkt_gettoken(&pfs_token);
pfs->pfs_lockowner = NULL;
wakeup(&pfs->pfs_lockowner);
lwkt_reltoken(&pfs_token);
+out:
+ if (p)
+ PRELE(p);
return rtval;
}
struct pfsnode *pfs = VTOPFS(ap->a_vp);
struct proc *p2;
- p2 = PFIND(pfs->pfs_pid);
+ p2 = linprocfs_pfind(pfs->pfs_pid);
if (p2 == NULL)
return (ENOENT);
if (pfs->pfs_pid && !PRISON_CHECK(ap->a_cred, p2->p_ucred))
*/
p = NULL;
if ((ap->a_vp->v_opencount < 2)
- && (p = pfind(pfs->pfs_pid))
+ && (p = linprocfs_pfind(pfs->pfs_pid))
&& !(p->p_pfsflags & PF_LINGER)) {
p->p_stops = 0;
p->p_step = 0;
struct procfs_status *psp;
unsigned char flags;
- procp = pfind(pfs->pfs_pid);
+ procp = linprocfs_pfind(pfs->pfs_pid);
if (procp == NULL) {
return ENOTTY;
}
break;
default:
- procp = PFIND(pfs->pfs_pid);
+ procp = linprocfs_pfind(pfs->pfs_pid);
if (procp == NULL || procp->p_ucred == NULL)
return (ENOENT);
}
if (pid == NO_PID)
break;
- p = PFIND(pid);
+ p = linprocfs_pfind(pid);
if (p == NULL)
break;
goto out;
}
- p = PFIND(pfs->pfs_pid);
+ p = linprocfs_pfind(pfs->pfs_pid);
if (p == NULL)
break;
struct uio *uio = ap->a_uio;
pfs = VTOPFS(ap->a_vp);
- p = PFIND(pfs->pfs_pid);
+ p = linprocfs_pfind(pfs->pfs_pid);
if (p == NULL)
return(0);
if (!PRISON_CHECK(ap->a_cred, p->p_ucred))
* from under us...
*/
case Pexe:
- procp = PFIND(pfs->pfs_pid);
+ procp = linprocfs_pfind(pfs->pfs_pid);
if (procp == NULL || procp->p_ucred == NULL) {
kprintf("linprocfs_readlink: pid %d disappeared\n",
pfs->pfs_pid);
kfree(freepath, M_TEMP);
return (error);
case Pcwd:
- procp = PFIND(pfs->pfs_pid);
+ procp = linprocfs_pfind(pfs->pfs_pid);
if (procp == NULL || procp->p_ucred == NULL) {
kprintf("linprocfs_readlink: pid %d disappeared\n",
pfs->pfs_pid);
kfree(freepath, M_TEMP);
return (error);
case Pprocroot:
- procp = PFIND(pfs->pfs_pid);
+ procp = linprocfs_pfind(pfs->pfs_pid);
if (procp == NULL || procp->p_ucred == NULL) {
kprintf("linprocfs_readlink: pid %d disappeared\n",
pfs->pfs_pid);
kfree(freepath, M_TEMP);
return (error);
case Pfd:
- procp = PFIND(pfs->pfs_pid);
+ procp = linprocfs_pfind(pfs->pfs_pid);
if (procp == NULL || procp->p_ucred == NULL) {
kprintf("linprocfs_readlink: pid %d disappeared\n",
pfs->pfs_pid);