Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/miscfs/procfs add a task process subdirectory for emul l...
details: https://anonhg.NetBSD.org/src/rev/df74c6e30113
branches: trunk
changeset: 779444:df74c6e30113
user: christos <christos%NetBSD.org@localhost>
date: Mon May 28 13:16:10 2012 +0000
description:
add a task process subdirectory for emul linux
diffstat:
sys/miscfs/procfs/procfs.h | 3 +-
sys/miscfs/procfs/procfs_subr.c | 14 +++-
sys/miscfs/procfs/procfs_vnops.c | 108 +++++++++++++++++++++++++++++++++++++-
3 files changed, 117 insertions(+), 8 deletions(-)
diffs (230 lines):
diff -r d2688a3aa115 -r df74c6e30113 sys/miscfs/procfs/procfs.h
--- a/sys/miscfs/procfs/procfs.h Mon May 28 09:51:34 2012 +0000
+++ b/sys/miscfs/procfs/procfs.h Mon May 28 13:16:10 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs.h,v 1.67 2011/09/27 01:23:59 christos Exp $ */
+/* $NetBSD: procfs.h,v 1.68 2012/05/28 13:16:10 christos Exp $ */
/*
* Copyright (c) 1993
@@ -109,6 +109,7 @@
PFSloadavg, /* load average (if -o linux) */
PFSstatm, /* process memory info (if -o linux) */
PFSversion, /* kernel version (if -o linux) */
+ PFStask, /* task subdirector (if -o linux) */
#ifdef __HAVE_PROCFS_MACHDEP
PROCFS_MACHDEP_NODE_TYPES
#endif
diff -r d2688a3aa115 -r df74c6e30113 sys/miscfs/procfs/procfs_subr.c
--- a/sys/miscfs/procfs/procfs_subr.c Mon May 28 09:51:34 2012 +0000
+++ b/sys/miscfs/procfs/procfs_subr.c Mon May 28 13:16:10 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_subr.c,v 1.100 2011/09/04 17:32:10 jmcneill Exp $ */
+/* $NetBSD: procfs_subr.c,v 1.101 2012/05/28 13:16:10 christos Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -102,7 +102,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.100 2011/09/04 17:32:10 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.101 2012/05/28 13:16:10 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -202,6 +202,14 @@
vp->v_type = VDIR;
break;
+ case PFStask: /* /proc/N/task = dr-xr-xr-x */
+ if (fd == -1) {
+ pfs->pfs_mode = S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|
+ S_IROTH|S_IXOTH;
+ vp->v_type = VDIR;
+ break;
+ }
+ /*FALLTHROUGH*/
case PFScurproc: /* /proc/curproc = lr-xr-xr-x */
case PFSself: /* /proc/self = lr-xr-xr-x */
case PFScwd: /* /proc/N/cwd = lr-xr-xr-x */
@@ -212,7 +220,7 @@
break;
case PFSfd:
- if (fd == -1) { /* /proc/N/fd = dr-xr-xr-x */
+ if (fd == -1) { /* /proc/N/fd = dr-x------ */
pfs->pfs_mode = S_IRUSR|S_IXUSR;
vp->v_type = VDIR;
} else { /* /proc/N/fd/M = [ps-]rw------- */
diff -r d2688a3aa115 -r df74c6e30113 sys/miscfs/procfs/procfs_vnops.c
--- a/sys/miscfs/procfs/procfs_vnops.c Mon May 28 09:51:34 2012 +0000
+++ b/sys/miscfs/procfs/procfs_vnops.c Mon May 28 13:16:10 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_vnops.c,v 1.183 2012/03/13 18:40:58 elad Exp $ */
+/* $NetBSD: procfs_vnops.c,v 1.184 2012/05/28 13:16:10 christos Exp $ */
/*-
* Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -105,7 +105,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.183 2012/03/13 18:40:58 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_vnops.c,v 1.184 2012/05/28 13:16:10 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -175,6 +175,7 @@
{ DT_LNK, N("root"), PFSchroot, NULL },
{ DT_LNK, N("emul"), PFSemul, NULL },
{ DT_REG, N("statm"), PFSstatm, procfs_validfile_linux },
+ { DT_DIR, N("task"), PFStask, procfs_validfile_linux },
#ifdef __HAVE_PROCFS_MACHDEP
PROCFS_MACHDEP_NODETYPE_DEFNS
#endif
@@ -641,6 +642,12 @@
}
switch (pfs->pfs_type) {
+ case PFStask:
+ if (pfs->pfs_fd == -1) {
+ path = NULL;
+ break;
+ }
+ /*FALLTHROUGH*/
case PFScwd:
case PFSchroot:
case PFSexe:
@@ -777,7 +784,17 @@
snprintf(bf, sizeof(bf), "%ld", (long)curproc->p_pid);
break;
}
-
+ case PFStask:
+ if (pfs->pfs_fd != -1) {
+ char bf[4]; /* should be enough */
+ vap->va_nlink = 1;
+ vap->va_uid = 0;
+ vap->va_gid = 0;
+ vap->va_bytes = vap->va_size =
+ snprintf(bf, sizeof(bf), "..");
+ break;
+ }
+ /*FALLTHROUGH*/
case PFSfd:
if (pfs->pfs_fd != -1) {
file_t *fp;
@@ -1151,6 +1168,36 @@
procfs_proc_unlock(p);
return error;
}
+ case PFStask: {
+ int xpid;
+
+ if ((error = procfs_proc_lock(pfs->pfs_pid, &p, ENOENT)) != 0)
+ return error;
+
+ /*
+ * do the .. dance. We unlock the directory, and then
+ * get the proc dir. That will automatically return ..
+ * locked. Then re-lock the directory.
+ */
+ if (cnp->cn_flags & ISDOTDOT) {
+ VOP_UNLOCK(dvp);
+ error = procfs_allocvp(dvp->v_mount, vpp, pfs->pfs_pid,
+ PFSproc, -1, p);
+ procfs_proc_unlock(p);
+ vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY);
+ return (error);
+ }
+ xpid = atoi(pname, cnp->cn_namelen);
+
+ if (xpid != pfs->pfs_pid) {
+ procfs_proc_unlock(p);
+ return ENOENT;
+ }
+ error = procfs_allocvp(dvp->v_mount, vpp, pfs->pfs_pid,
+ PFStask, 0, p);
+ procfs_proc_unlock(p);
+ return error;
+ }
default:
return (ENOTDIR);
}
@@ -1396,6 +1443,56 @@
procfs_proc_unlock(p);
break;
}
+ case PFStask: {
+ struct proc *p;
+ int nc = 0;
+
+ if ((error = procfs_proc_lock(pfs->pfs_pid, &p, ESRCH)) != 0)
+ return error;
+
+ nfd = 3; /* ., .., pid */
+
+ if (ap->a_ncookies) {
+ ncookies = min(ncookies, (nfd + 2 - i));
+ cookies = malloc(ncookies * sizeof (off_t),
+ M_TEMP, M_WAITOK);
+ *ap->a_cookies = cookies;
+ }
+
+ for (; i < 2 && uio->uio_resid >= UIO_MX; i++) {
+ pt = &proc_targets[i];
+ d.d_namlen = pt->pt_namlen;
+ d.d_fileno = PROCFS_FILENO(pfs->pfs_pid,
+ pt->pt_pfstype, -1);
+ (void)memcpy(d.d_name, pt->pt_name, pt->pt_namlen + 1);
+ d.d_type = pt->pt_type;
+ if ((error = uiomove(&d, UIO_MX, uio)) != 0)
+ break;
+ if (cookies)
+ *cookies++ = i + 1;
+ nc++;
+ }
+ if (error) {
+ ncookies = nc;
+ break;
+ }
+ for (; uio->uio_resid >= UIO_MX && i < nfd; i++) {
+ /* check the descriptor exists */
+ d.d_fileno = PROCFS_FILENO(pfs->pfs_pid, PFStask,
+ i - 2);
+ d.d_namlen = snprintf(d.d_name, sizeof(d.d_name),
+ "%ld", (long)pfs->pfs_pid);
+ d.d_type = DT_LNK;
+ if ((error = uiomove(&d, UIO_MX, uio)) != 0)
+ break;
+ if (cookies)
+ *cookies++ = i + 1;
+ nc++;
+ }
+ ncookies = nc;
+ procfs_proc_unlock(p);
+ break;
+ }
/*
* this is for the root of the procfs filesystem
@@ -1530,6 +1627,8 @@
len = snprintf(bf, sizeof(bf), "%ld", (long)curproc->p_pid);
else if (pfs->pfs_fileno == PROCFS_FILENO(0, PFSself, -1))
len = snprintf(bf, sizeof(bf), "%s", "curproc");
+ else if (pfs->pfs_fileno == PROCFS_FILENO(pfs->pfs_pid, PFStask, 0))
+ len = snprintf(bf, sizeof(bf), "..");
else if (pfs->pfs_fileno == PROCFS_FILENO(pfs->pfs_pid, PFScwd, -1) ||
pfs->pfs_fileno == PROCFS_FILENO(pfs->pfs_pid, PFSchroot, -1) ||
pfs->pfs_fileno == PROCFS_FILENO(pfs->pfs_pid, PFSexe, -1)) {
@@ -1581,7 +1680,8 @@
if (vxp->v_tag == VT_PROCFS) {
*--bp = '/';
} else {
- rw_enter(&curproc->p_cwdi->cwdi_lock, RW_READER);
+ rw_enter(&curproc->p_cwdi->cwdi_lock,
+ RW_READER);
vp = curproc->p_cwdi->cwdi_rdir;
if (vp == NULL)
vp = rootvnode;
Home |
Main Index |
Thread Index |
Old Index