A file system is a set of files, directories and other structures. The file systems maintain information and identify where the data is located on the disk for a file or directory. In addition to files and directories a JFS2 file system contains a superblock, allocation maps and one or more allocation groups. An allocation group contains disk inodes and extents. Each file system occupies one logical volume.
The superblock is 4096 bytes in size and starts at byte offset 32768 on the disk. The superblock maintains information about the entire file system and includes the following fields:
The file system contains two allocation maps:
A logical block contains a file or directory's data in units of file system blocks. Each logical block is allocated file system blocks for the storage of its data. Each file and directory has an i-node that contains access information such as file type, access permissions, owner's ID, and number of links to that file. These i-nodes also contain a "B+-tree" for finding the location on the disk where the data for a logical block is stored.
Allocation groups divide the space on a file system into chunks. Allocation groups are used for heuristics only. Allocation groups allow JFS2 resource allocation policies to use well known methods for achieving good I/O performance. First, the allocation policies try to cluster disk blocks and disk inodes for related data to achieve good locality for the disk. Files are often read and written sequentially and the files within a directory are often accessed together. Second, the allocation policies try to distribute unrelated data throughout the file system in order to accomodate disk locality.
Alocation groups within a file system are identified by a zero-based allocation group index, the allocation group number.
Allocation group sizes must be selected which yield allocation groups that are sufficiently large to provide for contiguous resource allocation over time. Allocation groups are limited to a maximum number of 128 groups. Additionally, the minimum allocation group size is 8192 file system blocks.
A file system whose size is not a multiple of the allocation group size will contain a partial allocation group; the last allocation group of the file system is not fully covered by disk blocks. This partial allocation group will be treated as a complete allocation group, except the non-existant disk blocks will be marked as allocated in the block allocation map.
The most used file system subroutines are:
|fscntl||Controls file system control operations|
|getfsent, getfsspec, getfsfile, getfstype, setfsent, or endfsent|
|Obtain information about a file system|
|lseek||Moves the read-write pointer|
|mntctl||Returns mount status information|
|vmount or mount||Make a file system ready for use|
|statfs, fstsfs, or ustat||Report file system statistics|
|sync||Updates file systems to disk|
Other subroutines are designed for use on
virtual file systems (VFS):
|getvfsent, getvfsbytype, getvfsbyname, getvfsbyflag, sevfsent, or endvfsent|
|Retrieve a VFS entry|
|umount or uvmount||Remove VFS from the file tree|
Working with JFS2 i-nodes
Chapter 5, File Systems and Directories
Chapter 13, Logical Volume Programming
How to Add a Journaled File System on a New Logical Volume
Creating New File System Types
JFS File Space Allocation