Annotation of 43BSDReno/share/doc/smm/13.kchanges/sys.ufs.t, revision 1.1.1.1

1.1       root        1: .\" Copyright (c) 1986 Regents of the University of California.
                      2: .\" All rights reserved.  The Berkeley software License Agreement
                      3: .\" specifies the terms and conditions for redistribution.
                      4: .\"
                      5: .\"    @(#)sys.ufs.t   1.5 (Berkeley) 4/11/86
                      6: .\"
                      7: .NH
                      8: Changes in the filesystem
                      9: .PP
                     10: The major change in the filesystem was the addition of a name translation
                     11: cache.
                     12: A table of recent name-to-inode translations is maintained by \fInamei\fP,
                     13: and used as a lookaside cache when translating each component of each
                     14: file pathname.
                     15: Each \fInamecache\fP entry contains the parent directory's device and inode,
                     16: the length of the name, and the name itself, and is hashed on the name.
                     17: It also contains a pointer to the inode for the file whose name it contains.
                     18: Unlike most inode pointers, which hold a ``hard'' reference
                     19: by incrementing the reference count,
                     20: the name cache holds a ``soft'' reference, a pointer to an inode
                     21: that may be reused.
                     22: In order to validate the inode from a name cache reference,
                     23: each inode is assigned a unique ``capability'' when it is brought
                     24: into memory.
                     25: When the inode entry is reused for another file,
                     26: or when the name of the file is changed,
                     27: this capability is changed.
                     28: This allows the inode cache to be handled normally,
                     29: releasing inodes at the head of the LRU list without regard for name
                     30: cache references,
                     31: and allows multiple names for the same inode to be in the cache simultaneously
                     32: without complicating the invalidation procedure.
                     33: An additional feature of this scheme is that when opening
                     34: a file, it is possible to determine whether the file was previously open.
                     35: This is useful when beginning execution of a file, to check whether
                     36: the file might be open for writing, and for similar situations.
                     37: .PP
                     38: Other changes that are visible throughout the filesystem
                     39: include greater use of the ILOCK and IUNLOCK macros rather than the
                     40: subroutine equivalents.
                     41: The inode times are updated on each \fIirele\fP, not only when
                     42: the reference count reaches zero,
                     43: if the IACC, IUPD or ICHG flags are set.
                     44: This is accomplished with the ITIMES macro;
                     45: the inode is marked as modified with the new IMOD flag,
                     46: that causes it to be written to disk when released, or on the next sync.
                     47: .PP
                     48: The remainder of this section describes the filesystem changes that are
                     49: localized to individual files.
                     50: .XP ufs_alloc.c
                     51: The algorithm for extending file fragments was changed
                     52: to take advantage of the observation that fragments that were once extended
                     53: were frequently extended again, that is, that the file was being written
                     54: in fragments.
                     55: Therefore, the first time a given fragment is allocated,
                     56: a best-fit strategy is used.
                     57: Thereafter, when this fragment is to be extended,
                     58: a full-sized block is allocated, the fragment removed from it,
                     59: and the remainder freed for use in subsequent expansion.
                     60: As this policy may result in increased fragmentation,
                     61: it is not used when the filesystem becomes excessively
                     62: fragmented (i.e. when the number of free fragments falls to 2%
                     63: of the minfree value);
                     64: the policy is stored in the superblock and may be changed with \fItunefs\fP.
                     65: The \fIfserr\fP routine was converted to use \fIlog\fP rather than \fIprintf\fP.
                     66: .XP ufs_bio.c
                     67: I/O operations traced now include the size where relevant.
                     68: .XP ufs_inode.c
                     69: The size of the buffer hash table was increased substantially
                     70: and changed to a power of two to allow the modulus to be computed with a mask
                     71: operation.
                     72: \fIIget\fP invalidates the capability in each inode that is flushed
                     73: from the inode cache for reuse.
                     74: The new \fIigrab\fP routine is used instead of \fIiget\fP
                     75: when fetching an inode from a name cache reference;
                     76: it waits for the inode to be unlocked if necessary,
                     77: and removes it from the free list if it was free.
                     78: The caller must check that the inode is still valid after the \fIigrab\fP.
                     79: A bug was fixed in \fIitrunc\fP that allowed old contents to creep back into
                     80: a file.
                     81: When truncating to a location within a block,
                     82: \fIitrunc\fP must clear the remainder of the block.
                     83: Otherwise, if the file is extended by seeking past the end of file
                     84: and then writing, the old contents reappear.
                     85: .\" \fIItrunc\fP also waits for 
                     86: .XP ufs_mount.c
                     87: The \fImount\fP system call was modified to return different error numbers
                     88: for different types of errors.
                     89: \fIMount\fP now examines the superblock more carefully
                     90: before using size field it contains as the amount to copy into a new buffer.
                     91: If a mount fails for a reason other than the device already being
                     92: mounted, the device is closed again.
                     93: When performing the name lookup for the mount point,
                     94: \fImount\fP must prevent the name translation from being left
                     95: in the name cache;
                     96: \fIumount\fP must flush all name translations for the device.
                     97: A bug in \fIgetmdev\fP caused an inode to remain locked
                     98: if the specified device was not a block special file; this has been fixed.
                     99: .XP ufs_namei.c
                    100: This file was previously called ufs_nami.c.
                    101: The \fInamei\fP function has a new calling convention
                    102: with its arguments, associated context, and side effects
                    103: encapsulated in a single structure.
                    104: It has been extensively modified to implement the name cache
                    105: and to cache directory offsets for each process.
                    106: It may now return ENAMETOOLONG when appropriate,
                    107: and returns EINVAL if the 8th bit is set on one of the pathname
                    108: characters.
                    109: Directories may be foreshortened if the last one or more blocks
                    110: contain no entries;
                    111: this is done when files are being created, as the entire directory 
                    112: must already be searched.
                    113: An entry is provided for invalidating the entire name cache
                    114: when the 32-bit prototype for capabilities wraps around.
                    115: This is expected to happen after 13 months of operation,
                    116: assuming 100 name lookups per second, all of which miss the cache.
                    117: .XP
                    118: A change in filesystem semantics is the introduction
                    119: of ``sticky'' directories.
                    120: If the ISVTX (sticky text) bit is set in the mode of a directory,
                    121: files may only be removed from that directory by the owner of the file,
                    122: the owner of the directory, or the superuser.
                    123: This is enforced by \fInamei\fP when the lookup operation is DELETE. 
                    124: .XP ufs_subr.c
                    125: The strategy for \fIsyncip\fP, the internal routine implementing \fIfsync\fP,
                    126: has been modified for large files (those larger than half of the buffer
                    127: cache).
                    128: For large files all modified buffers for the device are written out.
                    129: The old algorithm could run for a very long time on a very large file,
                    130: that might not actually have many data blocks.
                    131: The \fIupdate\fP routine now saves some work by calling \fIiupdate\fP
                    132: only for modified inodes.
                    133: The C replacements for the special VAX instructions have been collected
                    134: in this file.
                    135: .XP ufs_syscalls.c
                    136: When doing an open with flags O_CREAT and O_EXCL (create only if the file
                    137: did not exist), it is now considered to be an error if the target exists
                    138: and is a symbolic link, even if the symbolic link refers to a nonexistent
                    139: file.
                    140: This behavior is desirable for reasons of security
                    141: in programs that create files with predictable names.
                    142: \fIRename\fP follows the policy of \fInamei\fP in disallowing removal
                    143: of the target of a rename if the target directory is ``sticky''
                    144: and the user is not the owner of the target or the target directory.
                    145: A serious bug in the open code which allowed directories and other unwritable
                    146: files to be truncated has been corrected.
                    147: Interrupted opens no longer lose file descriptors.
                    148: The \fIlseek\fP call returns an ESPIPE error when seeking on sockets
                    149: (including pipes) for backward compatibility.
                    150: The error returned from \fIreadlink\fP when reading something other than
                    151: a symbolic link was changed from ENXIO to EINVAL.
                    152: Several calls that previously failed silently on read-only filesystems
                    153: (\fIchmod\fP, \fIchown\fP, \fIfchmod\fP, \fIfchown\fP and \fIutimes\fP)
                    154: now return EROFS.
                    155: The \fIrename\fP code was reworked to avoid several races
                    156: and to invalidate the name cache.
                    157: It marks a directory being renamed with IRENAME
                    158: to avoid races due to concurrent renames of the same directory.
                    159: \fIMkdir\fP now sets the size of all new directories to DIRBLKSIZE.
                    160: \fIRmdir\fP purges the name cache of entries for the removed directory.
                    161: .XP ufs_xxx.c
                    162: The routines \fIuchar\fP and \fIschar\fP are no longer used
                    163: and have been removed.
                    164: .XP quota_kern.c
                    165: The quota hash size was changed to a power of 2 so that the modulus could
                    166: be computed with a mask.
                    167: .XP quota_ufs.c
                    168: If a user has run out of warnings and had the hard limit enforced
                    169: while logged in,
                    170: but has then brought his allocation below the hard limit,
                    171: the quota system reverts to enforcing the soft limit,
                    172: and resets the warning count;
                    173: users previously were required to log out and in again to
                    174: get this affect.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.