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

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

unix.superglobalmegacorp.com

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