*nix Documentation Project
·  Home
 +   man pages
·  Linux HOWTOs
·  FreeBSD Tips
·  *niX Forums

  man pages->OpenBSD man pages -> inode (5)              
Title
Content
Arch
Section
 

FS(5)

Contents


NAME    [Toc]    [Back]

     fs, inode - format of file system volume

SYNOPSIS    [Toc]    [Back]

     #include <sys/types.h>
     #include <ufs/ffs/fs.h>
     #include <ufs/ufs/inode.h>

DESCRIPTION    [Toc]    [Back]

     The files <ufs/ffs/fs.h> and <ufs/ufs/inode.h> declare  several structures
     and define variables and macros which are used to create and
manage the
     underlying format of file system objects  on  random  access
devices
     (disks).

     The  block  size  and number of blocks which comprise a file
system are parameters
 of the file system.  Sectors  beginning  at  BBLOCK
and continuing
     for  BBSIZE  are  used for a disklabel and for some hardware
primary and
     secondary bootstrapping programs.

     The actual file system begins  at  sector  SBLOCK  with  the
super-block that
     is  of  size  SBSIZE.  The following structure describes the
super-block and
     is from the file <ufs/ffs/fs.h>:

     #define FS_MAGIC 0x011954
     struct fs {
             int32_t   fs_firstfield;  /*  historic  file  system
linked list, */
             int32_t  fs_unused_1;   /*     used for incore super
blocks */
             int32_t  fs_sblkno;     /* addr  of  super-block  in
filesys */
             int32_t   fs_cblkno;      /*  offset of cyl-block in
filesys */
             int32_t  fs_iblkno;     /* offset of inode-blocks in
filesys */
             int32_t   fs_dblkno;     /* offset of first data after cg */
             int32_t  fs_cgoffset;   /* cylinder group offset  in
cylinder */
             int32_t  fs_cgmask;     /* used to calc mod fs_ntrak
*/
             time_t   fs_time;       /* last time written */
             int32_t  fs_size;       /* number of blocks in fs */
             int32_t   fs_dsize;      /* number of data blocks in
fs */
             int32_t  fs_ncg;        /* number of cylinder groups
*/
             int32_t   fs_bsize;       /* size of basic blocks in
fs */
             int32_t  fs_fsize;      /* size of frag blocks in fs
*/
             int32_t   fs_frag;        /*  number  of  frags in a
block in fs */
     /* these are configuration parameters */
             int32_t  fs_minfree;     /*  minimum  percentage  of
free blocks */
             int32_t   fs_rotdelay;    /*  num  of ms for optimal
next block */
             int32_t  fs_rps;        /* disk revolutions per second */
     /* these fields can be computed from the others */
             int32_t   fs_bmask;       /*  ``blkoff'' calc of blk
offsets */
             int32_t  fs_fmask;      /* ``fragoff'' calc of  frag
offsets */
             int32_t   fs_bshift;     /* ``lblkno'' calc of logical blkno */
             int32_t  fs_fshift;     /* ``numfrags'' calc  number
of frags */
     /* these are configuration parameters */
             int32_t   fs_maxcontig;  /* max number of contiguous
blks */
             int32_t  fs_maxbpg;     /* max number  of  blks  per
cyl group */
     /* these fields can be computed from the others */
             int32_t  fs_fragshift;  /* block to frag shift */
             int32_t  fs_fsbtodb;    /* fsbtodb and dbtofsb shift
constant */
             int32_t  fs_sbsize;      /*  actual  size  of  super
block */
             int32_t   fs_csmask;      /*  csum block offset (now
unused) */
             int32_t  fs_csshift;    /* csum  block  number  (now
unused) */
             int32_t  fs_nindir;     /* value of NINDIR */
             int32_t  fs_inopb;      /* value of INOPB */
             int32_t  fs_nspf;       /* value of NSPF */
     /* yet another configuration parameter */
             int32_t   fs_optim;      /* optimization preference,
see below */
     /* these fields are derived from the hardware */
             int32_t  fs_npsect;     /* # sectors/track including
spares */
             int32_t   fs_interleave;  /*  hardware sector interleave */
             int32_t  fs_trackskew;  /* sector 0 skew, per  track
*/
     /*  fs_id  takes  the  space of the unused fs_headswitch and
fs_trkseek */
             int32_t  fs_id[2];      /* unique filesystem id */
     /* sizes determined by number of cylinder groups  and  their
sizes */
             int32_t   fs_csaddr;     /* blk addr of cyl grp summary area */
             int32_t  fs_cssize;     /* size of cyl  grp  summary
area */
             int32_t  fs_cgsize;     /* cylinder group size */
     /* these fields are derived from the hardware */
             int32_t  fs_ntrak;      /* tracks per cylinder */
             int32_t  fs_nsect;      /* sectors per track */
             int32_t  fs_spc;        /* sectors per cylinder */
     /* this comes from the disk driver partitioning */
             int32_t   fs_ncyl;       /* cylinders in file system
*/
     /* these fields can be computed from the others */
             int32_t  fs_cpg;        /* cylinders per group */
             int32_t  fs_ipg;        /* inodes per group */
             int32_t   fs_fpg;         /*  blocks  per  group   *
fs_frag */
     /* this data must be re-computed after crashes */
             struct csum fs_cstotal; /* cylinder summary information */
     /* these fields are cleared at mount time */
             int8_t   fs_fmod;       /* super block modified flag
*/
             int8_t   fs_clean;      /* file system is clean flag
*/
             int8_t   fs_ronly;      /* mounted read-only flag */
             int8_t   fs_flags;      /* see FS_ below */
             u_char   fs_fsmnt[MAXMNTLEN]; /* name mounted on */
     /* these fields retain the current block allocation info */
             int32_t  fs_cgrotor;     /* last cg searched */
             void     *fs_ocsp[NOCSPTRS]; /* padding; was list of
fs_cs bufs */
             u_int8_t *fs_contigdirs; /* # of contiguously  allocated dirs */
             struct  csum  *fs_csp;     /* cg summary info buffer
for fs_cs */
             int32_t *fs_maxcluster;  /* max cluster in each  cyl
group */
             int32_t   fs_cpc;         /* cyl per cycle in postbl
*/
             int16_t  fs_opostbl[16][8]; /*  old  rotation  block
list head */
             int32_t   fs_snapinum[20];/*  reserved  for snapshot
inode nums */
             int32_t  fs_avgfilesize; /*  expected  average  file
size */
             int32_t   fs_avgfpdir;    /* expected # of files per
directory */
             int32_t  fs_sparecon[27];/* reserved for future constants */
             time_t   fs_fscktime;    /* last time fsck(8)ed */
             int32_t  fs_contigsumsize; /* size of cluster summary array */
             int32_t  fs_maxsymlinklen; /* max length of internal
symlink */
             int32_t  fs_inodefmt;    /* format of on-disk inodes
*/
             u_int64_t  fs_maxfilesize;/*  maximum  representable
file size */
             int64_t  fs_qbmask;      /* ~fs_bmask - for use with
quad size */
             int64_t  fs_qfmask;      /* ~fs_fmask - for use with
quad size */
             int32_t   fs_state;       /* validate fs_clean field
*/
             int32_t   fs_postblformat;/*  format  of  positional
layout tables */
             int32_t  fs_nrpos;       /* number of rotational positions */
             int32_t  fs_postbloff;   /* (u_int16) rotation block
list head */
             int32_t  fs_rotbloff;    /* (u_int8) blocks for each
rotation */
             int32_t  fs_magic;       /* magic number */
             u_int8_t fs_space[1];    /* list of blocks for  each
rotation */
     /* actually longer */
     };

     Each  disk  drive  contains  some number of file systems.  A
file system consists
 of a number of cylinder groups.  Each  cylinder  group
has inodes and
     data.

     A file system is described by its super-block, which in turn
describes
     the cylinder groups.  The super-block is critical  data  and
is replicated
     in each cylinder group to protect against catastrophic loss.
This is
     done at file system creation time and  the  critical  superblock data does
     not change, so the copies need not be referenced further unless disaster
     strikes.

     Addresses stored in inodes are capable of  addressing  fragments of
     ``blocks''.  File system blocks of at most size MAXBSIZE can
be optionally
 broken into 2, 4, or 8 pieces, each of which is  addressable; these
     pieces  may  be  DEV_BSIZE,  or some multiple of a DEV_BSIZE
unit.

     Large files consist of exclusively large  data  blocks.   To
avoid undue
     wasted  disk  space,  the last data block of a small file is
allocated only
     as many fragments of a large block as  are  necessary.   The
file system
     format  retains  only  a  single pointer to such a fragment,
which is a piece
     of a single large block that has been divided.  The size  of
such a fragment
  is  determinable  from information in the inode, using
the blksize(fs,
     ip, lbn) macro.

     The file system records space availability at  the  fragment
level; to determine
  block availability, aligned fragments are examined.

     The root inode is the root of  the  file  system.   Inode  0
can't be used for
     normal  purposes  and historically bad blocks were linked to
inode 1 (inode
     1 is no longer used for this purpose; however, numerous dump
tapes make
     this  assumption,  so  we are stuck with it).  Thus the root
inode is 2.

     The fs_minfree element gives the minimum acceptable percentage of file
     system blocks that may be free.  If the freelist drops below
this level,
     only the superuser may continue  to  allocate  blocks.   The
fs_minfree element
  may be set to 0 if no reserve of free blocks is deemed
necessary,
     although severe performance degradations will be observed if
the file
     system  is  run  at  greater than 95% full; thus the default
value of
     fs_minfree is 5%.

     Empirically the best trade-off between  block  fragmentation
and overall
     disk utilization at a loading of 95% comes with a fragmentation of 8;
     thus the default fragment size is an  eighth  of  the  block
size.

     The  element  fs_optim  specifies  whether  the  file system
should try to minimize
 the time spent allocating blocks (FS_OPTTIME),  or  if
it should attempt
  to  minimize  the  space  fragmentation  on  the disk
(FS_OPTSPACE).  If
     the value of fs_minfree (see above) is less  than  5%,  then
the file system
     defaults  to  optimizing  for  space to avoid running out of
full sized
     blocks.  If the value of fs_minfree is greater than or equal
to 5%, fragmentation
 is unlikely to be problematical, and the file system defaults
     to optimizing for time.

     The fs_flags element specifies how the filesystem was mounted:

        FS_DOSOFTDEP   The  filesystem was mounted using soft dependencies.
        FS_UNCLEAN    The filesystem was mounted uncleanly.

   Cylinder group related limits    [Toc]    [Back]
     Each cylinder keeps track of the availability of  blocks  at
different rotational
  positions,  so  that sequential blocks can be laid
out with minimum
 rotational latency.  With the default of 1 distinct  rotational position,
  the resolution of the summary information is 16ms for
a typical
     3600 RPM drive.

     The element fs_rotdelay was once used to tweak block layout.

     Each  file  system  has a statically allocated number of inodes, determined
     by its size and the desired number of file  data  bytes  per
inode at the
     time it was created.  See newfs(8) for details on how to set
this (and
     other) filesystem parameters.  By default, the inode allocation strategy
     is extremely conservative.

     MINBSIZE is the smallest allowable block size.  With a MINBSIZE of 4096
     it is possible to create files of size 2^32  with  only  two
levels of indirection.
   MINBSIZE  must  be  big enough to hold a cylinder
group block,
     thus changes to struct cg must keep its  size  within  MINBSIZE.  Note that
     super-blocks are never more than size SBSIZE.

     The  path  name on which the file system is mounted is maintained in
     fs_fsmnt.  MAXMNTLEN defines the amount of  space  allocated
in the superblock
 for this name.

     Per cylinder group information is summarized in blocks allocated from the
     first cylinder group's data blocks.  These blocks  are  read
in from
     fs_csaddr  (of  size  fs_cssize)  in  addition to the superblock.

     Note that sizeof(struct csum) must be a power of two in  order for the
     fs_cs() macro to work.

   Super-block for a file system    [Toc]    [Back]
     The  size  of the rotational layout tables is limited by the
fact that the
     super-block is of size SBSIZE.  The size of these tables  is
inversely
     proportional to the block size of the file system.  The size
of the tables
 is increased when sector sizes are not powers  of  two,
as this increases
  the  number  of cylinders included before the rotational pattern
     repeats (fs_cpc).  The size of the rotational layout  tables
is derived
     from the number of bytes remaining in struct fs.

     The  number  of blocks of data per cylinder group is limited
because cylinder
 groups are at most one block.  The inode and free  block
tables must
     fit into a single block after deducting space for the cylinder group
     structure struct cg.

   Inodes    [Toc]    [Back]
     The inode is the focus of all file activity in the UNIX file
system.
     There is a unique inode allocated for each active file, each
current directory,
 each mounted-on file, text file, and the root.   An
inode is
     ``named'' by its device/i-number pair.  For further information, see the
     include file <ufs/ufs/inode.h>.

HISTORY    [Toc]    [Back]

     A super-block structure named filsys appeared in  Version  6
AT&T UNIX.
     The file system described in this manual appeared in 4.2BSD.

OpenBSD     3.6                          April      19,      1994
[ Back ]
 Similar pages
Name OS Title
fs_vxfs HP-UX format of a VxFS file system volume
inode Tru64 Specifies the format of the file system volume
fs Tru64 Specifies the format of the file system volume
vxresize HP-UX change the length of a volume containing a file system
vxvmboot HP-UX prepare VERITAS Volume Manager volume as a root, boot, primary swap or dump volume
mh-format Tru64 Format file for the MH message system
satd IRIX system auditing file format.
inode IRIX format of an Extent File System inode
pf.os OpenBSD format of the operating system fingerprints file
inode_vxfs HP-UX format of a VxFS file system inode
Copyright © 2004-2005 DeniX Solutions SRL
newsletter delivery service