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

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

unix.superglobalmegacorp.com

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