Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

icheck(1)

dcheck(1)

dir(5)

mount(1)

stat(2)

types(5)

FILSYS(5)  —  UNIX Programmer’s Manual

NAME

filsys, flblk, ino − format of file system volume

SYNOPSIS

#include <sys/types.h>
#include <sys/flbk.h>
#include <sys/filsys.h>
#include <sys/ino.h>

DESCRIPTION

Every file system storage volume (e.g floppy disk, hard disk, or tape) has a common format for certain vital information.  Every such volume is divided into a certain number of 512-byte blocks.  Block 0 is unused and is available to contain a bootstrap program, pack label, or other information. 

Block 1 is the super block.  The layout of the super block as defined by the include file <sys/filsys.h> is:

Structure of the super-block

structfilsys {
unsigned short s_isize;/* size in blocks of i-list */
daddr_ts_fsize;   /* size in blocks of entire volume */
short  s_nfree;   /* number of addresses in s_free */
daddr_ts_free[NICFREE];/* free block list */
short  s_ninode;  /* number of i-nodes in s_inode */
ino_t  s_inode[NICINOD];/* free i-node list */
char   s_flock;   /* lock during free list manipulation */
char   s_ilock;   /* lock during i-list manipulation */
char   s_fmod;    /* super block modified flag */
char   s_ronly;   /* mounted read-only flag */
time_t s_time;    /* last super block update */
daddr_ts_tfree;   /* total free blocks*/
ino_t  s_tinode;  /* total free inodes */
short  s_m;       /* interleave factor */
short  s_n;       /* " " */
char   s_fname[6];/* file system name */
char   s_fpack[6];/* file system pack name */
};

"S_isize" is the address of the first block after the i-list, which starts just after the super-block, in block 2.  Thus i-list is s_isize −2 blocks long.  "S_fsize" is the address of the first block not potentially available for allocation to a file.  These numbers are used by the system to check for bad block addresses; if an ’impossible’ block address is allocated from the free list or is freed, a diagnostic is written on the on-line console.  Moreover, the free array is cleared, so as to prevent further allocation from a presumably corrupted free list. 

The free list for each volume is maintained as follows.  The "s_free" array contains, in "s_free[1], ... , s_free[s_nfree−1]," up to NICFREE free block numbers.  NICFREE is a configuration constant.  "S_free[0]" is the block address of the head of a chain of blocks constituting the free list.  The layout of each block of the free chain as defined in the include file <sys/fblk.h> is:

struct fblk {
short  df_nfree;
daddr_tdf_free[NICFREE];
};

The fields "df_nfree" and "df_free" in a free block are used exactly like "s_nfree" and "s_free" in the super block.  To allocate a block: decrement "s_nfree," and the new block number is "s_free[s_nfree]".  If the new block address is 0, there are no blocks left, so give an error.  If "s_nfree" became 0, read the new block into "s_nfree" and "s_free".  To free a block, check if "s_nfree" is NICFREE; if so, copy "s_nfree" and the "s_free" array into it, write it out, and set "s_nfree" to 0.  In any event set "s_free"[s_nfree] to the freed block’s address and increment "s_nfree". 

"S_ninode" is the number of free i-numbers in the s_inode array.  To allocate an i-node: if "s_ninode" is greater than 0, decrement it and return s_inode[s_ninode].  If it was 0, read the i-list and place the numbers of all free inodes (up to NICINOD) into the s_inode array, then try again.  To free an i-node, provided "s_ninode" is less than NICINODE, place its number into s_inode[s_ninode] and increment "s_ninode".  If "s_ninode" is already NICINODE, don’t bother to enter the freed i-node into any table.  This list of i-nodes is only to speed up the allocation process; the information as to whether the inode is really free or not is maintained in the inode itself. 

"S_flock" and "s_ilock" are flags maintained in the core copy of the file system while it is mounted and their values on disk are immaterial.  The value of "s_fmod" on disk is likewise immaterial; it is used as a flag to indicate that the super-block has changed and should be copied to the disk during the next periodic update of file system information.  "S_ronly" is a write-protection indicator; its disk value is also immaterial. 

"S_time" is the last time the super-block of the file system was changed.  During a reboot, "s_time" of the super-block for the root file system is used to set the system’s idea of the time. 

The fields "s_tfree", "s_tinode", "s_fname" and "s_fpack" are not currently maintained. 

I-numbers begin at 1, and the storage for i-nodes begins in block 2.  I-nodes are 64 bytes long, so 8 of them fit into a block.  I-node 2 is reserved for the root directory of the file system, but no other i-number has a built-in meaning.  Each i-node represents one file.  The format of an i-node as given in the include file <sys/ino.h> is:

Inode structure as it appears on a disk block. 

struct dinode {
unsigned short di_mode;     /* mode and type of file */
shortdi_nlink;    /* number of links to file */
shortdi_uid;      /* owner’s user id */
shortdi_gid;      /* owner’s group id */
off_tdi_size;     /* number of bytes in file */
char  di_addr[40];/* disk block addresses */
time_tdi_atime;   /* time last accessed */
time_tdi_mtime;   /* time last modified */
time_tdi_ctime;   /* time created */
};
#defineINOPB8/* 8 inodes per block */
/*
 * the 40 address bytes:
 *39 used; 13 addresses
 *of 3 bytes each.
 */

"Di_mode" tells the kind of file; it is encoded identically to the "st_mode" field of stat(2). "Di_nlink" is the number of directory entries (links) that refer to this i-node. "Di_uid" and "di_gid" are the owner’s user and group IDs. Size is the number of bytes in the file.  "Di_atime" and "di_mtime" are the times of last access and modification of the file contents (read, write or create) (see times(2)); "Di_ctime" records the time of last modification to the inode or to the file, and is used to determine whether it should be dumped.

Special files are recognized by their modes and not by i-number.  A block-type special file is one which can potentially be mounted as a file system; a character-type special file cannot, though it is not necessarily character-oriented.  For special files, the "di_addr" field is occupied by the device code (see types(5)). The device codes of block and character special files overlap.

Disk addresses of plain files and directories are kept in the array "di_addr" packed into 3 bytes each.  The first 10 addresses specify device blocks directly.  The last 3 addresses are singly, doubly, and triply indirect and point to blocks of 128 block pointers.  Pointers in indirect blocks have the type "daddr_t" (see types(5)).

For block b in a file to exist, it is not necessary that all blocks less than b exist.  A zero block number either in the address words of the i-node or in an indirect block indicates that the corresponding block has never been allocated.  Such a missing block reads as if it contained all zero words. 

SEE ALSO

icheck(1), dcheck(1), dir(5), mount(1), stat(2), types(5)

7th Edition

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026