/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos72Q src/bos/usr/include/IN/FSio.h 1.11.1.1                          */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 1988,2019              */
/* All Rights Reserved                                                    */
/*                                                                        */
/* US Government Users Restricted Rights - Use, duplication or            */
/* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.      */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
/* @(#)17	1.11.1.1  src/bos/usr/include/IN/FSio.h, libIN, bos72Q, q2019_13A4 2/4/19 06:28:39 */
/*
 * COMPONENT_NAME: LIBIN
 *
 * FUNCTIONS:
 *
 * ORIGINS: 9,27
 *
 * (C) COPYRIGHT International Business Machines Corp. 1988, 1989
 * All Rights Reserved
 * Licensed Materials - Property of IBM
 *
 * US Government Users Restricted Rights - Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 *
 */

/*
 *      This file contains definitions and declarations associated with
 *      file system level I/O operations.  File system utilities such as mkfs
 *      and fsck use the file system I/O routines to access file systems
 *      without the aid of the kernel.
 */

#ifndef _H_FSIO
#define _H_FSIO

#ifndef NADDR
#include <sys/inode.h>
#endif

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
struct FSmtab;
struct filsys;
#endif

/*
 *  FS_INODE structure
 *      The FS_INODE structure is FSio's version of the kernel's in-core
 *      i-node.  The FSi2mem()/FSmem2i() routines can be used to convert
 *      disk i-nodes to this format (and vice versa)
 */

typedef struct FSinode              /* Format of a FS_INODE struct ...  */
{
	short      mi_maj;          /* ... file sys major device number */
	ushort     mi_min;          /* ... file sys minor device number */
	ino_t      mi_number;       /* ... i-node number                */
	ushort     mi_flag;         /* ... i-node status flags          */
	short      mi_count;        /* ... open/reference count         */

	ushort     mi_mode;         /* ... file mode flags              */
	short      mi_nlink;        /* ... file's link count            */
	ushort     mi_uid;          /* ... owner's user ID              */
	ushort     mi_gid;          /* ... owner's group ID             */
	off_t      mi_size;         /* ... file size                    */

	union                       /* ... Address overlay area         */
	{  ushort  mi_odev[2];      /* ... ... Major/minor device nums  */
	   daddr_t mi_oadd[NADDR];  /* ... ... Disk addresses           */
	}          mi_ovly;
}  FS_INODE;

#define mi_rmaj  mi_ovly.mi_odev[0] /* Major device number!             */
#define mi_rmin  mi_ovly.mi_odev[1] /* Minor device number!             */
#define mi_dadd  mi_ovly.mi_oadd    /* Disk address!                    */


/*
 *  FS_FILE structure
 *      The FS_FILE structure is FSio's equivalent of the FILE structure
 *      used by the standard I/O package.  The FSopen routine returns
 *      a pointer to such a structure, and all of the other file system
 *      I/O routines want to see an FS_FILE address as their first parameter.
 */

typedef struct FSfile   /* Format of an FS_FILE structure               */
{
    struct FSfile  *FSF_next;   /* ... Next open FS_FILE struct         */
    struct FSfile  *FSF_prev;   /* ... Previous open FS_FILE struct     */
    struct FSmtab  *FSF_mtp;    /* ... Ptr to mount structure           */
    time_t          FSF_atime;  /* ... Time of last access              */
    time_t          FSF_mtime;  /* ... Time of last modification        */
    time_t          FSF_ctime;  /* ... Time of last I-node update       */
    FS_INODE        FSF_inode;  /* ... In-core I-node                   */
} FS_FILE;

#define FS_FMAX 8       /* Max concurrently open FS_FILE structs        */

#ifndef ITIMES          /* Update times from FSF_FILE struct            */
#define ITIMES  IMOUNT
#endif
#ifndef IRONLY          /* Read-only file                               */
#define IRONLY  ITEXT
#endif

/*
 *  File system mount structure
 *      Structures of the following type are passed to FSmount.  These
 *      structures define the currently active file systems on which
 *      pseudo-files can be processed.
 */

typedef struct FSmtab
{   struct FSmtab    *FSM_next;     /* Ptr to next active entry         */
	   int      (*FSM_biop)();  /* Ptr to block I/O routine         */
	   daddr_t  (*FSM_allo)();  /* Ptr to 2ndary allocation routine */
	   char      *FSM_user;     /* Available to user pgms           */
	   int        FSM_ocnt;     /* Number of open files             */
	   int        FSM_flag;     /* Flag word (see below)            */

    union                           /* Superblock buffer ...            */
    {   char   FSMuchr[BSIZE];      /* ... Fill out to a full block     */
	struct filsys FSMustr;
    }                 FSM_u;
} FSmnt_t;

#define FSM_sblk FSM_u.FSMustr      /* #define away the union           */

/*
 *      Bit definitions for flag word ...
 */

#define FM_FDIRTY 1                 /* Superblock dirty when set        */
#define FM_FRONLY 2                 /* Mounted read-only if set         */

/*
 *  Buffer Cache Entries:
 *      The following structure maps the pseudo-file buffer cache entries
 *      that control internal buffers used to hold file indirect blocks.
 */

typedef struct FSbufr               /*  Format of a cache buffer ...    */
{   struct FSbufr  *FSB_next;       /*  ... next buffer on LRU chain    */
    struct FSbufr  *FSB_prev;       /*  ... prev buffer on LRU chain    */
    struct FSmtab  *FSB_mtp;        /*  ... ptr to FSmnt_t  structure   */
    daddr_t         FSB_bnum;       /*  ... block number                */
    int             FSB_flag;       /*  ... Header flags                */
    char            FSB_buff[BSIZE];/*  ... the buffer proper           */
} FS_BUFF;

/*
 *  Definition of flag bits:
 */

#define FB_FDIRTY 1     /*  Buffer is dirty                             */
#define FS_BMAX  4      /*  Number of buffers in the cache (initial)    */

#define _FSbput(bhp) ((bhp)->FSB_flag |= FB_FDIRTY)

/*
 *  Routine declarations
 *      The following routines make up the file system I/O package
 */

extern FS_FILE *FSopen();       /* Pseudo-file open routine             */
extern daddr_t  FSbmap();       /* Pseudo-file block mapping function   */
extern daddr_t  FSnxtblk();     /* Get next block in file system        */
extern daddr_t  FSalloc();      /* Free block allocater                 */
extern int      FSfree();       /* Free block deallocater               */
extern int      FSmapb();       /* Build pseudo-file block map          */
extern int      FSread();       /* Pseudo-file read routine             */
extern int      FSwrite();      /* Pseudo-file write routine            */
extern int      FSclose();      /* Pseudo-file close routine            */
extern int      FSmount();      /* Mounts file systems                  */
extern int      FSumount();     /* Unmounts them                        */
extern void     FSi2mem();      /* Disk i-node load routine             */
extern void     FSmem2i();      /* Disk i-node store routine            */
extern void     FSbuff();       /* Adds buffers to cache                */

/*
 *  FSclose() disposition codes
 *      These codes are used to specify how FSclose() should dispose
 *      of a given pseudo-file and the associated I-node.  The first three
 *      definitions are used internally by FSclose().  The following 4
 *      definitions are used by the calling progams.
 */

#define FSC_NOFR 1      /* Don't fragment file if set                   */
#define FSC_TRNC 2      /* Truncate file if set                         */
#define FSC_DELT 4      /* Deallocate I-node if set                     */

#define FS_CSAVE 0                      /* ... Save I-node and file     */
#define FS_CNOFR FSC_NOFR               /* ... Save but don't fragment  */
#define FS_CTRNC FSC_TRNC               /* ... Truncate but save file   */
#define FS_CDELT FSC_TRNC+FSC_DELT      /* ... Delete file              */

/*
 *  Block I/O op codes
 *      These op-code definitions are used by the block I/O subroutines
 *      that are used to perform the actual I/O.  The user provides the
 *      address of the block I/O routine when he/she calls FSopen().
 */

#define FS_BREAD 0      /* Block I/O read operation                     */
#define FS_BWRIT 1      /* Block I/O write operation                    */

/*
 *  _FSsync() operation codes
 *      These op-codes specify the operations to be performed by the
 *      _FSsync() routine:
 */

#define FS_SUPDT  1     /* Update buffers and superblocks               */
#define FS_SREFR  2     /* Refresh buffers and superblocks              */

/*
 *  Miscellaneous macro definitions
 *      These macros differ depending on superblock format
 */

#define IORG ((daddr_t)2)       /* I-node area origin                   */

#ifdef  _s_NEWF         /* New format superblocks ...                   */
#define SBtype(sbp)     (sbp)->s_type
#define SBbsize(sbp)    (sbp)->s_bsize
#define SBcpu(sbp)      (sbp)->s_cpu
#define SBibase(sbp)    (sbp)->s_ibase
#define NICfree(sbp)    (sbp)->s_nicfree
#define NICinod(sbp)    (sbp)->s_nicino

#else                   /* Old format superblocks ...                   */
#if BSIZE == 512
#define SBtype(sbp)     Fs1b
#endif
#if BSIZE == 1024
#define SBtype(sbp)     Fs2b
#endif
#if BSIZE == 2048
#define SBtype(sbp)     Fs4b
#endif
#if BSIZE == 4096
#define SBtype(sbp)     Fs8b
#endif

#define SBbsize(sbp)    BSIZE
#define SBcpu(sbp)      0
#define SBibase(sbp)    ((daddr_t)0)
#define NICfree(sbp)    NICFREE
#define NICinod(sbp)    NICINOD
#define FREEblk(sbp,n)  (sbp)->s_free[n]
#define FREEino(sbp,n)  (sbp)->s_inode[n]
#define s_cyl           s_n
#define s_skip          s_m
#endif

#ifndef _s_ALGN         /* Disk I/O does not require alignment          */
#define FSbio(mtp,op,buf,blk) (*((mtp)->FSM_biop))(mtp,op,buf,blk)
#endif

extern  int     FSxsblk();      /* Re-formats superblocks               */

#ifdef  _s_XCPU         /* Multi-cpu file system support ...            */
extern  void    FSxdblk();      /* Re-formats directory blocks          */
extern  void    FSxfblk();      /* Re-formats free list blocks          */
extern  void    FSxiblk();      /* Re-formats indirect blocks           */
extern  void    FSxnode();      /* Re-formats disk i-nodes              */
extern  void    FSxgblk();      /* Re-formats fragmented data blocks    */
extern  void    FSl3tol();      /* Converts 3-byte ints to 4-byte ints  */
extern  void    FSltol3();      /* Converts 4-byte ints to 3-byte ints  */
extern  short   _XXshort();     /* Swaps bytes in 16-bit integers       */
extern  long    _XXlong();      /* Swaps bytes in 32-bit integers       */

#define swapS(x,sbp) _XXshort(x,(sbp)->s_cpu)
#define swapL(x,sbp) _XXlong(x,(sbp)->s_cpu)

#else                   /* No multi-cpu support ...                     */
#define FSxdblk(buf,sbp,flag)
#define FSxfblk(buf,sbp,flag)
#define FSxiblk(buf,sbp,flag)
#define FSxnode(buf,sbp,flag)
#define FSxgblk(buf,sbp,flag)

#define FSl3tol(lp,cp,n,cpu)  l3tol(lp,cp,n)
#define FSltol3(cp,lp,n,cpu)  ltol3(cp,lp,n)
#define swapS(x,sbp)          ((short)(x))
#define swapL(x,sbp)          ((long)(x))
#endif

#ifdef  _s_FRAG         /* Number of entries in arry depends on _s_FRAG */
#define FS_NPCTS   3    /* ... use all 3 if fragment support enabled    */
#else
#define FS_NPCTS   2    /* ... don't set FTPCT if no frag support       */
#endif

#ifdef __cplusplus
}
#endif

#endif /* FSIO */
