--- linux/fs/minix/inode.c 2018/04/24 18:03:52 1.1.1.1 +++ linux/fs/minix/inode.c 2018/04/24 18:07:15 1.1.1.3 @@ -4,7 +4,7 @@ * (C) 1991 Linus Torvalds */ -#include +#include #include #include @@ -13,15 +13,109 @@ #include #include -static int _bmap(struct inode * inode,int block,int create) +int sync_dev(int dev); + +void minix_put_inode(struct inode *inode) +{ + inode->i_size = 0; + minix_truncate(inode); + minix_free_inode(inode); +} + +void minix_put_super(struct super_block *sb) +{ + int i; + + lock_super(sb); + sb->s_dev = 0; + for(i = 0 ; i < MINIX_I_MAP_SLOTS ; i++) + brelse(sb->s_imap[i]); + for(i = 0 ; i < MINIX_Z_MAP_SLOTS ; i++) + brelse(sb->s_zmap[i]); + free_super(sb); + return; +} + +static struct super_operations minix_sops = { + minix_read_inode, + minix_write_inode, + minix_put_inode, + minix_put_super +}; + +struct super_block *minix_read_super(struct super_block *s,void *data) +{ + struct buffer_head *bh; + int i,dev=s->s_dev,block; + + lock_super(s); + if (!(bh = bread(dev,1))) { + s->s_dev=0; + free_super(s); + printk("bread failed\n"); + return NULL; + } + *((struct minix_super_block *) s) = + *((struct minix_super_block *) bh->b_data); + brelse(bh); + if (s->s_magic != MINIX_SUPER_MAGIC) { + s->s_dev = 0; + free_super(s); + printk("magic match failed\n"); + return NULL; + } + for (i=0;i < MINIX_I_MAP_SLOTS;i++) + s->s_imap[i] = NULL; + for (i=0;i < MINIX_Z_MAP_SLOTS;i++) + s->s_zmap[i] = NULL; + block=2; + for (i=0 ; i < s->s_imap_blocks ; i++) + if (s->s_imap[i]=bread(dev,block)) + block++; + else + break; + for (i=0 ; i < s->s_zmap_blocks ; i++) + if (s->s_zmap[i]=bread(dev,block)) + block++; + else + break; + if (block != 2+s->s_imap_blocks+s->s_zmap_blocks) { + for(i=0;is_imap[i]); + for(i=0;is_zmap[i]); + s->s_dev=0; + free_super(s); + printk("block failed\n"); + return NULL; + } + s->s_imap[0]->b_data[0] |= 1; + s->s_zmap[0]->b_data[0] |= 1; + free_super(s); + /* set up enough so that it can read an inode */ + s->s_dev = dev; + s->s_op = &minix_sops; + if (!(s->s_mounted = iget(dev,MINIX_ROOT_INO))) { + s->s_dev=0; + printk("get root inode failed\n"); + return NULL; + } + return s; +} + +static int _minix_bmap(struct inode * inode,int block,int create) { struct buffer_head * bh; int i; - if (block<0) - panic("_bmap: block<0"); - if (block >= 7+512+512*512) - panic("_bmap: block>big"); + if (block<0) { + printk("_minix_bmap: block<0"); + return 0; + } + if (block >= 7+512+512*512) { + printk("_minix_bmap: block>big"); + return 0; + } if (block<7) { if (create && !inode->i_data[block]) if (inode->i_data[block]=minix_new_block(inode->i_dev)) { @@ -83,12 +177,12 @@ static int _bmap(struct inode * inode,in int minix_bmap(struct inode * inode,int block) { - return _bmap(inode,block,0); + return _minix_bmap(inode,block,0); } int minix_create_block(struct inode * inode, int block) { - return _bmap(inode,block,1); + return _minix_bmap(inode,block,1); } void minix_read_inode(struct inode * inode) @@ -114,7 +208,17 @@ void minix_read_inode(struct inode * ino else for (block = 0; block < 9; block++) inode->i_data[block] = raw_inode->i_zone[block]; brelse(bh); - inode->i_op = &minix_inode_operations; + inode->i_op = NULL; + if (S_ISREG(inode->i_mode)) + inode->i_op = &minix_file_inode_operations; + else if (S_ISDIR(inode->i_mode)) + inode->i_op = &minix_dir_inode_operations; + else if (S_ISLNK(inode->i_mode)) + inode->i_op = &minix_symlink_inode_operations; + else if (S_ISCHR(inode->i_mode)) + inode->i_op = &minix_chrdev_inode_operations; + else if (S_ISBLK(inode->i_mode)) + inode->i_op = &minix_blkdev_inode_operations; } void minix_write_inode(struct inode * inode)