Annotation of linux/fs/inode.c, revision 1.1.1.5

1.1.1.2   root        1: /*
                      2:  *  linux/fs/inode.c
                      3:  *
                      4:  *  (C) 1991  Linus Torvalds
                      5:  */
                      6: 
1.1       root        7: #include <string.h>
1.1.1.2   root        8: #include <sys/stat.h>
1.1       root        9: 
                     10: #include <linux/sched.h>
1.1.1.5 ! root       11: #include <linux/minix_fs.h>
1.1       root       12: #include <linux/kernel.h>
                     13: #include <linux/mm.h>
                     14: #include <asm/system.h>
                     15: 
1.1.1.5 ! root       16: struct inode inode_table[NR_INODE]={{0,},};
1.1.1.4   root       17: 
1.1.1.5 ! root       18: extern void minix_read_inode(struct inode * inode);
        !            19: extern void minix_write_inode(struct inode * inode);
1.1       root       20: 
1.1.1.5 ! root       21: static inline void wait_on_inode(struct inode * inode)
1.1       root       22: {
                     23:        cli();
                     24:        while (inode->i_lock)
                     25:                sleep_on(&inode->i_wait);
                     26:        sti();
                     27: }
                     28: 
1.1.1.5 ! root       29: static inline void lock_inode(struct inode * inode)
1.1       root       30: {
                     31:        cli();
                     32:        while (inode->i_lock)
                     33:                sleep_on(&inode->i_wait);
                     34:        inode->i_lock=1;
                     35:        sti();
                     36: }
                     37: 
1.1.1.5 ! root       38: static inline void unlock_inode(struct inode * inode)
1.1       root       39: {
                     40:        inode->i_lock=0;
                     41:        wake_up(&inode->i_wait);
                     42: }
                     43: 
1.1.1.5 ! root       44: static void write_inode(struct inode * inode)
        !            45: {
        !            46:        lock_inode(inode);
        !            47:        if (!inode->i_dirt || !inode->i_dev) {
        !            48:                unlock_inode(inode);
        !            49:                return;
        !            50:        }
        !            51:        minix_write_inode(inode);
        !            52:        unlock_inode(inode);
        !            53: }
        !            54: 
        !            55: static void read_inode(struct inode * inode)
        !            56: {
        !            57:        lock_inode(inode);
        !            58:        minix_read_inode(inode);
        !            59:        unlock_inode(inode);
        !            60: }
        !            61: 
        !            62: int bmap(struct inode * inode, int block)
        !            63: {
        !            64:        return minix_bmap(inode,block);
        !            65: }
        !            66: 
1.1.1.3   root       67: void invalidate_inodes(int dev)
                     68: {
                     69:        int i;
1.1.1.5 ! root       70:        struct inode * inode;
1.1.1.3   root       71: 
                     72:        inode = 0+inode_table;
                     73:        for(i=0 ; i<NR_INODE ; i++,inode++) {
                     74:                wait_on_inode(inode);
                     75:                if (inode->i_dev == dev) {
                     76:                        if (inode->i_count)
                     77:                                printk("inode in use on removed disk\n\r");
                     78:                        inode->i_dev = inode->i_dirt = 0;
                     79:                }
                     80:        }
                     81: }
                     82: 
1.1       root       83: void sync_inodes(void)
                     84: {
                     85:        int i;
1.1.1.5 ! root       86:        struct inode * inode;
1.1       root       87: 
                     88:        inode = 0+inode_table;
                     89:        for(i=0 ; i<NR_INODE ; i++,inode++) {
                     90:                wait_on_inode(inode);
                     91:                if (inode->i_dirt && !inode->i_pipe)
                     92:                        write_inode(inode);
                     93:        }
                     94: }
                     95: 
1.1.1.5 ! root       96: void iput(struct inode * inode)
1.1       root       97: {
                     98:        if (!inode)
                     99:                return;
                    100:        wait_on_inode(inode);
                    101:        if (!inode->i_count)
                    102:                panic("iput: trying to free free inode");
                    103:        if (inode->i_pipe) {
                    104:                wake_up(&inode->i_wait);
1.1.1.4   root      105:                wake_up(&inode->i_wait2);
1.1       root      106:                if (--inode->i_count)
                    107:                        return;
                    108:                free_page(inode->i_size);
                    109:                inode->i_count=0;
                    110:                inode->i_dirt=0;
                    111:                inode->i_pipe=0;
                    112:                return;
                    113:        }
1.1.1.3   root      114:        if (!inode->i_dev) {
1.1       root      115:                inode->i_count--;
                    116:                return;
                    117:        }
1.1.1.2   root      118:        if (S_ISBLK(inode->i_mode)) {
1.1.1.5 ! root      119:                sync_dev(inode->i_rdev);
1.1.1.2   root      120:                wait_on_inode(inode);
                    121:        }
1.1.1.3   root      122: repeat:
                    123:        if (inode->i_count>1) {
                    124:                inode->i_count--;
                    125:                return;
                    126:        }
1.1.1.5 ! root      127:        if (!inode->i_nlink) {
        !           128:                minix_truncate(inode);
        !           129:                minix_free_inode(inode);
1.1       root      130:                return;
                    131:        }
                    132:        if (inode->i_dirt) {
                    133:                write_inode(inode);     /* we can sleep - so do again */
                    134:                wait_on_inode(inode);
                    135:                goto repeat;
                    136:        }
                    137:        inode->i_count--;
                    138:        return;
                    139: }
                    140: 
1.1.1.5 ! root      141: struct inode * get_empty_inode(void)
1.1       root      142: {
1.1.1.5 ! root      143:        struct inode * inode;
        !           144:        static struct inode * last_inode = inode_table;
1.1.1.3   root      145:        int i;
1.1       root      146: 
1.1.1.3   root      147:        do {
1.1       root      148:                inode = NULL;
1.1.1.3   root      149:                for (i = NR_INODE; i ; i--) {
                    150:                        if (++last_inode >= inode_table + NR_INODE)
                    151:                                last_inode = inode_table;
                    152:                        if (!last_inode->i_count) {
                    153:                                inode = last_inode;
                    154:                                if (!inode->i_dirt && !inode->i_lock)
                    155:                                        break;
1.1       root      156:                        }
1.1.1.3   root      157:                }
1.1       root      158:                if (!inode) {
1.1.1.3   root      159:                        for (i=0 ; i<NR_INODE ; i++)
1.1.1.5 ! root      160:                                printk("(%04x: %d (%o)) ",inode_table[i].i_dev,
        !           161:                                        inode_table[i].i_ino,inode_table[i].i_mode);
1.1       root      162:                        panic("No free inodes in mem");
                    163:                }
                    164:                wait_on_inode(inode);
                    165:                while (inode->i_dirt) {
                    166:                        write_inode(inode);
                    167:                        wait_on_inode(inode);
                    168:                }
1.1.1.3   root      169:        } while (inode->i_count);
1.1       root      170:        memset(inode,0,sizeof(*inode));
                    171:        inode->i_count = 1;
                    172:        return inode;
                    173: }
                    174: 
1.1.1.5 ! root      175: struct inode * get_pipe_inode(void)
1.1       root      176: {
1.1.1.5 ! root      177:        struct inode * inode;
1.1       root      178: 
                    179:        if (!(inode = get_empty_inode()))
                    180:                return NULL;
                    181:        if (!(inode->i_size=get_free_page())) {
                    182:                inode->i_count = 0;
                    183:                return NULL;
                    184:        }
                    185:        inode->i_count = 2;     /* sum of readers/writers */
                    186:        PIPE_HEAD(*inode) = PIPE_TAIL(*inode) = 0;
                    187:        inode->i_pipe = 1;
                    188:        return inode;
                    189: }
                    190: 
1.1.1.5 ! root      191: struct inode * iget(int dev,int nr)
1.1       root      192: {
1.1.1.5 ! root      193:        struct inode * inode, * empty;
1.1       root      194: 
                    195:        if (!dev)
                    196:                panic("iget with dev==0");
                    197:        empty = get_empty_inode();
                    198:        inode = inode_table;
                    199:        while (inode < NR_INODE+inode_table) {
1.1.1.5 ! root      200:                if (inode->i_dev != dev || inode->i_ino != nr) {
1.1       root      201:                        inode++;
                    202:                        continue;
                    203:                }
                    204:                wait_on_inode(inode);
1.1.1.5 ! root      205:                if (inode->i_dev != dev || inode->i_ino != nr) {
1.1       root      206:                        inode = inode_table;
                    207:                        continue;
                    208:                }
                    209:                inode->i_count++;
1.1.1.2   root      210:                if (inode->i_mount) {
                    211:                        int i;
                    212: 
                    213:                        for (i = 0 ; i<NR_SUPER ; i++)
1.1.1.5 ! root      214:                                if (super_block[i].s_covered==inode)
1.1.1.2   root      215:                                        break;
                    216:                        if (i >= NR_SUPER) {
                    217:                                printk("Mounted inode hasn't got sb\n");
                    218:                                if (empty)
                    219:                                        iput(empty);
                    220:                                return inode;
                    221:                        }
                    222:                        iput(inode);
1.1.1.5 ! root      223:                        if (!(inode = super_block[i].s_mounted))
        !           224:                                printk("iget: mounted dev has no rootinode\n");
        !           225:                        else {
        !           226:                                inode->i_count++;
        !           227:                                wait_on_inode(inode);
        !           228:                        }
1.1.1.2   root      229:                }
1.1       root      230:                if (empty)
                    231:                        iput(empty);
                    232:                return inode;
                    233:        }
                    234:        if (!empty)
                    235:                return (NULL);
1.1.1.5 ! root      236:        inode = empty;
        !           237:        if (!(inode->i_sb = get_super(dev))) {
        !           238:                printk("iget: gouldn't get super-block\n\t");
        !           239:                iput(inode);
        !           240:                return NULL;
        !           241:        }
1.1       root      242:        inode->i_dev = dev;
1.1.1.5 ! root      243:        inode->i_ino = nr;
1.1       root      244:        read_inode(inode);
                    245:        return inode;
                    246: }

unix.superglobalmegacorp.com

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