X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/d0064d3ada3aa06af09a31af7462910731cc5346..af0b24db6f271ffe7dc8309e12da45fc4bcfb53e:/usr/src/sys/ufs/ffs/dinode.h diff --git a/usr/src/sys/ufs/ffs/dinode.h b/usr/src/sys/ufs/ffs/dinode.h index e3cfc6ddaf..de9b8536c9 100644 --- a/usr/src/sys/ufs/ffs/dinode.h +++ b/usr/src/sys/ufs/ffs/dinode.h @@ -1,90 +1,156 @@ -/* dinode.h 3.1 %H% */ +/* dinode.h 4.20 82/11/13 */ /* - * The I node is the focus of all - * file activity in unix. 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 dev/inumber pair. (iget/iget.c) - * Data, from mode on, is read in - * from permanent inode on volume. + * The I node is the focus of all file activity in UNIX. + * 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 dev/inumber pair. (iget/iget.c) + * Data in icommon is read in from permanent inode on volume. */ -#define NADDR 13 - -#define NINDEX 15 -struct group -{ - short g_state; - char g_index; - char g_rot; - struct group *g_group; - struct inode *g_inode; - struct file *g_file; - short g_rotmask; - short g_datq; - struct chan *g_chans[NINDEX]; -}; -struct inode -{ - char i_flag; - char i_count; /* reference count */ +#define NDADDR 12 /* direct addresses in inode */ +#define NIADDR 3 /* indirect addresses in inode */ + +struct inode { + struct inode *i_chain[2]; /* must be first */ + u_short i_flag; + u_short i_count; /* reference count */ dev_t i_dev; /* device where inode resides */ + u_short i_shlockc; /* count of shared locks on inode */ + u_short i_exlockc; /* count of exclusive locks on inode */ ino_t i_number; /* i number, 1-to-1 with device address */ - unsigned short i_mode; - short i_nlink; /* directory entries */ - short i_uid; /* owner */ - short i_gid; /* group of owner */ - off_t i_size; /* size of file */ + struct fs *i_fs; /* file sys associated with this inode */ + struct dquot *i_dquot; /* quota structure controlling this file */ union { - struct { - daddr_t i_addr[NADDR]; /* if normal file/directory */ - daddr_t i_lastr; /* last logical block read (for read-ahead) */ - }; - struct { - daddr_t i_rdev; /* i_addr[0] */ - struct group i_group; /* multiplexor group file */ - }; + daddr_t if_lastr; /* last read (read-ahead) */ + struct socket *is_socket; + struct { + struct inode *if_freef; /* free list forward */ + struct inode **if_freeb; /* free list back */ + } i_fr; } i_un; - short i_vfdcnt; /* number of fd's vreading this inode */ - short i_hlink; /* link in hash chain (iget/iput/ifind) */ + struct icommon + { + u_short ic_mode; /* 0: mode and type of file */ + short ic_nlink; /* 2: number of links to file */ + short ic_uid; /* 4: owner's user id */ + short ic_gid; /* 6: owner's group id */ + quad ic_size; /* 8: number of bytes in file */ + time_t ic_atime; /* 16: time last accessed */ + long ic_atspare; + time_t ic_mtime; /* 24: time last modified */ + long ic_mtspare; + time_t ic_ctime; /* 32: time created */ + long ic_ctspare; + daddr_t ic_db[NDADDR]; /* 40: disk block addresses */ + daddr_t ic_ib[NIADDR]; /* 88: indirect blocks */ + long ic_flags; /* 100: status, currently unused */ + long ic_spare[6]; /* 104: reserved, currently unused */ + } i_ic; +}; + +struct dinode { + union { + struct icommon di_icom; + char di_size[128]; + } di_un; }; +#define i_mode i_ic.ic_mode +#define i_nlink i_ic.ic_nlink +#define i_uid i_ic.ic_uid +#define i_gid i_ic.ic_gid +#define i_size i_ic.ic_size.val[0] +#define i_db i_ic.ic_db +#define i_ib i_ic.ic_ib +#define i_atime i_ic.ic_atime +#define i_mtime i_ic.ic_mtime +#define i_ctime i_ic.ic_ctime +#define i_rdev i_ic.ic_db[0] +#define i_lastr i_un.if_lastr +#define i_socket i_un.is_socket +#define i_forw i_chain[0] +#define i_back i_chain[1] +#define i_freef i_un.i_fr.if_freef +#define i_freeb i_un.i_fr.if_freeb + +#define di_ic di_un.di_icom +#define di_mode di_ic.ic_mode +#define di_nlink di_ic.ic_nlink +#define di_uid di_ic.ic_uid +#define di_gid di_ic.ic_gid +#define di_size di_ic.ic_size.val[0] +#define di_db di_ic.ic_db +#define di_ib di_ic.ic_ib +#define di_atime di_ic.ic_atime +#define di_mtime di_ic.ic_mtime +#define di_ctime di_ic.ic_ctime +#define di_rdev di_ic.ic_db[0] + #ifdef KERNEL -extern struct inode inode[]; /* The inode table itself */ +struct inode *inode; /* the inode table itself */ +struct inode *inodeNINODE; /* the end of the inode table */ +int ninode; /* number of slots in the table */ -struct inode *rootdir; /* pointer to inode of root directory */ -struct inode *mpxip; /* mpx virtual inode */ +struct inode *rootdir; /* pointer to inode of root directory */ struct inode *ialloc(); -struct inode *ifind(); struct inode *iget(); +#ifdef notdef +struct inode *ifind(); +#endif struct inode *owner(); struct inode *maknode(); struct inode *namei(); + +ino_t dirpref(); #endif /* flags */ -#define ILOCK 01 /* inode is locked */ -#define IUPD 02 /* file has been modified */ -#define IACC 04 /* inode access time to be updated */ -#define IMOUNT 010 /* inode is mounted on */ -#define IWANT 020 /* some process waiting on lock */ -#define ITEXT 040 /* inode is pure text prototype */ -#define ICHG 0100 /* inode has been changed */ +#define ILOCKED 0x1 /* inode is locked */ +#define IUPD 0x2 /* file has been modified */ +#define IACC 0x4 /* inode access time to be updated */ +#define IMOUNT 0x8 /* inode is mounted on */ +#define IWANT 0x10 /* some process waiting on lock */ +#define ITEXT 0x20 /* inode is pure text prototype */ +#define ICHG 0x40 /* inode has been changed */ +#define ISHLOCK 0x80 /* file has shared lock */ +#define IEXLOCK 0x100 /* file has exclusive lock */ +#define ILWAIT 0x200 /* someone waiting on file lock */ /* modes */ -#define IFMT 0170000 /* type of file */ -#define IFDIR 0040000 /* directory */ -#define IFCHR 0020000 /* character special */ -#define IFBLK 0060000 /* block special */ -#define IFREG 0100000 /* regular */ -#define IFMPC 0030000 /* multiplexed char special */ -#define IFMPB 0070000 /* multiplexed block special */ -#define ISUID 04000 /* set user id on execution */ -#define ISGID 02000 /* set group id on execution */ -#define ISVTX 01000 /* save swapped text even after use */ -#define IREAD 0400 /* read, write, execute permissions */ -#define IWRITE 0200 -#define IEXEC 0100 +#define IFMT 0170000 /* type of file */ +#define IFCHR 0020000 /* character special */ +#define IFDIR 0040000 /* directory */ +#define IFBLK 0060000 /* block special */ +#define IFREG 0100000 /* regular */ +#define IFLNK 0120000 /* symbolic link */ +#define IFSOCK 0140000 /* socket */ + +#define ISUID 04000 /* set user id on execution */ +#define ISGID 02000 /* set group id on execution */ +#define ISVTX 01000 /* save swapped text even after use */ +#define IREAD 0400 /* read, write, execute permissions */ +#define IWRITE 0200 +#define IEXEC 0100 + +#define ILOCK(ip) { \ + while ((ip)->i_flag & ILOCKED) { \ + (ip)->i_flag |= IWANT; \ + sleep((caddr_t)(ip), PINOD); \ + } \ + (ip)->i_flag |= ILOCKED; \ +} + +#define IUNLOCK(ip) { \ + (ip)->i_flag &= ~ILOCKED; \ + if ((ip)->i_flag&IWANT) { \ + (ip)->i_flag &= ~IWANT; \ + wakeup((caddr_t)(ip)); \ + } \ +} + +#define IUPDAT(ip, t1, t2, waitfor) { \ + if (ip->i_flag&(IUPD|IACC|ICHG)) \ + iupdat(ip, t1, t2, waitfor); \ +}