aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/procfs
Commit message (Collapse)AuthorAgeFilesLines
* fs: clean up empty lines in .c and .h filesMateusz Guzik2020-09-012-3/+0
| | | | Notes: svn path=/head/; revision=365070
* cache: drop the always curthread argument from reverse lookup routinesMateusz Guzik2020-08-242-2/+2
| | | | | | | | | Note VOP_VPTOCNP keeps getting it as temporary compatibility for zfs. Tested by: pho Notes: svn path=/head/; revision=364633
* Retire procfs-based process debugging.John Baldwin2020-04-013-269/+1
| | | | | | | | | | | | | | | | | | Modern debuggers and process tracers use ptrace() rather than procfs for debugging. ptrace() has a supserset of functionality available via procfs and new debugging features are only added to ptrace(). While the two debugging services share some fields in struct proc, they each use dedicated fields and separate code. This results in extra complexity to support a feature that hasn't been enabled in the default install for several years. PR: 244939 (exp-run) Reviewed by: kib, mjg (earlier version) Relnotes: yes Differential Revision: https://reviews.freebsd.org/D23837 Notes: svn path=/head/; revision=359530
* Mark procfs-based process debugging as deprecated for FreeBSD 13.John Baldwin2020-03-171-0/+43
| | | | | | | | | | | | | | Attempting to use ioctls on /proc/<pid>/mem to control a process will trigger warnings on the console. The <sys/pioctl.h> include file will also now emit a compile-time warning when used from userland. Reviewed by: emaste MFC after: 1 week Relnotes: yes Differential Revision: https://reviews.freebsd.org/D23822 Notes: svn path=/head/; revision=359047
* Define macro VM_MAP_ENTRY_FOREACH for enumerating the entries in a vm_map.Doug Moore2019-10-081-2/+1
| | | | | | | | | | | | | | | | | In case the implementation ever changes from using a chain of next pointers, then changing the macro definition will be necessary, but changing all the files that iterate over vm_map entries will not. Drop a counter in vm_object.c that would have an effect only if the vm_map entry count was wrong. Discussed with: alc Reviewed by: markj Tested by: pho (earlier version) Differential Revision: https://reviews.freebsd.org/D21882 Notes: svn path=/head/; revision=353298
* Plug memory disclosures via ptrace(2).Mark Johnston2018-12-033-5/+9
| | | | | | | | | | | | | | | | On some architectures, the structures returned by PT_GET*REGS were not fully populated and could contain uninitialized stack memory. The same issue existed with the register files in procfs. Reported by: Thomas Barabosch, Fraunhofer FKIE Reviewed by: kib MFC after: 3 days Security: kernel stack memory disclosure Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D18421 Notes: svn path=/head/; revision=341442
* Make it easier for filesystems to count themselves as jail-enabled,Jamie Gritton2018-05-041-1/+1
| | | | | | | | | | | | | | | by doing most of the work in a new function prison_add_vfs in kern_jail.c Now a jail-enabled filesystem need only mark itself with VFCF_JAIL, and the rest is taken care of. This includes adding a jail parameter like allow.mount.foofs, and a sysctl like security.jail.mount_foofs_allowed. Both of these used to be a static list of known filesystems, with predefined permission bits. Reviewed by: kib Differential Revision: D14681 Notes: svn path=/head/; revision=333263
* [procfs] Split procfs_attr into multiple functionsEitan Adler2018-04-242-26/+35
| | | | | | | | | Reviewed by: des, kib Discussed with: mmacy Differential Revision: https://reviews.freebsd.org/D15150 Notes: svn path=/head/; revision=332936
* Move most of the contents of opt_compat.h to opt_global.h.Brooks Davis2018-04-065-10/+0
| | | | | | | | | | | | | | | | | | | | | opt_compat.h is mentioned in nearly 180 files. In-progress network driver compabibility improvements may add over 100 more so this is closer to "just about everywhere" than "only some files" per the guidance in sys/conf/options. Keep COMPAT_LINUX32 in opt_compat.h as it is confined to a subset of sys/compat/linux/*.c. A fake _COMPAT_LINUX option ensure opt_compat.h is created on all architectures. Move COMPAT_LINUXKPI to opt_dontuse.h as it is only used to control the set of compiled files. Reviewed by: kib, cem, jhb, jtl Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D14941 Notes: svn path=/head/; revision=332122
* Correct comment. procfs_doprocfile implements 'file', not 'self'.John Baldwin2018-01-051-1/+1
| | | | Notes: svn path=/head/; revision=327591
* Reuse kern_proc_vmmap_resident() for procfs_map resident count.Konstantin Belousov2017-12-281-27/+23
| | | | | | | | | | | | | | | | | | | | | The existing algorithm in procfs_map() to calculate count of resident pages in an entry is too primitive, resulting in too long run time for large sparse mapping entries. Re-use the kern_proc_vmmap_resident() from kern_proc.c which only looks at the existing pages in the iterations. Also, this makes procfs to honor kern.proc_vmmap_skip_resident_count, if user does not need this information. Reported by: Glenn Weinberg <glenn.weinberg@intel.com> PR: 224532 No objections from: des (procfs maintainer) Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D13595 Notes: svn path=/head/; revision=327286
* sys/fs: further adoption of SPDX licensing ID tags.Pedro F. Giffuni2017-11-271-0/+2
| | | | | | | | | | | | | | | Mainly focus on files that use BSD 2-Clause license, however the tool I was using misidentified many licenses so this was mostly a manual - error prone - task. The Software Package Data Exchange (SPDX) group provides a specification to make it easier for automated tools to detect and summarize well known opensource licenses. We are gradually adopting the specification, noting that the tags are considered only advisory and do not, in any way, superceed or replace the license texts. Notes: svn path=/head/; revision=326268
* sys: further adoption of SPDX licensing ID tags.Pedro F. Giffuni2017-11-2010-0/+20
| | | | | | | | | | | | | | | | | Mainly focus on files that use BSD 3-Clause license. The Software Package Data Exchange (SPDX) group provides a specification to make it easier for automated tools to detect and summarize well known opensource licenses. We are gradually adopting the specification, noting that the tags are considered only advisory and do not, in any way, superceed or replace the license texts. Special thanks to Wind River for providing access to "The Duke of Highlander" tool: an older (2014) run over FreeBSD tree was useful as a starting point. Notes: svn path=/head/; revision=326023
* spdx: initial adoption of licensing ID tags.Pedro F. Giffuni2017-11-182-0/+4
| | | | | | | | | | | | | | | | | | | | The Software Package Data Exchange (SPDX) group provides a specification to make it easier for automated tools to detect and summarize well known opensource licenses. We are gradually adopting the specification, noting that the tags are considered only advisory and do not, in any way, superceed or replace the license texts. Special thanks to Wind River for providing access to "The Duke of Highlander" tool: an older (2014) run over FreeBSD tree was useful as a starting point. Initially, only tag files that use BSD 4-Clause "Original" license. RelNotes: yes Differential Revision: https://reviews.freebsd.org/D13133 Notes: svn path=/head/; revision=325966
* remove procfs ctl interfaceEric Badger2017-03-054-477/+1
| | | | | | | | | | | | | | | | | | This interface has no in-tree consumers and has been more or less non-functional for several releases. Remove manpage note that the procfs special file 'mem' is grouped to kmem. This hasn't been true since r81107. Remove procfs' README file. It is an out of date duplication of the manpage (quoth the README: "since the bsd kernel is single-processor..."). Reviewed by: vangyzen, bcr (manpage) Approved by: des (procfs maintainer), vangyzen (mentor) Differential Revision: https://reviews.freebsd.org/D9802 Notes: svn path=/head/; revision=314690
* Renumber copyright clause 4Warner Losh2017-02-2810-10/+10
| | | | | | | | | | | | Renumber cluase 4 to 3, per what everybody else did when BSD granted them permission to remove clause 3. My insistance on keeping the same numbering for legal reasons is too pedantic, so give up on that point. Submitted by: Jan Schaumann <jschauma@stevens.edu> Pull Request: https://github.com/freebsd/freebsd/pull/96 Notes: svn path=/head/; revision=314436
* Hide the boottime and bootimebin globals, provide the getboottime(9)Konstantin Belousov2016-07-271-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | and getboottimebin(9) KPI. Change consumers of boottime to use the KPI. The variables were renamed to avoid shadowing issues with local variables of the same name. Issue is that boottime* should be adjusted from tc_windup(), which requires them to be members of the timehands structure. As a preparation, this commit only introduces the interface. Some uses of boottime were found doubtful, e.g. NLM uses boottime to identify the system boot instance. Arguably the identity should not change on the leap second adjustment, but the commit is about the timekeeping code and the consumers were kept bug-to-bug compatible. Tested by: pho (as part of the bigger patch) Reviewed by: jhb (same) Discussed with: bde Sponsored by: The FreeBSD Foundation MFC after: 1 month X-Differential revision: https://reviews.freebsd.org/D7302 Notes: svn path=/head/; revision=303382
* - Consistently use PROC_ASSERT_HELD() to verify that a process' hold countMark Johnston2015-11-082-2/+2
| | | | | | | | | | | | is non-zero. - Include the process address in the PROC_ASSERT_HELD() and PROC_ASSERT_NOT_HELD() assertion messages so that the corresponding process can be found easily when debugging. MFC after: 1 week Notes: svn path=/head/; revision=290530
* The si_status field of the siginfo_t, provided by the waitid(2) andKonstantin Belousov2015-07-182-6/+6
| | | | | | | | | | | | | | | | | | | SIGCHLD signal, should keep full 32 bits of the status passed to the _exit(2). Split the combined p_xstat of the struct proc into the separate exit status p_xexit for normal process exit, and signalled termination information p_xsig. Kernel-visible macro KW_EXITCODE() reconstructs old p_xstat from p_xexit and p_xsig. p_xexit contains complete status and copied out into si_status. Requested by: Joerg Schilling Reviewed by: jilles (previous version), pho Tested by: pho Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=285670
* Provide vnode in memory map info for files on tmpfsEric van Gyzen2015-06-021-4/+10
| | | | | | | | | | | | | | | | | | | When providing memory map information to userland, populate the vnode pointer for tmpfs files. Set the memory mapping to appear as a vnode type, to match FreeBSD 9 behavior. This fixes the use of tmpfs files with the dtrace pid provider, procstat -v, procfs, linprocfs, pmc (pmcstat), and ptrace (PT_VM_ENTRY). Submitted by: Eric Badger <eric@badgerio.us> (initial revision) Obtained from: Dell Inc. PR: 198431 MFC after: 2 weeks Reviewed by: jhb Approved by: kib (mentor) Notes: svn path=/head/; revision=283924
* Clear p_stops upon PROCFS_CTL_DETACH, similar to r283889.Xin LI2015-06-011-0/+1
| | | | | | | | | | Noticed by: jhb Reviewed by: sef Sponsored by: iXsystems, Inc. MFC after: 2 weeks Notes: svn path=/head/; revision=283891
* Always set p_oppid when attaching to an existing process via procfsJohn Baldwin2015-05-221-1/+1
| | | | | | | | | | | tracing. This matches the behavior of ptrace(PT_ATTACH). Also, the procfs detach request assumes p_oppid is always set. Reviewed by: kib MFC after: 2 weeks Notes: svn path=/head/; revision=283281
* The process spin lock currently has the following distinct uses:Konstantin Belousov2014-11-261-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Threads lifetime cycle, in particular, counting of the threads in the process, and interlocking with process mutex and thread lock. The main reason of this is that turnstile locks are after thread locks, so you e.g. cannot unlock blockable mutex (think process mutex) while owning thread lock. - Virtual and profiling itimers, since the timers activation is done from the clock interrupt context. Replace the p_slock by p_itimmtx and PROC_ITIMLOCK(). - Profiling code (profil(2)), for similar reason. Replace the p_slock by p_profmtx and PROC_PROFLOCK(). - Resource usage accounting. Need for the spinlock there is subtle, my understanding is that spinlock blocks context switching for the current thread, which prevents td_runtime and similar fields from changing (updates are done at the mi_switch()). Replace the p_slock by p_statmtx and PROC_STATLOCK(). The split is done mostly for code clarity, and should not affect scalability. Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=275121
* Relax the vm object locking. Use a read lock.Alan Cox2013-06-051-5/+5
| | | | | | | Sponsored by: EMC / Isilon Storage Division Notes: svn path=/head/; revision=251423
* Switch the vm_object mutex to be a rwlock. This will enable in theAttilio Rao2013-03-091-6/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | future further optimizations where the vm_object lock will be held in read mode most of the time the page cache resident pool of pages are accessed for reading purposes. The change is mostly mechanical but few notes are reported: * The KPI changes as follow: - VM_OBJECT_LOCK() -> VM_OBJECT_WLOCK() - VM_OBJECT_TRYLOCK() -> VM_OBJECT_TRYWLOCK() - VM_OBJECT_UNLOCK() -> VM_OBJECT_WUNLOCK() - VM_OBJECT_LOCK_ASSERT(MA_OWNED) -> VM_OBJECT_ASSERT_WLOCKED() (in order to avoid visibility of implementation details) - The read-mode operations are added: VM_OBJECT_RLOCK(), VM_OBJECT_TRYRLOCK(), VM_OBJECT_RUNLOCK(), VM_OBJECT_ASSERT_RLOCKED(), VM_OBJECT_ASSERT_LOCKED() * The vm/vm_pager.h namespace pollution avoidance (forcing requiring sys/mutex.h in consumers directly to cater its inlining functions using VM_OBJECT_LOCK()) imposes that all the vm/vm_pager.h consumers now must include also sys/rwlock.h. * zfs requires a quite convoluted fix to include FreeBSD rwlocks into the compat layer because the name clash between FreeBSD and solaris versions must be avoided. At this purpose zfs redefines the vm_object locking functions directly, isolating the FreeBSD components in specific compat stubs. The KPI results heavilly broken by this commit. Thirdy part ports must be updated accordingly (I can think off-hand of VirtualBox, for example). Sponsored by: EMC / Isilon storage division Reviewed by: jeff Reviewed by: pjd (ZFS specific review) Discussed with: alc Tested by: pho Notes: svn path=/head/; revision=248084
* Remove the support for using non-mpsafe filesystem modules.Konstantin Belousov2012-10-221-3/+1
| | | | | | | | | | | | | | | In particular, do not lock Giant conditionally when calling into the filesystem module, remove the VFS_LOCK_GIANT() and related macros. Stop handling buffers belonging to non-mpsafe filesystems. The VFS_VERSION is bumped to indicate the interface change which does not result in the interface signatures changes. Conducted and reviewed by: attilio Tested by: pho Notes: svn path=/head/; revision=241896
* Add procfs to jail-mountable filesystems.Martin Matuska2012-02-291-1/+1
| | | | | | | | Reviewed by: jamie MFC after: 1 week Notes: svn path=/head/; revision=232278
* Abrogate nchr argument in proc_getargv() and proc_getenvv(): we always wantMikolaj Golub2012-01-151-1/+1
| | | | | | | | | | | | | | | | | | to read strings completely to know the actual size. As a side effect it fixes the issue with kern.proc.args and kern.proc.env sysctls, which didn't return the size of available data when calling sysctl(3) with the NULL argument for oldp. Note, in get_ps_strings(), which does actual work for proc_getargv() and proc_getenvv(), we still have a safety limit on the size of data read in case of a corrupted procces stack. Suggested by: kib MFC after: 3 days Notes: svn path=/head/; revision=230145
* Convert files to UTF-8Ulrich Spörlein2012-01-152-2/+2
| | | | Notes: svn path=/head/; revision=230132
* In procfs_doproccmdline() if arguments are not cashed read them fromMikolaj Golub2011-11-221-30/+8
| | | | | | | | | | | | the process stack. Suggested by: kib Reviewed by: kib Tested by: pho MFC after: 2 weeks Notes: svn path=/head/; revision=227834
* Lock the thread lock around block that retrieves td_wmesg. Otherwise,Konstantin Belousov2011-11-091-0/+2
| | | | | | | | | | procfs could see a thread with assigned td_wchan but still NULL td_wmesg. Reported and tested by: pho MFC after: 1 week Notes: svn path=/head/; revision=227393
* Fix typo.Konstantin Belousov2011-11-051-1/+1
| | | | | | | MFC after: 3 days Notes: svn path=/head/; revision=227104
* In order to maximize the re-usability of kernel code in user space thisKip Macy2011-09-162-4/+4
| | | | | | | | | | | | | | | | patch modifies makesyscalls.sh to prefix all of the non-compatibility calls (e.g. not linux_, freebsd32_) with sys_ and updates the kernel entry points and all places in the code that use them. It also fixes an additional name space collision between the kernel function psignal and the libc function of the same name by renaming the kernel psignal kern_psignal(). By introducing this change now we will ease future MFCs that change syscalls. Reviewed by: rwatson Approved by: re (bz) Notes: svn path=/head/; revision=225617
* Do not return success and a string "unknown" when vn_fullpath() was unableKonstantin Belousov2011-08-161-6/+9
| | | | | | | | | | | | to resolve the path of the text vnode of the process. The behaviour is very confusing for any consumer of the procfs, in particular, java. Reported and tested by: bf MFC after: 2 weeks Approved by: re (bz) Notes: svn path=/head/; revision=224915
* Add macro to test the sv_flags of any process. Change some places to testDmitry Chagin2011-01-264-5/+5
| | | | | | | | | | the flags instead of explicit comparing with address of known sysentvec structures. MFC after: 1 month Notes: svn path=/head/; revision=217896
* Replace pointer to "struct uidinfo" with pointer to "struct ucred"Edward Tomasz Napierala2010-12-021-3/+3
| | | | | | | | | | | | in "struct vm_object". This is required to make it possible to account for per-jail swap usage. Reviewed by: kib@ Tested by: pho@ Sponsored by: FreeBSD Foundation Notes: svn path=/head/; revision=216128
* For non-stopped threads, td_frame pointer is undefined. As aKonstantin Belousov2010-12-022-0/+8
| | | | | | | | | | | | | | | | | consequence, fill_regs() and fill_fpregs() access random data, usually on the thread kernel stack. Most often the td_frame points to the previous frame saved by last kernel entry sequence, but this is not guaranteed. For /proc/<pid>/{regs,fpregs} read access, require the thread to be in stopped state. Otherwise, return EBUSY as is done for write case. Reported and tested by: pho Approved by: des (procfs maintainer) MFC after: 1 week Notes: svn path=/head/; revision=216120
* fix a few cases where a string is passed via format argument instead ofAndriy Gapon2010-06-111-2/+2
| | | | | | | | | | | | | via %s Most of the cases looked harmless, but this is done for the sake of correctness. In one case it even allowed to drop an intermediate buffer. Found by: clang MFC after: 2 week Notes: svn path=/head/; revision=209062
* The thread_unsuspend() requires both process mutex and process spinlockKonstantin Belousov2010-05-101-4/+4
| | | | | | | | | | locked. Postpone the process unlock till the thread_unsuspend() is called. Approved by: des (procfs maintainer) MFC after: 1 week Notes: svn path=/head/; revision=207848
* For detach procfs ctl command, also clear P_STOPPED_TRACE process stopKonstantin Belousov2010-05-101-1/+4
| | | | | | | | | | | flag, and for each thread, TDB_SUSPEND debug flag, same as it is done by exit1() for orphaned debugee. Approved by: des (procfs maintainer) MFC after: 1 week Notes: svn path=/head/; revision=207847
* Provide groundwork for 32-bit binary compatibility on non-x86 platforms,Nathan Whitehorn2010-03-115-19/+16
| | | | | | | | | | | | for upcoming 64-bit PowerPC and MIPS support. This renames the COMPAT_IA32 option to COMPAT_FREEBSD32, removes some IA32-specific code from MI parts of the kernel and enhances the freebsd32 compatibility code to support big-endian platforms. Reviewed by: kib, jhb Notes: svn path=/head/; revision=205014
* Update the comment on printing group membership to reflect that factBrooks Davis2010-01-091-1/+1
| | | | | | | | | | that each groupt the process is a member of is printed rather than an entry for each group the user could be a member of. MFC after: 3 days Notes: svn path=/head/; revision=201954
* Add per-process osrel node to the procfs, to allow read and set p_osrelKonstantin Belousov2009-09-233-1/+73
| | | | | | | | | | value for the process. Approved by: des (procfs maintainer) MFC after: 3 weeks Notes: svn path=/head/; revision=197428
* Add a new type of VM object: OBJT_SG. An OBJT_SG object is very similar toJohn Baldwin2009-07-241-0/+1
| | | | | | | | | | | | | | a device pager (OBJT_DEVICE) object in that it uses fictitious pages to provide aliases to other memory addresses. The primary difference is that it uses an sglist(9) to determine the physical addresses for a given offset into the object instead of invoking the d_mmap() method in a device driver. Reviewed by: alc Approved by: re (kensmith) MFC after: 2 weeks Notes: svn path=/head/; revision=195840
* Implement global and per-uid accounting of the anonymous memory. AddKonstantin Belousov2009-06-231-3/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | rlimit RLIMIT_SWAP that limits the amount of swap that may be reserved for the uid. The accounting information (charge) is associated with either map entry, or vm object backing the entry, assuming the object is the first one in the shadow chain and entry does not require COW. Charge is moved from entry to object on allocation of the object, e.g. during the mmap, assuming the object is allocated, or on the first page fault on the entry. It moves back to the entry on forks due to COW setup. The per-entry granularity of accounting makes the charge process fair for processes that change uid during lifetime, and decrements charge for proper uid when region is unmapped. The interface of vm_pager_allocate(9) is extended by adding struct ucred *, that is used to charge appropriate uid when allocation if performed by kernel, e.g. md(4). Several syscalls, among them is fork(2), may now return ENOMEM when global or per-uid limits are enforced. In collaboration with: pho Reviewed by: alc Approved by: re (kensmith) Notes: svn path=/head/; revision=194766
* Add hierarchical jails. A jail may further virtualize its environmentJamie Gritton2009-05-271-4/+5
| | | | | | | | | | | | | | | | | | | | | | | | | by creating a child jail, which is visible to that jail and to any parent jails. Child jails may be restricted more than their parents, but never less. Jail names reflect this hierarchy, being MIB-style dot-separated strings. Every thread now points to a jail, the default being prison0, which contains information about the physical system. Prison0's root directory is the same as rootvnode; its hostname is the same as the global hostname, and its securelevel replaces the global securelevel. Note that the variable "securelevel" has actually gone away, which should not cause any problems for code that properly uses securelevel_gt() and securelevel_ge(). Some jail-related permissions that were kept in global variables and set via sysctls are now per-jail settings. The sysctls still exist for backward compatibility, used only by the now-deprecated jail(2) system call. Approved by: bz (mentor) Notes: svn path=/head/; revision=192895
* Use the p_sysent->sv_flags flag SV_ILP32 to detect 32bit processKonstantin Belousov2009-03-023-9/+9
| | | | | | | | | executing on 64bit kernel. This eliminates the direct comparisions of p_sysent with &ia32_freebsd_sysvec, that were left intact after r185169. Notes: svn path=/head/; revision=189282
* Fix a logic bug that caused the pfs_attr method to be called only forDag-Erling Smørgrav2009-02-161-5/+5
| | | | | | | | | | PFS_PROCDEP nodes. Submitted by: Andrew Brampton <brampton@gmail.com> MFC after: 2 weeks Notes: svn path=/head/; revision=188677
* vm_map_lock_read() does not increment map->timestamp, so we shouldKonstantin Belousov2008-12-291-1/+1
| | | | | | | | | | | | | compare map->timestamp with saved timestamp after map read lock is reacquired, not with saved timestamp + 1. The only consequence of the +1 was unconditional lookup of the next map entry, though. Tested by: pho Approved by: des MFC after: 2 weeks Notes: svn path=/head/; revision=186563
* Use curproc->p_sysent->sv_flags bit SV_ILP32 for detection of the 32 bitKonstantin Belousov2008-12-291-11/+5
| | | | | | | | | | | caller, instead of direct comparision with ia32_freebsd_sysvec. Tested by: pho Approved by: des MFC after: 2 weeks Notes: svn path=/head/; revision=186562