summaryrefslogtreecommitdiff
path: root/lib/libthr
Commit message (Collapse)AuthorAgeFilesLines
* Add CFI start/end proc directives to arm64, i386, and ppcConrad Meyer2020-12-051-1/+4
| | | | | | | | | | | | | | Follow-up to r353959 and r368070: do the same for other architectures. arm32 already seems to use its own .fnstart/.fnend directives, which appear to be ARM-specific variants of the same thing. Likewise, MIPS uses .frame directives. Reviewed by: arichardson Differential Revision: https://reviews.freebsd.org/D27387 Notes: svn path=/head/; revision=368354
* Ensure that threading library is initialized in pthread_mutex_init().Konstantin Belousov2020-11-301-0/+2
| | | | | | | | | | | | We need at least thr_malloc ready. The situation is possible e.g. in case of libthr being listed in DT_NEEDED before some of its consumers. Reported and tested by: lev Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=368190
* libc: Add pthread_attr_get_np(3) stub, reporting ESRCH.Konstantin Belousov2020-11-281-0/+1
| | | | | | | | | | | | | | | This seems to be required by recent clang asan. I do not see other way than put the symbol under FBSD_1.0 version. PR: 251112 Reported by: Andrew Stitcher <astitcher@apache.org> Reviewed by: emaste Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D27389 Notes: svn path=/head/; revision=368125
* Style.Konstantin Belousov2020-11-261-18/+18
| | | | | | | | Sponsored by: The FreeBSD Foundation MFC after: 3 days Notes: svn path=/head/; revision=368082
* _umtx_op: fix a compat32 bug in UMTX_OP_NWAKE_PRIVATEKyle Evans2020-11-172-0/+110
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Specifically, if we're waking up some value n > BATCH_SIZE, then the copyin(9) is wrong on the second iteration due to upp being the wrong type. upp is currently a uint32_t**, so upp + pos advances it by twice as many elements as it should (host pointer size vs. compat32 pointer size). Fix it by just making upp a uint32_t*; it's still technically a double pointer, but the distinction doesn't matter all that much here since we're just doing arithmetic on it. Add a test case that demonstrates the problem, placed with the libthr tests since one messing with _umtx_op should be running these tests. Running under compat32, the new test case will hang as threads after the first 128 get missed in the wake. it's not immediately clear how to hit it in practice, since pthread_cond_broadcast() uses a smaller (sleepq batch?) size observed to be around ~50 -- I did not spend much time digging into it. The uintptr_t change makes no functional difference, but i've tossed it in since it's more accurate (semantically). Reported by: Andrew Gierth (andrew_tao173.riddles.org.uk, inspection) Reviewed by: kib MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D27231 Notes: svn path=/head/; revision=367743
* build: provide a default WARNS for all in-tree buildsKyle Evans2020-09-183-0/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | The current default is provided in various Makefile.inc in some top-level directories and covers a good portion of the tree, but doesn't cover parts of the build a little deeper (e.g. libcasper). Provide a default in src.sys.mk and set WARNS to it in bsd.sys.mk if that variable is defined. This lets us relatively cleanly provide a default WARNS no matter where you're building in the src tree without breaking things outside of the tree. Crunchgen has been updated as a bootstrap tool to work on this change because it needs r365605 at a minimum to succeed. The cleanup necessary to successfully walk over this change on WITHOUT_CLEAN builds has been added. There is a supplemental project to this to list all of the warnings that are encountered when the environment has WARNS=6 NO_WERROR=yes: https://warns.kevans.dev -- this project will hopefully eventually go away in favor of CI doing a much better job than it. Reviewed by: emaste, brooks, ngie (all earlier version) Reviewed by: emaste, arichardson (depend-cleanup.sh change) Differential Revision: https://reviews.freebsd.org/D26455 Notes: svn path=/head/; revision=365887
* Add pthread_getname_np() and pthread_setname_np() aliases forKonstantin Belousov2020-06-102-17/+61
| | | | | | | | | | | | | | | pthread_get_name_np() and pthread_set_name_np(). This re-applies r361770 after compatibility fixes. Reviewed by: antoine, jkim, markj Tested by: antoine (exp-run) Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D25117 Notes: svn path=/head/; revision=362032
* Revert r361770 "Add pthread_getname_np() and pthread_setname_np() aliases" ↵Konstantin Belousov2020-06-042-4/+0
| | | | | | | | | | | | for now. It is not compatible enough with Linux. Requested by: antoine, jkim Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=361784
* Add pthread_getname_np() and pthread_setname_np() aliasesKonstantin Belousov2020-06-032-0/+4
| | | | | | | | | | | | | | for pthread_get_name_np() and pthread_set_name_np(), to be compatible with Linux. PR: 238404 Proposed and reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D25117 Notes: svn path=/head/; revision=361770
* Remove tests for obsolete compilers in the build systemEric van Gyzen2020-05-121-3/+0
| | | | | | | | | | | | | | Assume gcc is at least 6.4, the oldest xtoolchain in the ports tree. Assume clang is at least 6, which was in 11.2-RELEASE. Drop conditions for older compilers. Reviewed by: imp (earlier version), emaste, jhb MFC after: 2 weeks Sponsored by: Dell EMC Isilon Differential Revision: https://reviews.freebsd.org/D24802 Notes: svn path=/head/; revision=360964
* Add HISTORY sections to document when thisBenedict Reuschling2020-05-051-1/+6
| | | | | | | | | | | functionality first appeared in FreeBSD. Submitted by: Gordon Bergling gbergling_gmail.com Approved by: bcr Differential Revision: https://reviews.freebsd.org/D24677 Notes: svn path=/head/; revision=360670
* Remove libthr, csu, libthread_db and testfloat sparc64 specific directories.Warner Losh2020-02-274-167/+0
| | | | | | | Submitted by: kib@ (libthr) Notes: svn path=/head/; revision=358364
* Add pthread_peekjoin_np(3).Konstantin Belousov2020-02-152-7/+30
| | | | | | | | | | | | | | The function allows to peek at the thread exit status and even see return value, without joining (and thus finally destroying) the target thread. Reviewed by: markj Sponsored by: The FreeBSD Foundation (kib) MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D23676 Notes: svn path=/head/; revision=357985
* Return success, instead of ESRCH, from pthread_cancel(3) applied to theKonstantin Belousov2020-02-131-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | exited but not yet joined thread. Before, if the thread exited but was not yet joined, we returned ESRCH. According to IEEE Std 1003.1™-2017 recommendation in the description of pthread_cancel(3): If an implementation detects use of a thread ID after the end of its lifetime, it is recommended that the function should fail and report an [ESRCH] error. So it seems desirable to not return ESRCH until the lifetime of the thread ID ends. According to the section 2.9.2 Thread IDs, The lifetime of a thread ID ends after the thread terminates if it was created with the detachstate attribute set to PTHREAD_CREATE_DETACHED or if pthread_detach() or pthread_join() has been called for that thread. In other words, lifetime for thread ID of exited but not yet joined thread did not ended yet. Prompted by: cperciva Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=357894
* Use sigfastblock(2) for masking signals in libthr.Konstantin Belousov2020-02-094-6/+69
| | | | | | | | | | | | | | | | | Ensure proper handshake to transfer sigfastblock(2) blocking word ownership from rtld to libthr. Unfortunately sigfastblock(2) is not enough to stop intercepting signals in libthr, because critical sections must ensure more than just signal blocking. Tested by: pho Disscussed with: cem, emaste, jilles Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D12773 Notes: svn path=/head/; revision=357698
* Update Makefile.depend filesSimon J. Gerraty2019-12-111-1/+0
| | | | | | | | | | | | | Update a bunch of Makefile.depend files as a result of adding Makefile.depend.options files Reviewed by: bdrewery MFC after: 1 week Sponsored by: Juniper Networks Differential Revision: https://reviews.freebsd.org/D22494 Notes: svn path=/head/; revision=355617
* libthr: Add missing END() directive for umtx_op_err (amd64)Conrad Meyer2019-10-231-2/+5
| | | | | | | | | Like r353929, related to D22122. No functional change. Reviewed by: emaste, kib (earlier version both) Notes: svn path=/head/; revision=353958
* RISC-V: Fix an alignment warning in libthrMitchell Horne2019-10-091-4/+4
| | | | | | | | | | | | | | Compiling with clang gives a loss-of-alignment error due the cast to uint8_t *. Since the TLS is always tcb aligned and TP_OFFSET is defined as sizeof(struct tcb) we can guarantee there is no misalignment. Silence the error by moving the offset into the inline assembly. Reviewed by: br MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D21926 Notes: svn path=/head/; revision=353334
* Fix destruction of the robust mutexes.Konstantin Belousov2019-09-231-1/+5
| | | | | | | | | | | | | | | If robust mutex' owner terminated, causing kernel-assisted state recovery, and then pthread_mutex_destroy() is executed as the next action, assert is triggered about mutex still being on the list. Ignore the mutex linkage in pthread_mutex_destroy() for shared robust mutexes with dead owner, same as for enqueue_mutex(). Reported by: avg Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=352620
* Fix _pthread_cancel_enter() and _pthread_cancel_leave() jmptable entries.Konstantin Belousov2019-08-213-4/+8
| | | | | | | | | | PR: 240022 Reported by: Andrew Gierth <andrew@tao11.riddles.org.uk> Sponsored by: The FreeBSD Foundation MFC after: 3 days Notes: svn path=/head/; revision=351349
* Implement _umtx_op_err.S on powerpc / powerpc64.Brandon Bergren2019-08-093-0/+46
| | | | | | | | | | | | | | As per r177853, we need to avoid using errno inside user mutex code, since signal handlers can interfere with it and mess up libthr internal state. So, implement _umtx_op_err() instead, which makes a raw syscall and returns the error value directly instead of using errno. Approved by: jhibbits (mentor) Differential Revision: https://reviews.freebsd.org/D20946 Notes: svn path=/head/; revision=350826
* Avoid conflicts with libc symbols in libthr jump table.Konstantin Belousov2019-07-311-2/+0
| | | | | | | | | | | | | | | | | | | In some corner cases of static linking and unexpected libraries order on the linker command line, libc symbol might preempt the same libthr symbol, in which case libthr jump table points back to libc causing either infinite recursion or loop. Handle all of such symbols by using private libthr names for them, ensuring that the right pointers are installed into the table. In collaboration with: arichardson PR: 239475 Tested by: pho MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D21088 Notes: svn path=/head/; revision=350483
* Avoid conflicts with libc symbols in libthr jump table.Konstantin Belousov2019-07-3121-216/+353
| | | | | | | | | | | | | | | | | | | In some corner cases of static linking and unexpected libraries order on the linker command line, libc symbol might preempt the same libthr symbol, in which case libthr jump table points back to libc causing either infinite recursion or loop. Handle all of such symbols by using private libthr names for them, ensuring that the right pointers are installed into the table. In collaboration with: arichardson PR: 239475 Tested by: pho MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D21088 Notes: svn path=/head/; revision=350481
* Restore ability to pass NULL name argument to pthread_set_name_np(3)Konstantin Belousov2019-07-111-1/+1
| | | | | | | | | | | to clear the thread name. PR: 239142 Submitted by: Lewis Donzis <lew@perftech.com> MFC after: 3 days Notes: svn path=/head/; revision=349912
* Add libc stub for pthread_getthreadid_np(3).Konstantin Belousov2019-06-231-0/+1
| | | | | | | | | | Requested by: jbeich PR: 238650 Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=349299
* Do not access mutex memory after unlock.Konstantin Belousov2019-04-121-2/+3
| | | | | | | | | | PR: 237195 Reported by: freebsd@hurrikhan.eu Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=346158
* Fix initial exec TLS mode for dynamically loaded shared objects.Konstantin Belousov2019-03-2912-2/+408
| | | | | | | | | | | | | | | | | | | | | | | | If dso uses initial exec TLS mode, rtld tries to allocate TLS in static space. If there is no space left, the dlopen(3) fails. If space if allocated, initial content from PT_TLS segment is distributed to all threads' pcbs, which was missed and caused un-initialized TLS segment for such dso after dlopen(3). The mode is auto-detected either due to the relocation used, or if the DF_STATIC_TLS dynamic flag is set. In the later case, the TLS segment is tried to allocate earlier, which increases chance of the dlopen(3) to succeed. LLD was recently fixed to properly emit the flag, ld.bdf did it always. Initial test by: dumbbell Tested by: emaste (amd64), ian (arm) Tested by: Gerald Aryeetey <aryeeteygerald_rogers.com> (arm64) Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D19072 Notes: svn path=/head/; revision=345703
* revert r341429 "disable BIND_NOW in libc, libthr, and rtld"Ed Maste2019-03-281-1/+0
| | | | | | | | | | | r345620 by kib@ fixed the rtld issue that caused a crash at startup during resolution of libc's ifuncs with BIND_NOW. PR: 233333 Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=345625
* Have pthread_cond_destroy() return EBUSY if the condvar has waiters.Mark Johnston2019-03-081-5/+14
| | | | | | | | | | | | | | | | This is not required of a compliant implementation, but it's easy to check for and helps improve compatibility with other common implementations. Moreover, it's consistent with our pthread_mutex_destroy(). PR: 234805 Reviewed by: jhb, kib, ngie MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D19496 Notes: svn path=/head/; revision=344935
* silence cast-align warnings from clang on powerpc64Leandro Lupori2019-02-131-4/+5
| | | | | | | | | | | | | | | | | silence the following warning when compiling libthr with clang 8 for powerpc64 architecture: usr/src/lib/libthr/arch/powerpc/include/pthread_md.h:82:10: error: cast from 'uint8_t *' (aka 'unsigned char *') to 'struct tcb *' increases required alignment from 1 to 8 [-Werror,-Wcast-align] 82: return ((struct tcb *)(_tp - TP_OFFSET)); Submitted by: alfredo.junior_eldorado.org.br Reviewed by: git_bdragon.rtk0.net, emaste, kib, jhibbits, luporl Differential Revision: https://reviews.freebsd.org/D18807 Notes: svn path=/head/; revision=344109
* Fixes for very early use of the pthread_mutex_* and libthr malloc.Konstantin Belousov2019-02-042-0/+7
| | | | | | | | | | | | | | | | | | | | | When libthr is statically linked into the binary, order of the constructors execution is not deterministic. It is possible for the application constructor to use pthread_mutex_* functions before the libthr initialization was done. Handle it by: - making thr_malloc.c locking functions operational when curthread is not yet set; - making __thr_malloc_init() idempotent, allowing more than one call to it; - unconditionally calling __thr_malloc_init() before initializing a process-private mutex. Reported and tested by: mmel Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=343754
* Rename rtld-elf/malloc.c to rtld-elf/rtld_malloc.c.Konstantin Belousov2019-01-301-2/+2
| | | | | | | | | | Then malloc.c file name is too generic to use it for libthr.a. Sponsored by: The FreeBSD Foundation MFC after: 13 days Notes: svn path=/head/; revision=343580
* Untangle jemalloc and mutexes initialization.Konstantin Belousov2019-01-298-10/+165
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | The need to use libc malloc(3) from some places in libthr always caused issues. For instance, per-thread key allocation was switched to use plain mmap(2) to get storage, because some third party mallocs used keys for implementation of calloc(3). Even more important, libthr calls calloc(3) during initialization of pthread mutexes, and jemalloc uses pthread mutexes. Jemalloc provides some way to both postpone the initialization, and to make initialization to use specialized allocator, but this is very fragile and often breaks. See the referenced PR for another example. Add the small malloc implementation used by rtld, to libthr. Use it in thr_spec.c and for mutexes initialization. This avoids the issues with mutual dependencies between malloc and libthr in principle. The drawback is that some more allocations are not interceptable for alternate malloc implementations. There should be not too much memory use from this allocator, and the alternative, direct use of mmap(2) is obviously worse. PR: 235211 MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D18988 Notes: svn path=/head/; revision=343566
* Remove declarations of syscalls not used in libthr.Brooks Davis2018-12-031-6/+0
| | | | | | | | Reviewed by: kib Sponsored by: DARPA, AFRL Notes: svn path=/head/; revision=341445
* disable BIND_NOW in libc, libthr, and rtldEd Maste2018-12-031-0/+1
| | | | | | | | | | | | | | | An issue remains with BIND_NOW and processes using threads. For now, restore libc's BIND_NOW disable, and also disable BIND_NOW in rtld and libthr. A patch is in review (D18400) that likely fixes this issue, but just disable BIND_NOW pending further testing after it is committed. PR: 233333 Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=341429
* Use _thr_isthreaded() and _thr_setthreaded() wrappersEric van Gyzen2018-11-302-4/+4
| | | | | | | | | | ...instead of directly using the global variable. MFC after: 2 weeks Sponsored by: Dell EMC Isilon Notes: svn path=/head/; revision=341278
* _thr_setthreaded() cannot fail; change return type to voidEric van Gyzen2018-11-303-8/+3
| | | | | | | | | | | | Also remove logic to avoid unnecessary stores to the global variable. Thread creation and destruction are heavy enough that any supposed savings is in the noise. MFC after: 2 weeks Sponsored by: Dell EMC Isilon Notes: svn path=/head/; revision=341277
* Make libthr(3) use sysconf(_SC_NPROCESSORS_CONF); this shaves offEdward Tomasz Napierala2018-11-191-2/+3
| | | | | | | | | | | | two calls to sysctl(2) from the binary startup. Reviewed by: kib MFC after: 2 weeks Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D18046 Notes: svn path=/head/; revision=340642
* libthr: minor spacing cleanup.Pedro F. Giffuni2018-08-211-2/+2
| | | | | | | | | No functional change. X-MFC with: r337992 Notes: svn path=/head/; revision=338125
* POSIX compliance improvements in the pthread(3) functions.Pedro F. Giffuni2018-08-1811-44/+61
| | | | | | | | | | | | | | | | This basically adds makes use of the C99 restrict keyword, and also adds some 'const's to four threading functions: pthread_mutexattr_gettype(), pthread_mutexattr_getprioceiling(), pthread_mutexattr_getprotocol(), and pthread_mutex_getprioceiling. The changes are in accordance to POSIX/SUSv4-2018. Hinted by: DragonFlyBSD Relnotes: yes MFC after: 1 month Differential Revision: D16722 Notes: svn path=/head/; revision=337992
* Add pthread_get_name_np(3).Konstantin Belousov2018-08-174-11/+62
| | | | | | | | | | | | | | | | The function retrieves the thread name previously set by pthread_set_name_np(3). The name is cached in the process memory. Requested by: Willem Jan Withagen <wjw@digiware.nl> Man page update: Yuri Pankov <yuripv@yuripv.net> Reviewed by: ian (previous version) Discussed with: arichardson, bjk (man page) Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D16702 Notes: svn path=/head/; revision=337983
* Remove unused file.Konstantin Belousov2018-06-161-29/+0
| | | | | | | | | | | The thr_new(2) syscall is called through libc stub. r154212 stopped generating it for libthr but did not cleaned the unused remnants. Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=335258
* Remove references to the LIBC_SCCS and SYSLIBC_SCCS C macros.John Baldwin2018-05-231-4/+1
| | | | | | | | | This language dates back to when libthr was libc_r that included its own syscalls and replaced libc entirely. It hasn't been relevant for a long time. Notes: svn path=/head/; revision=334107
* Ensure thread library is initialized in pthread_testcancel().John Baldwin2018-03-211-1/+3
| | | | | | | | | | | | | | | | | | | | Call _thr_check_init() before reading curthread in pthread_testcancel(). If a constructor in a library creates a semaphore via sem_init() and then waits for it via sem_wait(), the program can core dump in _pthread_testcancel() called from sem_wait(). This is because the semaphore implementation lives in libc, so the library's constructors can be run before libthr's constructors. Reported by: arichardson Reviewed by: kib Obtained from: CheriBSD MFC after: 1 week Sponsored by: DARPA / AFRL Differential Revision: https://reviews.freebsd.org/D14786 Notes: svn path=/head/; revision=331324
* libthr: Fix missing break in switch.Pedro F. Giffuni2018-01-271-0/+1
| | | | | | | | | | This is also a warning in recent GCC with -Wimplicit-fallthrough. CID: 1356262 Obtained from: DragonFly (git 0f037c78 - partial) Notes: svn path=/head/; revision=328493
* lib: further adoption of SPDX licensing ID tags.Pedro F. Giffuni2017-11-2633-22/+88
| | | | | | | | | | | | | | | Mainly focus on files that use BSD 2-Clause license, however the tool I was using mis-identified 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=326219
* General further adoption of SPDX licensing ID tags.Pedro F. Giffuni2017-11-2020-20/+61
| | | | | | | | | | | | | | | | | 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=326025
* spdx: initial adoption of licensing ID tags.Pedro F. Giffuni2017-11-189-9/+27
| | | | | | | | | | | | | | | | | | | | 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
* Use MACHINE_CPUARCH in preference MACHINE for userland.Warner Losh2017-11-071-1/+1
| | | | | | | Sponsored by: Netflix Notes: svn path=/head/; revision=325510
* DIRDEPS_BUILD: Update dependencies.Bryan Drewery2017-10-314-4/+0
| | | | | | | Sponsored by: Dell EMC Isilon Notes: svn path=/head/; revision=325188