Annotation of researchv10dc/lsys/sys/inode.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * The I node is the focus of all
                      3:  * file activity in unix. There is a unique
                      4:  * inode allocated for each active file,
                      5:  * each current directory, each mounted-on
                      6:  * file, text file, and the root. An inode is 'named'
                      7:  * by its dev/inumber pair. (iget/iget.c)
                      8:  * Data, from mode on, is read in
                      9:  * from permanent inode on volume.
                     10:  */
                     11: 
                     12: #define        NADDR   13
                     13: 
                     14: struct inode
                     15: {
                     16:        short   i_flag;
                     17:        dev_t   i_dev;          /* device where inode resides */
                     18:        char    i_fstyp;        /* type of its filesystem */
                     19:        unsigned short i_count; /* reference count */
                     20:        long    i_number;       /* i number, 1-to-1 with device address */
                     21:        unsigned short i_mode;
                     22:        short   i_nlink;        /* directory entries */
                     23:        short   i_uid;          /* owner */
                     24:        short   i_gid;          /* group of owner */
                     25:        off_t   i_size;         /* size of file */
                     26:        struct  inode *i_mroot; /* if mount point, root inode */
                     27:        struct  inode *i_mpoint;        /* inode of mount point */
                     28:        struct  stdata *i_sptr; /* stream associated with this inode */
                     29:        union {
                     30:                struct {
                     31:                        daddr_t I_addr[NADDR];  /* if normal file/directory */
                     32:                        daddr_t I_lastr;        /* last read (for read-ahead) */
                     33:                        struct buf *I_bufp;     /* buffer for super-block */
                     34:                } i_f;
                     35: #define        i_addr  i_f.I_addr
                     36: #define        i_lastr i_f.I_lastr
                     37: #define        i_bufp  i_f.I_bufp
                     38:                struct {
                     39:                        daddr_t I_rdev;         /* i_addr[0] */
                     40:                } i_d;
                     41: #define        i_rdev  i_d.I_rdev
                     42:                struct {
                     43:                        long I_tag;
                     44:                        struct inode *I_cip;    /* communications */
                     45:                        int I_fsflags;          /* in root inode only */
                     46:                        time_t I_atime;
                     47:                        time_t I_mtime;
                     48:                        time_t I_ctime;
                     49:                        dev_t I_rdev;
                     50:                } i_a;          /* network filesystems et al */
                     51: #define i_tag  i_a.I_tag
                     52: #define i_cip  i_a.I_cip
                     53: #define        i_fsflags       i_a.I_fsflags
                     54: #define        i_netatime      i_a.I_atime
                     55: #define        i_netmtime      i_a.I_mtime
                     56: #define        i_netctime      i_a.I_ctime
                     57: #define        i_netrdev       i_a.I_rdev
                     58:                struct {
                     59:                        struct proc *I_proc;    /* sanity checking */
                     60:                        int         I_sigmask;  /* signal trace mask */
                     61:                } i_p;
                     62: #define i_proc i_p.I_proc
                     63: #define i_sigmask      i_p.I_sigmask
                     64:        } i_un;
                     65:        struct inode *i_hlink;  /* link in hash chain (iget/iput/ifind) */
                     66: };
                     67: 
                     68: #ifdef KERNEL
                     69: extern struct inode inode[];
                     70: extern struct inode *inodeNINODE;
                     71: extern int inodecnt;
                     72: 
                     73: struct inode *rootdir;         /* pointer to inode of root directory */
                     74: 
                     75: struct inode *ialloc();
                     76: struct inode *ifind();
                     77: struct inode *iget();
                     78: struct inode *iuniq();
                     79: struct inode *namei();
                     80: struct inode *openi();
                     81: #endif
                     82: 
                     83: /* flags */
                     84: #define        ILOCK   01              /* inode is locked */
                     85: #define        IUPD    02              /* file has been modified */
                     86: #define        IACC    04              /* inode access time to be updated */
                     87: #define        IWANT   020             /* some process waiting on lock */
                     88: #define        ITEXT   040             /* inode is pure text prototype */
                     89: #define        ICHG    0100            /* inode has been changed */
                     90: #define        IOPEN   0200            /* has been opened; close on last iput */
                     91: 
                     92: /* modes */
                     93: #define        IFMT    0170000         /* type of file */
                     94: #define                IFDIR   0040000 /* directory */
                     95: #define                IFCHR   0020000 /* character special */
                     96: #define                IFBLK   0060000 /* block special */
                     97: #define                IFREG   0100000 /* regular */
                     98: #define                IFLNK   0120000 /* symbolic link to another file */
                     99: #define        ISUID   04000           /* set user id on execution */
                    100: #define        ISGID   02000           /* set group id on execution */
                    101: #define        IREAD   0400            /* read, write, execute permissions */
                    102: #define        IWRITE  0200
                    103: #define        IEXEC   0100
                    104: #define        ICONC   0001000         /* this file is protected for concurrent access */
                    105: #define        ICCTYP  0007000         /* type of concurrent access */
                    106: #define                ISYNC   0001000 /* 1 writer and n readers (synchronized access) */
                    107: #define                IEXCL   0003000 /* 1 writer or n readers (exclusive access) */
                    108: 
                    109: struct argnamei {      /* namei's flag argument */
                    110:        short flag;     /* type of request */
                    111:        short len;      /* length of last component buffer */
                    112:        union {
                    113:                short   mode;           /* mode for creating */
                    114:                struct inode *il;       /* for linking */
                    115:                caddr_t buf;            /* where to copy last component for exec */
                    116:        } un;
                    117: };
                    118: #define NI_SEARCH 0    /* search only (0 value known to nilargnamei, beware) */
                    119: #define NI_DEL 1       /* unlink this file */
                    120: #define NI_CREAT 2     /* create it if it doesn't exits */
                    121: #define NI_NXCREAT 3   /* create it, error if it already exists */
                    122: #define NI_LINK        4       /* make a link */
                    123: #define NI_MKDIR 5     /* make a directory */
                    124: #define NI_RMDIR 6     /* remove a directory */
                    125: 
                    126: #ifdef KERNEL
                    127: extern struct argnamei nilargnamei;
                    128: #endif
                    129: struct nx {    /* arg to real nami */
                    130:        struct inode *dp;       /* current inode */
                    131:        char *cp;               /* current position in pathname */
                    132:        char *nbuf;             /* pathname being parsed */
                    133:        short nlen;             /* length of pathname buffer */
                    134:        short nlink;            /* symlinks seen so far */
                    135: };
                    136: 
                    137: /*
                    138:  * some inline subroutines to speed things up
                    139:  */
                    140: 
                    141: #ifdef KERNEL
                    142: 
                    143: #define        plock(ip) \
                    144: { \
                    145:        while ((ip)->i_flag & ILOCK) { \
                    146:                (ip)->i_flag |= IWANT; \
                    147:                sleep((caddr_t)(ip), PINOD); \
                    148:        } \
                    149:        (ip)->i_flag |= ILOCK; \
                    150: }
                    151: 
                    152: #define        prele(ip) \
                    153: { \
                    154:        (ip)->i_flag &= ~ILOCK; \
                    155:        if ((ip)->i_flag&IWANT) { \
                    156:                (ip)->i_flag &= ~IWANT; \
                    157:                wakeup((caddr_t)(ip)); \
                    158:        } \
                    159: }
                    160: 
                    161: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.