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

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

unix.superglobalmegacorp.com

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