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

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.4 ! root       15: extern int *blk_size[];
        !            16: 
1.1       root       17: struct m_inode inode_table[NR_INODE]={{0,},};
                     18: 
                     19: static void read_inode(struct m_inode * inode);
                     20: static void write_inode(struct m_inode * inode);
                     21: 
                     22: static inline void wait_on_inode(struct m_inode * inode)
                     23: {
                     24:        cli();
                     25:        while (inode->i_lock)
                     26:                sleep_on(&inode->i_wait);
                     27:        sti();
                     28: }
                     29: 
                     30: static inline void lock_inode(struct m_inode * inode)
                     31: {
                     32:        cli();
                     33:        while (inode->i_lock)
                     34:                sleep_on(&inode->i_wait);
                     35:        inode->i_lock=1;
                     36:        sti();
                     37: }
                     38: 
                     39: static inline void unlock_inode(struct m_inode * inode)
                     40: {
                     41:        inode->i_lock=0;
                     42:        wake_up(&inode->i_wait);
                     43: }
                     44: 
1.1.1.3   root       45: void invalidate_inodes(int dev)
                     46: {
                     47:        int i;
                     48:        struct m_inode * inode;
                     49: 
                     50:        inode = 0+inode_table;
                     51:        for(i=0 ; i<NR_INODE ; i++,inode++) {
                     52:                wait_on_inode(inode);
                     53:                if (inode->i_dev == dev) {
                     54:                        if (inode->i_count)
                     55:                                printk("inode in use on removed disk\n\r");
                     56:                        inode->i_dev = inode->i_dirt = 0;
                     57:                }
                     58:        }
                     59: }
                     60: 
1.1       root       61: void sync_inodes(void)
                     62: {
                     63:        int i;
                     64:        struct m_inode * inode;
                     65: 
                     66:        inode = 0+inode_table;
                     67:        for(i=0 ; i<NR_INODE ; i++,inode++) {
                     68:                wait_on_inode(inode);
                     69:                if (inode->i_dirt && !inode->i_pipe)
                     70:                        write_inode(inode);
                     71:        }
                     72: }
                     73: 
                     74: static int _bmap(struct m_inode * inode,int block,int create)
                     75: {
                     76:        struct buffer_head * bh;
                     77:        int i;
                     78: 
                     79:        if (block<0)
                     80:                panic("_bmap: block<0");
                     81:        if (block >= 7+512+512*512)
                     82:                panic("_bmap: block>big");
                     83:        if (block<7) {
                     84:                if (create && !inode->i_zone[block])
                     85:                        if (inode->i_zone[block]=new_block(inode->i_dev)) {
                     86:                                inode->i_ctime=CURRENT_TIME;
                     87:                                inode->i_dirt=1;
                     88:                        }
                     89:                return inode->i_zone[block];
                     90:        }
                     91:        block -= 7;
                     92:        if (block<512) {
                     93:                if (create && !inode->i_zone[7])
                     94:                        if (inode->i_zone[7]=new_block(inode->i_dev)) {
                     95:                                inode->i_dirt=1;
                     96:                                inode->i_ctime=CURRENT_TIME;
                     97:                        }
                     98:                if (!inode->i_zone[7])
                     99:                        return 0;
                    100:                if (!(bh = bread(inode->i_dev,inode->i_zone[7])))
                    101:                        return 0;
                    102:                i = ((unsigned short *) (bh->b_data))[block];
                    103:                if (create && !i)
                    104:                        if (i=new_block(inode->i_dev)) {
                    105:                                ((unsigned short *) (bh->b_data))[block]=i;
                    106:                                bh->b_dirt=1;
                    107:                        }
                    108:                brelse(bh);
                    109:                return i;
                    110:        }
                    111:        block -= 512;
                    112:        if (create && !inode->i_zone[8])
                    113:                if (inode->i_zone[8]=new_block(inode->i_dev)) {
                    114:                        inode->i_dirt=1;
                    115:                        inode->i_ctime=CURRENT_TIME;
                    116:                }
                    117:        if (!inode->i_zone[8])
                    118:                return 0;
                    119:        if (!(bh=bread(inode->i_dev,inode->i_zone[8])))
                    120:                return 0;
                    121:        i = ((unsigned short *)bh->b_data)[block>>9];
                    122:        if (create && !i)
                    123:                if (i=new_block(inode->i_dev)) {
                    124:                        ((unsigned short *) (bh->b_data))[block>>9]=i;
                    125:                        bh->b_dirt=1;
                    126:                }
                    127:        brelse(bh);
                    128:        if (!i)
                    129:                return 0;
                    130:        if (!(bh=bread(inode->i_dev,i)))
                    131:                return 0;
                    132:        i = ((unsigned short *)bh->b_data)[block&511];
                    133:        if (create && !i)
                    134:                if (i=new_block(inode->i_dev)) {
                    135:                        ((unsigned short *) (bh->b_data))[block&511]=i;
                    136:                        bh->b_dirt=1;
                    137:                }
                    138:        brelse(bh);
                    139:        return i;
                    140: }
                    141: 
                    142: int bmap(struct m_inode * inode,int block)
                    143: {
                    144:        return _bmap(inode,block,0);
                    145: }
                    146: 
                    147: int create_block(struct m_inode * inode, int block)
                    148: {
                    149:        return _bmap(inode,block,1);
                    150: }
                    151:                
                    152: void iput(struct m_inode * inode)
                    153: {
                    154:        if (!inode)
                    155:                return;
                    156:        wait_on_inode(inode);
                    157:        if (!inode->i_count)
                    158:                panic("iput: trying to free free inode");
                    159:        if (inode->i_pipe) {
                    160:                wake_up(&inode->i_wait);
1.1.1.4 ! root      161:                wake_up(&inode->i_wait2);
1.1       root      162:                if (--inode->i_count)
                    163:                        return;
                    164:                free_page(inode->i_size);
                    165:                inode->i_count=0;
                    166:                inode->i_dirt=0;
                    167:                inode->i_pipe=0;
                    168:                return;
                    169:        }
1.1.1.3   root      170:        if (!inode->i_dev) {
1.1       root      171:                inode->i_count--;
                    172:                return;
                    173:        }
1.1.1.2   root      174:        if (S_ISBLK(inode->i_mode)) {
                    175:                sync_dev(inode->i_zone[0]);
                    176:                wait_on_inode(inode);
                    177:        }
1.1.1.3   root      178: repeat:
                    179:        if (inode->i_count>1) {
                    180:                inode->i_count--;
                    181:                return;
                    182:        }
1.1       root      183:        if (!inode->i_nlinks) {
                    184:                truncate(inode);
                    185:                free_inode(inode);
                    186:                return;
                    187:        }
                    188:        if (inode->i_dirt) {
                    189:                write_inode(inode);     /* we can sleep - so do again */
                    190:                wait_on_inode(inode);
                    191:                goto repeat;
                    192:        }
                    193:        inode->i_count--;
                    194:        return;
                    195: }
                    196: 
                    197: struct m_inode * get_empty_inode(void)
                    198: {
                    199:        struct m_inode * inode;
1.1.1.3   root      200:        static struct m_inode * last_inode = inode_table;
                    201:        int i;
1.1       root      202: 
1.1.1.3   root      203:        do {
1.1       root      204:                inode = NULL;
1.1.1.3   root      205:                for (i = NR_INODE; i ; i--) {
                    206:                        if (++last_inode >= inode_table + NR_INODE)
                    207:                                last_inode = inode_table;
                    208:                        if (!last_inode->i_count) {
                    209:                                inode = last_inode;
                    210:                                if (!inode->i_dirt && !inode->i_lock)
                    211:                                        break;
1.1       root      212:                        }
1.1.1.3   root      213:                }
1.1       root      214:                if (!inode) {
1.1.1.3   root      215:                        for (i=0 ; i<NR_INODE ; i++)
                    216:                                printk("%04x: %6d\t",inode_table[i].i_dev,
                    217:                                        inode_table[i].i_num);
1.1       root      218:                        panic("No free inodes in mem");
                    219:                }
                    220:                wait_on_inode(inode);
                    221:                while (inode->i_dirt) {
                    222:                        write_inode(inode);
                    223:                        wait_on_inode(inode);
                    224:                }
1.1.1.3   root      225:        } while (inode->i_count);
1.1       root      226:        memset(inode,0,sizeof(*inode));
                    227:        inode->i_count = 1;
                    228:        return inode;
                    229: }
                    230: 
                    231: struct m_inode * get_pipe_inode(void)
                    232: {
                    233:        struct m_inode * inode;
                    234: 
                    235:        if (!(inode = get_empty_inode()))
                    236:                return NULL;
                    237:        if (!(inode->i_size=get_free_page())) {
                    238:                inode->i_count = 0;
                    239:                return NULL;
                    240:        }
                    241:        inode->i_count = 2;     /* sum of readers/writers */
                    242:        PIPE_HEAD(*inode) = PIPE_TAIL(*inode) = 0;
                    243:        inode->i_pipe = 1;
                    244:        return inode;
                    245: }
                    246: 
                    247: struct m_inode * iget(int dev,int nr)
                    248: {
                    249:        struct m_inode * inode, * empty;
                    250: 
                    251:        if (!dev)
                    252:                panic("iget with dev==0");
                    253:        empty = get_empty_inode();
                    254:        inode = inode_table;
                    255:        while (inode < NR_INODE+inode_table) {
                    256:                if (inode->i_dev != dev || inode->i_num != nr) {
                    257:                        inode++;
                    258:                        continue;
                    259:                }
                    260:                wait_on_inode(inode);
                    261:                if (inode->i_dev != dev || inode->i_num != nr) {
                    262:                        inode = inode_table;
                    263:                        continue;
                    264:                }
                    265:                inode->i_count++;
1.1.1.2   root      266:                if (inode->i_mount) {
                    267:                        int i;
                    268: 
                    269:                        for (i = 0 ; i<NR_SUPER ; i++)
                    270:                                if (super_block[i].s_imount==inode)
                    271:                                        break;
                    272:                        if (i >= NR_SUPER) {
                    273:                                printk("Mounted inode hasn't got sb\n");
                    274:                                if (empty)
                    275:                                        iput(empty);
                    276:                                return inode;
                    277:                        }
                    278:                        iput(inode);
                    279:                        dev = super_block[i].s_dev;
                    280:                        nr = ROOT_INO;
                    281:                        inode = inode_table;
                    282:                        continue;
                    283:                }
1.1       root      284:                if (empty)
                    285:                        iput(empty);
                    286:                return inode;
                    287:        }
                    288:        if (!empty)
                    289:                return (NULL);
                    290:        inode=empty;
                    291:        inode->i_dev = dev;
                    292:        inode->i_num = nr;
                    293:        read_inode(inode);
                    294:        return inode;
                    295: }
                    296: 
                    297: static void read_inode(struct m_inode * inode)
                    298: {
                    299:        struct super_block * sb;
                    300:        struct buffer_head * bh;
                    301:        int block;
                    302: 
                    303:        lock_inode(inode);
1.1.1.3   root      304:        if (!(sb=get_super(inode->i_dev)))
                    305:                panic("trying to read inode without dev");
1.1       root      306:        block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks +
                    307:                (inode->i_num-1)/INODES_PER_BLOCK;
                    308:        if (!(bh=bread(inode->i_dev,block)))
                    309:                panic("unable to read i-node block");
                    310:        *(struct d_inode *)inode =
                    311:                ((struct d_inode *)bh->b_data)
                    312:                        [(inode->i_num-1)%INODES_PER_BLOCK];
                    313:        brelse(bh);
1.1.1.4 ! root      314:        if (S_ISBLK(inode->i_mode)) {
        !           315:                int i = inode->i_zone[0];
        !           316:                if (blk_size[MAJOR(i)])
        !           317:                        inode->i_size = 1024*blk_size[MAJOR(i)][MINOR(i)];
        !           318:                else
        !           319:                        inode->i_size = 0x7fffffff;
        !           320:        }
1.1       root      321:        unlock_inode(inode);
                    322: }
                    323: 
                    324: static void write_inode(struct m_inode * inode)
                    325: {
                    326:        struct super_block * sb;
                    327:        struct buffer_head * bh;
                    328:        int block;
                    329: 
                    330:        lock_inode(inode);
1.1.1.3   root      331:        if (!inode->i_dirt || !inode->i_dev) {
                    332:                unlock_inode(inode);
                    333:                return;
                    334:        }
                    335:        if (!(sb=get_super(inode->i_dev)))
                    336:                panic("trying to write inode without device");
1.1       root      337:        block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks +
                    338:                (inode->i_num-1)/INODES_PER_BLOCK;
                    339:        if (!(bh=bread(inode->i_dev,block)))
                    340:                panic("unable to read i-node block");
                    341:        ((struct d_inode *)bh->b_data)
                    342:                [(inode->i_num-1)%INODES_PER_BLOCK] =
                    343:                        *(struct d_inode *)inode;
                    344:        bh->b_dirt=1;
                    345:        inode->i_dirt=0;
                    346:        brelse(bh);
                    347:        unlock_inode(inode);
                    348: }

unix.superglobalmegacorp.com

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