Annotation of linux/fs/minix/inode.c, revision 1.1.1.6

1.1       root        1: /*
                      2:  *  linux/fs/minix/inode.c
                      3:  *
1.1.1.6 ! root        4:  *  Copyright (C) 1991, 1992  Linus Torvalds
1.1       root        5:  */
                      6: 
                      7: #include <linux/sched.h>
                      8: #include <linux/minix_fs.h>
                      9: #include <linux/kernel.h>
                     10: #include <linux/mm.h>
1.1.1.6 ! root       11: #include <linux/string.h>
        !            12: #include <linux/stat.h>
        !            13: 
1.1       root       14: #include <asm/system.h>
1.1.1.4   root       15: #include <asm/segment.h>
1.1       root       16: 
1.1.1.2   root       17: int sync_dev(int dev);
                     18: 
1.1.1.3   root       19: void minix_put_inode(struct inode *inode)
                     20: {
                     21:        inode->i_size = 0;
                     22:        minix_truncate(inode);
                     23:        minix_free_inode(inode);
                     24: }
                     25: 
1.1.1.2   root       26: void minix_put_super(struct super_block *sb)
                     27: {
                     28:        int i;
                     29: 
                     30:        lock_super(sb);
                     31:        sb->s_dev = 0;
                     32:        for(i = 0 ; i < MINIX_I_MAP_SLOTS ; i++)
1.1.1.6 ! root       33:                brelse(sb->u.minix_sb.s_imap[i]);
1.1.1.2   root       34:        for(i = 0 ; i < MINIX_Z_MAP_SLOTS ; i++)
1.1.1.6 ! root       35:                brelse(sb->u.minix_sb.s_zmap[i]);
1.1.1.2   root       36:        free_super(sb);
                     37:        return;
                     38: }
                     39: 
                     40: static struct super_operations minix_sops = { 
                     41:        minix_read_inode,
1.1.1.3   root       42:        minix_write_inode,
                     43:        minix_put_inode,
1.1.1.4   root       44:        minix_put_super,
1.1.1.5   root       45:        NULL,
1.1.1.4   root       46:        minix_statfs
1.1.1.2   root       47: };
                     48: 
                     49: struct super_block *minix_read_super(struct super_block *s,void *data)
                     50: {
                     51:        struct buffer_head *bh;
1.1.1.4   root       52:        struct minix_super_block *ms;
1.1.1.2   root       53:        int i,dev=s->s_dev,block;
                     54: 
                     55:        lock_super(s);
1.1.1.6 ! root       56:        if (!(bh = bread(dev,1,BLOCK_SIZE))) {
1.1.1.2   root       57:                s->s_dev=0;
                     58:                free_super(s);
                     59:                printk("bread failed\n");
                     60:                return NULL;
                     61:        }
1.1.1.4   root       62:        ms = (struct minix_super_block *) bh->b_data;
1.1.1.6 ! root       63:        s->s_blocksize = 1024;
        !            64:        s->u.minix_sb.s_ninodes = ms->s_ninodes;
        !            65:        s->u.minix_sb.s_nzones = ms->s_nzones;
        !            66:        s->u.minix_sb.s_imap_blocks = ms->s_imap_blocks;
        !            67:        s->u.minix_sb.s_zmap_blocks = ms->s_zmap_blocks;
        !            68:        s->u.minix_sb.s_firstdatazone = ms->s_firstdatazone;
        !            69:        s->u.minix_sb.s_log_zone_size = ms->s_log_zone_size;
        !            70:        s->u.minix_sb.s_max_size = ms->s_max_size;
1.1.1.4   root       71:        s->s_magic = ms->s_magic;
1.1.1.2   root       72:        brelse(bh);
                     73:        if (s->s_magic != MINIX_SUPER_MAGIC) {
                     74:                s->s_dev = 0;
                     75:                free_super(s);
                     76:                printk("magic match failed\n");
                     77:                return NULL;
                     78:        }
                     79:        for (i=0;i < MINIX_I_MAP_SLOTS;i++)
1.1.1.6 ! root       80:                s->u.minix_sb.s_imap[i] = NULL;
1.1.1.2   root       81:        for (i=0;i < MINIX_Z_MAP_SLOTS;i++)
1.1.1.6 ! root       82:                s->u.minix_sb.s_zmap[i] = NULL;
1.1.1.2   root       83:        block=2;
1.1.1.6 ! root       84:        for (i=0 ; i < s->u.minix_sb.s_imap_blocks ; i++)
        !            85:                if (s->u.minix_sb.s_imap[i]=bread(dev,block,BLOCK_SIZE))
1.1.1.2   root       86:                        block++;
                     87:                else
                     88:                        break;
1.1.1.6 ! root       89:        for (i=0 ; i < s->u.minix_sb.s_zmap_blocks ; i++)
        !            90:                if (s->u.minix_sb.s_zmap[i]=bread(dev,block,BLOCK_SIZE))
1.1.1.2   root       91:                        block++;
                     92:                else
                     93:                        break;
1.1.1.6 ! root       94:        if (block != 2+s->u.minix_sb.s_imap_blocks+s->u.minix_sb.s_zmap_blocks) {
1.1.1.2   root       95:                for(i=0;i<MINIX_I_MAP_SLOTS;i++)
1.1.1.6 ! root       96:                        brelse(s->u.minix_sb.s_imap[i]);
1.1.1.2   root       97:                for(i=0;i<MINIX_Z_MAP_SLOTS;i++)
1.1.1.6 ! root       98:                        brelse(s->u.minix_sb.s_zmap[i]);
1.1.1.2   root       99:                s->s_dev=0;
                    100:                free_super(s);
                    101:                printk("block failed\n");
                    102:                return NULL;
                    103:        }
1.1.1.6 ! root      104:        s->u.minix_sb.s_imap[0]->b_data[0] |= 1;
        !           105:        s->u.minix_sb.s_zmap[0]->b_data[0] |= 1;
1.1.1.2   root      106:        free_super(s);
                    107:        /* set up enough so that it can read an inode */
                    108:        s->s_dev = dev;
                    109:        s->s_op = &minix_sops;
                    110:        if (!(s->s_mounted = iget(dev,MINIX_ROOT_INO))) {
                    111:                s->s_dev=0;
                    112:                printk("get root inode failed\n");
                    113:                return NULL;
                    114:        }
                    115:        return s;
                    116: }
                    117: 
1.1.1.4   root      118: void minix_statfs (struct super_block *sb, struct statfs *buf)
                    119: {
                    120:        long tmp;
                    121: 
                    122:        put_fs_long(MINIX_SUPER_MAGIC, &buf->f_type);
                    123:        put_fs_long(1024, &buf->f_bsize);
1.1.1.6 ! root      124:        put_fs_long(sb->u.minix_sb.s_nzones << sb->u.minix_sb.s_log_zone_size, &buf->f_blocks);
1.1.1.4   root      125:        tmp = minix_count_free_blocks(sb);
                    126:        put_fs_long(tmp, &buf->f_bfree);
                    127:        put_fs_long(tmp, &buf->f_bavail);
1.1.1.6 ! root      128:        put_fs_long(sb->u.minix_sb.s_ninodes, &buf->f_files);
1.1.1.4   root      129:        put_fs_long(minix_count_free_inodes(sb), &buf->f_ffree);
                    130:        /* Don't know what value to put in buf->f_fsid */
                    131: }
                    132: 
1.1.1.2   root      133: static int _minix_bmap(struct inode * inode,int block,int create)
1.1       root      134: {
                    135:        struct buffer_head * bh;
                    136:        int i;
                    137: 
1.1.1.2   root      138:        if (block<0) {
                    139:                printk("_minix_bmap: block<0");
                    140:                return 0;
                    141:        }
                    142:        if (block >= 7+512+512*512) {
                    143:                printk("_minix_bmap: block>big");
                    144:                return 0;
                    145:        }
1.1       root      146:        if (block<7) {
                    147:                if (create && !inode->i_data[block])
                    148:                        if (inode->i_data[block]=minix_new_block(inode->i_dev)) {
                    149:                                inode->i_ctime=CURRENT_TIME;
                    150:                                inode->i_dirt=1;
                    151:                        }
                    152:                return inode->i_data[block];
                    153:        }
                    154:        block -= 7;
                    155:        if (block<512) {
                    156:                if (create && !inode->i_data[7])
                    157:                        if (inode->i_data[7]=minix_new_block(inode->i_dev)) {
                    158:                                inode->i_dirt=1;
                    159:                                inode->i_ctime=CURRENT_TIME;
                    160:                        }
                    161:                if (!inode->i_data[7])
                    162:                        return 0;
1.1.1.6 ! root      163:                if (!(bh = bread(inode->i_dev,inode->i_data[7],BLOCK_SIZE)))
1.1       root      164:                        return 0;
                    165:                i = ((unsigned short *) (bh->b_data))[block];
                    166:                if (create && !i)
                    167:                        if (i=minix_new_block(inode->i_dev)) {
                    168:                                ((unsigned short *) (bh->b_data))[block]=i;
                    169:                                bh->b_dirt=1;
                    170:                        }
                    171:                brelse(bh);
                    172:                return i;
                    173:        }
                    174:        block -= 512;
                    175:        if (create && !inode->i_data[8])
                    176:                if (inode->i_data[8]=minix_new_block(inode->i_dev)) {
                    177:                        inode->i_dirt=1;
                    178:                        inode->i_ctime=CURRENT_TIME;
                    179:                }
                    180:        if (!inode->i_data[8])
                    181:                return 0;
1.1.1.6 ! root      182:        if (!(bh=bread(inode->i_dev,inode->i_data[8], BLOCK_SIZE)))
1.1       root      183:                return 0;
                    184:        i = ((unsigned short *)bh->b_data)[block>>9];
                    185:        if (create && !i)
                    186:                if (i=minix_new_block(inode->i_dev)) {
                    187:                        ((unsigned short *) (bh->b_data))[block>>9]=i;
                    188:                        bh->b_dirt=1;
                    189:                }
                    190:        brelse(bh);
                    191:        if (!i)
                    192:                return 0;
1.1.1.6 ! root      193:        if (!(bh=bread(inode->i_dev,i,BLOCK_SIZE)))
1.1       root      194:                return 0;
                    195:        i = ((unsigned short *)bh->b_data)[block&511];
                    196:        if (create && !i)
                    197:                if (i=minix_new_block(inode->i_dev)) {
                    198:                        ((unsigned short *) (bh->b_data))[block&511]=i;
                    199:                        bh->b_dirt=1;
                    200:                }
                    201:        brelse(bh);
                    202:        return i;
                    203: }
                    204: 
                    205: int minix_bmap(struct inode * inode,int block)
                    206: {
1.1.1.2   root      207:        return _minix_bmap(inode,block,0);
1.1       root      208: }
                    209: 
                    210: int minix_create_block(struct inode * inode, int block)
                    211: {
1.1.1.2   root      212:        return _minix_bmap(inode,block,1);
1.1       root      213: }
                    214: 
                    215: void minix_read_inode(struct inode * inode)
                    216: {
                    217:        struct buffer_head * bh;
                    218:        struct minix_inode * raw_inode;
                    219:        int block;
                    220: 
1.1.1.6 ! root      221:        block = 2 + inode->i_sb->u.minix_sb.s_imap_blocks + inode->i_sb->u.minix_sb.s_zmap_blocks +
1.1       root      222:                (inode->i_ino-1)/MINIX_INODES_PER_BLOCK;
1.1.1.6 ! root      223:        if (!(bh=bread(inode->i_dev,block, BLOCK_SIZE)))
1.1       root      224:                panic("unable to read i-node block");
                    225:        raw_inode = ((struct minix_inode *) bh->b_data) +
                    226:                (inode->i_ino-1)%MINIX_INODES_PER_BLOCK;
                    227:        inode->i_mode = raw_inode->i_mode;
                    228:        inode->i_uid = raw_inode->i_uid;
                    229:        inode->i_gid = raw_inode->i_gid;
                    230:        inode->i_nlink = raw_inode->i_nlinks;
                    231:        inode->i_size = raw_inode->i_size;
                    232:        inode->i_mtime = inode->i_atime = inode->i_ctime = raw_inode->i_time;
                    233:        if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
                    234:                inode->i_rdev = raw_inode->i_zone[0];
                    235:        else for (block = 0; block < 9; block++)
                    236:                inode->i_data[block] = raw_inode->i_zone[block];
                    237:        brelse(bh);
1.1.1.3   root      238:        inode->i_op = NULL;
                    239:        if (S_ISREG(inode->i_mode))
                    240:                inode->i_op = &minix_file_inode_operations;
                    241:        else if (S_ISDIR(inode->i_mode))
                    242:                inode->i_op = &minix_dir_inode_operations;
                    243:        else if (S_ISLNK(inode->i_mode))
                    244:                inode->i_op = &minix_symlink_inode_operations;
                    245:        else if (S_ISCHR(inode->i_mode))
                    246:                inode->i_op = &minix_chrdev_inode_operations;
                    247:        else if (S_ISBLK(inode->i_mode))
                    248:                inode->i_op = &minix_blkdev_inode_operations;
1.1.1.5   root      249:        else if (S_ISFIFO(inode->i_mode)) {
                    250:                inode->i_op = &minix_fifo_inode_operations;
                    251:                inode->i_size = 0;
                    252:                inode->i_pipe = 1;
                    253:                PIPE_HEAD(*inode) = PIPE_TAIL(*inode) = 0;
                    254:                PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 0;
                    255:        }
1.1       root      256: }
                    257: 
                    258: void minix_write_inode(struct inode * inode)
                    259: {
                    260:        struct buffer_head * bh;
                    261:        struct minix_inode * raw_inode;
                    262:        int block;
                    263: 
1.1.1.6 ! root      264:        block = 2 + inode->i_sb->u.minix_sb.s_imap_blocks + inode->i_sb->u.minix_sb.s_zmap_blocks +
1.1       root      265:                (inode->i_ino-1)/MINIX_INODES_PER_BLOCK;
1.1.1.6 ! root      266:        if (!(bh=bread(inode->i_dev, block, BLOCK_SIZE)))
1.1       root      267:                panic("unable to read i-node block");
                    268:        raw_inode = ((struct minix_inode *)bh->b_data) +
                    269:                (inode->i_ino-1)%MINIX_INODES_PER_BLOCK;
                    270:        raw_inode->i_mode = inode->i_mode;
                    271:        raw_inode->i_uid = inode->i_uid;
                    272:        raw_inode->i_gid = inode->i_gid;
                    273:        raw_inode->i_nlinks = inode->i_nlink;
                    274:        raw_inode->i_size = inode->i_size;
                    275:        raw_inode->i_time = inode->i_mtime;
                    276:        if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
                    277:                raw_inode->i_zone[0] = inode->i_rdev;
                    278:        else for (block = 0; block < 9; block++)
                    279:                raw_inode->i_zone[block] = inode->i_data[block];
                    280:        bh->b_dirt=1;
                    281:        inode->i_dirt=0;
                    282:        brelse(bh);
                    283: }

unix.superglobalmegacorp.com

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