summaryrefslogtreecommitdiff
path: root/sys/fs/tmpfs/tmpfs.h
Commit message (Collapse)AuthorAgeFilesLines
* tmpfs: reorder struct tmpfs_node to shrink it by 8 bytesMateusz Guzik2020-11-051-3/+7
| | | | | | | | The reduction (232 -> 224 bytes) allows UMA to fit one more item (17 -> 18) per slab as reported in vm.uma.TMPFS_node.keg.ipers. Notes: svn path=/head/; revision=367368
* tmpfs: restore atime updates for reads from page cache.Konstantin Belousov2020-09-161-8/+14
| | | | | | | | | | | | | | | | | Split TMPFS_NODE_ACCCESSED bit into dedicated byte that can be updated atomically without locks or (locked) atomics. tn_update_getattr() change also contains unrelated bug fix. Reported by: lwhsu PR: 249362 Reviewed by: markj (previous version) Discussed with: mjg Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D26451 Notes: svn path=/head/; revision=365810
* Add tmpfs page cache read support.Konstantin Belousov2020-09-151-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | Or it could be explained as lockless (for vnode lock) reads. Reads are performed from the node tn_obj object. Tmpfs regular vnode object lifecycle is significantly different from the normal OBJT_VNODE: it is alive as far as ref_count > 0. Ensure liveness of the tmpfs VREG node and consequently v_object inside VOP_READ_PGCACHE by referencing tmpfs node in tmpfs_open(). Provide custom tmpfs fo_close() method on file, to ensure that close is paired with open. Add tmpfs VOP_READ_PGCACHE that takes advantage of all tmpfs quirks. It is quite cheap in code size sense to support page-ins for read for tmpfs even if we do not own tmpfs vnode lock. Also, we can handle holes in tmpfs node without additional efforts, and do not have limitation of the transfer size. Reviewed by: markj Discussed with and benchmarked by: mjg (previous version) Tested by: pho Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D26346 Notes: svn path=/head/; revision=365787
* Microoptimize tmpfs node ref/unref by using atomics.Konstantin Belousov2020-09-151-2/+1
| | | | | | | | | | | | | Avoid tmpfs mount and node locks when ref count is greater than zero, which is the case until node is being destroyed by unlink or unmount. Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation Differential revision: https://reviews.freebsd.org/D26346 Notes: svn path=/head/; revision=365786
* tmpfs: add support for lockless lookupMateusz Guzik2020-07-251-0/+3
| | | | | | | | | Reviewed by: kib Tested by: pho (in a patchset) Differential Revision: https://reviews.freebsd.org/D25580 Notes: svn path=/head/; revision=363521
* tmpfs: Preserve alignment of struct fid fieldsRyan Moeller2020-06-031-5/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | On 64-bit platforms, the two short fields in `struct tmpfs_fid` are padded to the 64-bit alignment of the long field. This pushes the offsets of the subsequent fields by 4 bytes and makes `struct tmpfs_fid` bigger than `struct fid`. `tmpfs_vptofh()` casts a `struct fid *` to `struct tmpfs_fid *`, causing 4 bytes of adjacent memory to be overwritten when the struct fields are set. Through several layers of indirection and embedded structs, the adjacent memory for one particular call to `tmpfs_vptofh()` happens to be the stack canary for `nfsrvd_compound()`. Half of the canary ends up being clobbered, going unnoticed until eventually the stack check fails when `nfsrvd_compound()` returns and a panic is triggered. Instead of duplicating fields of `struct fid` in `struct tmpfs_fid`, narrow the struct to cover only the unique fields for tmpfs and assert at compile time that the struct fits in the allotted space. This way we don't have to replicate the offsets of `struct fid` fields, we just use them directly. Reviewed by: kib, mav, rmacklem Approved by: mav (mentor) MFC after: 1 week Sponsored by: iXsystems, Inc. Differential Revision: https://reviews.freebsd.org/D25077 Notes: svn path=/head/; revision=361748
* tmpfs: add nomtime mount option,Konstantin Belousov2020-02-041-0/+2
| | | | | | | | | | | | | | | | which disables tracking mtime updates due to writes through the shared mapped areas backed by tmpfs files. This removes periodic scans which downgrades rw mapped pages to ro to note the writes. Suggested by: mjg Reviewed by: markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D23432 Notes: svn path=/head/; revision=357515
* tmpfs: inline tmpfs_updateMateusz Guzik2020-02-031-1/+20
| | | | | | | | | | It was generated to be just a jumping off point to tmpfs_itimes. While here provide a dedicated variant for getattr since we normally don't expect to need to the update from that caller. Notes: svn path=/head/; revision=357451
* Including <sys/tmpfs.h> into non-kernel software leads to aDoug Moore2019-12-191-2/+1
| | | | | | | | | | | | | | | | | | compilation error because, without _KERNEL defined, the macro TMPFS_VALIDATE_DIR is invoked, but never defined. User-level software that includes sys/tmpfs.h must define _KERNEL to make the definition of TMPFS_VALIDATE_DIR visible. This change puts all the inline functions that, directly or indirectly, invoke MPASS into the scope of the _KERNEL block, allowing many user-space includers of <sys/tmpfs.h> to stop defining _KERNEL. Reviewed by: alc, kib MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D22874 Notes: svn path=/head/; revision=355913
* Stop using per-mount tmpfs zones.Konstantin Belousov2019-12-051-5/+2
| | | | | | | | | | Requested and reviewed by: jeff Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D22643 Notes: svn path=/head/; revision=355407
* tmpfs: ignore tmpfs_set_status() if mount point is read-only.Konstantin Belousov2019-04-021-3/+4
| | | | | | | | | | | | | In particular, this fixes atimes still changing for ro tmpfs. tmpfs_set_status() gains tmpfs_mount * argument. Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D19737 Notes: svn path=/head/; revision=345800
* Make TMPFS_PAGES_MINRESERVED a kernel optionAllan Jude2019-03-251-0/+2
| | | | | | | | | | | | | | | | TMPFS_PAGES_MINRESERVED controls how much memory is reserved for the system and not used by tmpfs. On very small memory systems, the default value may be too high and this prevents these small memory systems from using reroot, which is required for them to install firmware updates. Submitted by: Hiroki Mori <yamori813@yahoo.co.jp> Reviewed by: mizhka Differential Revision: https://reviews.freebsd.org/D13583 Notes: svn path=/head/; revision=345491
* Make it possible to update TMPFS mount point from read-only to read-writeMaxim Sobolev2019-03-221-0/+5
| | | | | | | | | | | | and vice versa. Reviewed by: delphij Approved by: delphij MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D19682 Notes: svn path=/head/; revision=345425
* tmpfs: use unr64 for inode numbersMateusz Guzik2018-11-201-1/+1
| | | | | | | Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=340679
* Make vop_symlink take a const target path.Brooks Davis2018-11-021-2/+2
| | | | | | | | | | | | | | | | | | | | This will enable callers to take const paths as part of syscall decleration improvements. Where doing so is easy and non-distruptive carry the const through implementations. In UFS the value is passed to an interface that must take non-const values. In ZFS, const poisoning would touch code shared with upstream and it's not worth adding diffs. Bump __FreeBSD_version for external API consumers. Reviewed by: kib (prior version) Obtained from: CheriBSD Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D17805 Notes: svn path=/head/; revision=340055
* Update tmpfs link count handling for ino64.John Baldwin2017-12-191-1/+3
| | | | | | | | | | | | | Add a new TMPFS_LINK_MAX to use in place of LINK_MAX for link overflow checks and pathconf() reporting. Rather than storing a full 64-bit link count, just use a plain int and use INT_MAX as TMPFS_LINK_MAX. Discussed with: bde Reviewed by: kib (part of a larger patch) Sponsored by: Chelsio Communications Notes: svn path=/head/; revision=326998
* Reduce pollution via tmpfs.h.Gleb Smirnoff2017-12-061-11/+2
| | | | Notes: svn path=/head/; revision=326607
* 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
* Remove mistakenly merged field.Konstantin Belousov2017-01-191-2/+0
| | | | | | | | Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=312435
* Add mount option for tmpfs(5) to not use namecache.Konstantin Belousov2017-01-191-1/+10
| | | | | | | | | | | | | | | | | | The option "nonc" disables using of namecache for the created mount, by default namecache is used. The rationale for the option is that namecache duplicates the information which is already kept in memory by tmpfs. Since it believed that namecache scales better than tmpfs, or will scale better, do not enable the option by default. On the other hand, smaller machines may benefit from lesser namecache pressure. Discussed with: mjg Tested by: pho (as part of larger patch) Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Notes: svn path=/head/; revision=312432
* Refcount tmpfs nodes and mount structures.Konstantin Belousov2017-01-191-1/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | On dotdot lookup and fhtovp operations, it is possible for the file represented by tmpfs node to be removed after the thread calculated the pointer. In this case, tmpfs_alloc_vp() accesses freed memory. Introduce the reference count on the nodes. The allnodes list from tmpfs mount owns 1 reference, and threads performing unlocked operations on the node, add one transient reference. Similarly, since struct tmpfs_mount maintains the list where nodes are enlisted, refcount it by one reference from struct mount and one reference from each node on the list. Both nodes and tmpfs_mounts are removed when refcount goes to zero. Note that this means that nodes and tmpfs_mounts might survive some time after the node is deleted or tmpfs_unmount() finished. The tmpfs_alloc_vp() in these cases returns error either due to node removal (tn_nlinks == 0) or because of insmntque1(9) error. Tested by: pho (as part of larger patch) Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Notes: svn path=/head/; revision=312428
* Make tmpfs directory cursor available outside tmpfs_subr.c.Konstantin Belousov2017-01-191-0/+9
| | | | | | | | | Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=312425
* Rename tmpfs_mount member allnode_lock to include namespace prefix.Konstantin Belousov2017-01-191-4/+5
| | | | | | | | Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=312414
* Protect macro argument.Konstantin Belousov2017-01-191-3/+3
| | | | | | | | | Requested by: hselasky Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=312412
* Rework some tmpfs lock assertions.Konstantin Belousov2017-01-191-10/+1
| | | | | | | | | | | | | | Remove TMPFS_ASSERT_ELOCKED(). Its claims are already stated by other asserts nearby and by VFS guarantees. Change TMPFS_ASSERT_LOCKED() and one inlined place to use ASSERT_VOP_(E)LOCKED() instead of hand-rolled imprecise asserts. Tested by: pho (as part of the larger patch) Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=312410
* Style fixes and comment updates.Konstantin Belousov2017-01-191-103/+123
| | | | | | | | | | | | Edit comments which explain no longer relevant details, and add locking annotations to the struct tmpfs_node members. Tested by: pho (as part of the larger patch) Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=312409
* Remove unused union member, fifos on tmpfs are implemented in common code.Konstantin Belousov2017-01-191-6/+0
| | | | | | | | Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=312407
* tmpfs: manage tm_pages_used with atomicsMateusz Guzik2017-01-141-3/+3
| | | | | | | Reviewed by: kib (previous version) Notes: svn path=/head/; revision=312124
* Lock tmpfs node tn_status updates done under the shared vnode lock.Konstantin Belousov2017-01-061-1/+4
| | | | | | | | | | | | | | | | | If tmpfs vnode is only shared locked, tn_status field still needs updates to note the access time modification. Use the same locking scheme as for UFS, protect tn_status with the node interlock + shared vnode lock. Fix nearby style. Noted and reviewed by: mjg Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=311525
* Update mtime for tmpfs files modified through memory mapping. SimilarKonstantin Belousov2015-01-281-0/+1
| | | | | | | | | | | | | | | | | | | | to UFS, perform updates during syncer scans, which in particular means that tmpfs now performs scan on sync. Also, this means that a mtime update may be delayed up to 30 seconds after the write. The vm_object' OBJ_TMPFS_DIRTY flag for tmpfs swap object is similar to the OBJ_MIGHTBEDIRTY flag for the vnode object, it indicates that object could have been dirtied. Adapt fast page fault handler and vm_object_set_writeable_dirty() to handle OBJ_TMPFS_NODE same as OBJT_VNODE. Reported by: Ronald Klop <ronald-lists@klop.ws> Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Notes: svn path=/head/; revision=277828
* Rework the tmpfs unmount.Konstantin Belousov2014-07-141-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - Suspend filesystem for unmount. This prevents new tmpfs nodes from instantiating, and also ensures that only unmount thread can destroy nodes. - Do not start tmpfs node deletion until all vnodes are reclaimed, which guarantees that no thread can access tmpfs data. For this, call vflush() in the loop, until the mnt_nvnodelistsize is non-zero. Note that after mnt_nvnodelistsize becomes 0, insmntque() blocks insertion of a vnode germ into the mount list of vnodes. - Fail node allocation when the filesystem is being unmounted. This is race-free due to the vflush() call in loop. This is mostly cosmetic, avoiding some more work which might be done until suspension in unmount is started. Note that there is currently no way to prevent new vnode instantiation from readers during the unmount. Due to this, forced unmount might live-lock if vflush() loop cannot get to the zero vnode count due to races with readers. The unmount would proceed after the load is lifted. Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Notes: svn path=/head/; revision=268617
* Add convenience macro to assert tmpfs node lock.Konstantin Belousov2014-07-141-0/+2
| | | | | | | | | Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Notes: svn path=/head/; revision=268610
* Remove code separator lines which do not conform to style(9).Konstantin Belousov2014-07-141-23/+0
| | | | | | | | Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Notes: svn path=/head/; revision=268605
* In msdosfs_setattr(), add a check for result of the utimes(2)Konstantin Belousov2014-06-171-2/+2
| | | | | | | | | | | | | | | | | permissions test, forgotten in r164033. Refactor the permission checks for utimes(2) into vnode helper function vn_utimes_perm(9), and simplify its code comparing with the UFS origin, by writing the call to VOP_ACCESSX only once. Use the helper for UFS(5), tmpfs(5), devfs(5) and msdosfs(5). Reported by: bde Reviewed by: bde, trasz Sponsored by: The FreeBSD Foundation MFC after: 1 week Notes: svn path=/head/; revision=267564
* The tmpfs_alloc_vp() is used to instantiate vnode for the tmpfs node,Konstantin Belousov2013-08-051-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | in particular, from the tmpfs_lookup VOP method. If LK_NOWAIT is not specified in the lkflags, the lookup is supposed to return an alive vnode whenever the underlying node is valid. Currently, the tmpfs_alloc_vp() returns ENOENT if the vnode attached to node exists and is being reclaimed. This causes spurious ENOENT errors from lookup on tmpfs and corresponding random 'No such file' failures from syscalls working with tmpfs files. Fix this by waiting for the doomed vnode to be detached from the tmpfs node if sleepable allocation is requested. Note that filesystems which use vfs_hash.c, correctly handle the case due to vfs_hash_get() looping when vget() returns ENOENT for sleepable requests. Reported and tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Notes: svn path=/head/; revision=253967
* For the new regular tmpfs vnode, v_object is initialized beforeKonstantin Belousov2013-05-021-0/+1
| | | | | | | | | | | | | | | | | insmntque() is called. The standard insmntque destructor resets the vop vector to deadfs one, and calls vgone() on the vnode. As result, v_object is kept unchanged, which triggers an assertion in the reclaim code, on instmntque() failure. Also, in this case, OBJ_TMPFS flag on the backed vm object is not cleared. Provide the tmpfs insmntque() destructor which properly clears OBJ_TMPFS flag and resets v_object. Reported and tested by: pho Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=250189
* - Make 'flags' argument to chflags(2), fchflags(2) and lchflags(2) of typePawel Jakub Dawidek2013-03-211-2/+2
| | | | | | | | | | | | | | u_long. Before this change it was of type int for syscalls, but prototypes in sys/stat.h and documentation for chflags(2) and fchflags(2) (but not for lchflags(2)) stated that it was u_long. Now some related functions use u_long type for flags (strtofflags(3), fflagstostr(3)). - Make path argument of type 'const char *' for consistency. Discussed on: arch Sponsored by: The FreeBSD Foundation Notes: svn path=/head/; revision=248597
* tmpfs: Replace directory entry linked list with RB-Tree.Gleb Kurtsou2013-01-061-95/+73
| | | | | | | | | | | | | | | | | | | | | | | | Use file name hash as a tree key, handle duplicate keys. Both VOP_LOOKUP and VOP_READDIR operations utilize same tree for search. Directory entry offset (cookie) is either file name hash or incremental id in case of hash collisions (duplicate-cookies). Keep sorted per directory list of duplicate-cookie entries to facilitate cookie number allocation. Don't fail if previous VOP_READDIR() offset is no longer valid, start with next dirent instead. Other file system handle it similarly. Workaround race prone tn_readdir_last[pn] fields update. Add tmpfs_dir_destroy() to free all dirents. Set NFS cookies in tmpfs_dir_getdents(). Return EJUSTRETURN from tmpfs_dir_getdents() instead of hard coded -1. Mark directory traversal routines static as they are no longer used outside of tmpfs_subr.c Notes: svn path=/head/; revision=245115
* tmpfs: Allow update mounts only for certain options.Jaakko Heinonen2012-04-161-0/+3
| | | | | | | | | | | Since r230208 update mounts were allowed if the list of mount options contained the "export" option. This is not correct as tmpfs doesn't really support updating all options. Reviewed by: kevlo, trociny Notes: svn path=/head/; revision=234346
* Add reserved memory limit sysctl to tmpfs.Gleb Kurtsou2012-04-071-50/+7
| | | | | | | | | | Cleanup availble and used memory functions. Check if free pages available before allocating new node. Discussed with: delphij Notes: svn path=/head/; revision=233998
* When tmpfs_write() resets an extended file to its original size after anAlan Cox2012-01-161-1/+1
| | | | | | | | | | | error, we want tmpfs_reg_resize() to ignore I/O errors and unconditionally update the file's size. Reviewed by: kib MFC after: 3 weeks Notes: svn path=/head/; revision=230180
* Improve the way to calculate available pages in tmpfs:Xin LI2011-11-211-4/+1
| | | | | | | | | | | | | | | | | - Don't deduct wired pages from total usable counts because it does not make any sense. To make things worse, on systems where swap size is smaller than physical memory and use a lot of wired pages (e.g. ZFS), tmpfs can suddenly have free space of 0 because of this; - Count cached pages as available; [1] - Don't count inactive pages as available, technically we could but that might be too aggressive; [1] [1] Suggested by kib@ MFC after: 1 week Notes: svn path=/head/; revision=227802
* Eliminate tn_reg.tn_aobj_pages. Instead, correctly maintain the vmAlan Cox2011-02-131-1/+0
| | | | | | | | | | | | object's size field. Previously, that field was always zero, even when the object tn_reg.tn_aobj contained numerous pages. Apply style fixes to tmpfs_reg_resize(). In collaboration with: kib Notes: svn path=/head/; revision=218640
* Add support for whiteouts on tmpfs.Ed Schouten2010-08-221-1/+4
| | | | | | | | | | | | | | | | | Right now unionfs only allows filesystems to be mounted on top of another if it supports whiteouts. Even though I have sent a patch to daichi@ to let unionfs work without it, we'd better also add support for whiteouts to tmpfs. This patch implements .vop_whiteout and makes necessary changes to lookup() and readdir() to take them into account. We must also make sure that when adding or removing a file, we honour the componentname's DOWHITEOUT and ISWHITEOUT, to prevent duplicate filenames. MFC after: 1 month Notes: svn path=/head/; revision=211598
* - Fix some style bugs in tmpfs_mount(). [1]Jaakko Heinonen2010-01-131-4/+0
| | | | | | | | | - Remove a stale comment about tmpfs_mem_info() 'total' argument. Reported by: bde [1] Notes: svn path=/head/; revision=202187
* Add locking around access to parent node, and bail out when the parentXin LI2009-10-111-1/+21
| | | | | | | | | | | | node is already freed rather than panicking the system. PR: kern/122038 Submitted by: gk Tested by: pho MFC after: 1 week Notes: svn path=/head/; revision=197953
* Remove the thread argument from the FSD (File-System Dependent) parts ofAttilio Rao2009-05-111-2/+2
| | | | | | | | | | | | | | | | | | | | the VFS. Now all the VFS_* functions and relating parts don't want the context as long as it always refers to curthread. In some points, in particular when dealing with VOPs and functions living in the same namespace (eg. vflush) which still need to be converted, pass curthread explicitly in order to retain the old behaviour. Such loose ends will be fixed ASAP. While here fix a bug: now, UFS_EXTATTR can be compiled alone without the UFS_EXTATTR_AUTOSTART option. VFS KPI is heavilly changed by this commit so thirdy parts modules needs to be recompiled. Bump __FreeBSD_version in order to signal such situation. Notes: svn path=/head/; revision=191990
* Lookup up the directory entry for the tmpfs node that are deleted byKonstantin Belousov2009-02-081-2/+1
| | | | | | | | | | | | both node pointer and name component. This does the right thing for hardlinks to the same node in the same directory. Submitted by: Yoshihiro Ota <ota j email ne jp> PR: kern/131356 MFC after: 2 weeks Notes: svn path=/head/; revision=188318
* The kernel implemented 'memcmp' is an alias for 'bcmp'. However, memcmpDavid E. O'Brien2008-09-231-1/+1
| | | | | | | | | | | | | | and bcmp are not the same thing. 'man bcmp' states that the return is "non-zero" if the two byte strings are not identical. Where as, 'man memcmp' states that the return is the "difference between the first two differing bytes (treated as unsigned char values" if the two byte strings are not identical. So provide a proper memcmp(9), but it is a C implementation not a tuned assembly implementation. Therefore bcmp(9) should be preferred over memcmp(9). Notes: svn path=/head/; revision=183299
* Reflect license change of NetBSD code.Xin LI2008-09-031-8/+1
| | | | | | | | Obtained from: NetBSD MFC after: 3 days Notes: svn path=/head/; revision=182739