|
|
1.1 root 1: /*
2: * linux/fs/minix/inode.c
3: *
4: * (C) 1991 Linus Torvalds
5: */
6:
7: #include <string.h>
8: #include <sys/stat.h>
9:
10: #include <linux/sched.h>
11: #include <linux/minix_fs.h>
12: #include <linux/kernel.h>
13: #include <linux/mm.h>
14: #include <asm/system.h>
15:
1.1.1.2 ! root 16: int sync_dev(int dev);
! 17:
! 18: void minix_put_super(struct super_block *sb)
! 19: {
! 20: int i;
! 21:
! 22: lock_super(sb);
! 23: sb->s_dev = 0;
! 24: for(i = 0 ; i < MINIX_I_MAP_SLOTS ; i++)
! 25: brelse(sb->s_imap[i]);
! 26: for(i = 0 ; i < MINIX_Z_MAP_SLOTS ; i++)
! 27: brelse(sb->s_zmap[i]);
! 28: free_super(sb);
! 29: return;
! 30: }
! 31:
! 32: static struct super_operations minix_sops = {
! 33: minix_read_inode,
! 34: minix_put_super
! 35: };
! 36:
! 37: struct super_block *minix_read_super(struct super_block *s,void *data)
! 38: {
! 39: struct buffer_head *bh;
! 40: int i,dev=s->s_dev,block;
! 41:
! 42: lock_super(s);
! 43: if (!(bh = bread(dev,1))) {
! 44: s->s_dev=0;
! 45: free_super(s);
! 46: printk("bread failed\n");
! 47: return NULL;
! 48: }
! 49: *((struct minix_super_block *) s) =
! 50: *((struct minix_super_block *) bh->b_data);
! 51: brelse(bh);
! 52: if (s->s_magic != MINIX_SUPER_MAGIC) {
! 53: s->s_dev = 0;
! 54: free_super(s);
! 55: printk("magic match failed\n");
! 56: return NULL;
! 57: }
! 58: for (i=0;i < MINIX_I_MAP_SLOTS;i++)
! 59: s->s_imap[i] = NULL;
! 60: for (i=0;i < MINIX_Z_MAP_SLOTS;i++)
! 61: s->s_zmap[i] = NULL;
! 62: block=2;
! 63: for (i=0 ; i < s->s_imap_blocks ; i++)
! 64: if (s->s_imap[i]=bread(dev,block))
! 65: block++;
! 66: else
! 67: break;
! 68: for (i=0 ; i < s->s_zmap_blocks ; i++)
! 69: if (s->s_zmap[i]=bread(dev,block))
! 70: block++;
! 71: else
! 72: break;
! 73: if (block != 2+s->s_imap_blocks+s->s_zmap_blocks) {
! 74: for(i=0;i<MINIX_I_MAP_SLOTS;i++)
! 75: brelse(s->s_imap[i]);
! 76: for(i=0;i<MINIX_Z_MAP_SLOTS;i++)
! 77: brelse(s->s_zmap[i]);
! 78: s->s_dev=0;
! 79: free_super(s);
! 80: printk("block failed\n");
! 81: return NULL;
! 82: }
! 83: s->s_imap[0]->b_data[0] |= 1;
! 84: s->s_zmap[0]->b_data[0] |= 1;
! 85: free_super(s);
! 86: /* set up enough so that it can read an inode */
! 87: s->s_dev = dev;
! 88: s->s_op = &minix_sops;
! 89: if (!(s->s_mounted = iget(dev,MINIX_ROOT_INO))) {
! 90: s->s_dev=0;
! 91: printk("get root inode failed\n");
! 92: return NULL;
! 93: }
! 94: return s;
! 95: }
! 96:
! 97: static int _minix_bmap(struct inode * inode,int block,int create)
1.1 root 98: {
99: struct buffer_head * bh;
100: int i;
101:
1.1.1.2 ! root 102: if (block<0) {
! 103: printk("_minix_bmap: block<0");
! 104: return 0;
! 105: }
! 106: if (block >= 7+512+512*512) {
! 107: printk("_minix_bmap: block>big");
! 108: return 0;
! 109: }
1.1 root 110: if (block<7) {
111: if (create && !inode->i_data[block])
112: if (inode->i_data[block]=minix_new_block(inode->i_dev)) {
113: inode->i_ctime=CURRENT_TIME;
114: inode->i_dirt=1;
115: }
116: return inode->i_data[block];
117: }
118: block -= 7;
119: if (block<512) {
120: if (create && !inode->i_data[7])
121: if (inode->i_data[7]=minix_new_block(inode->i_dev)) {
122: inode->i_dirt=1;
123: inode->i_ctime=CURRENT_TIME;
124: }
125: if (!inode->i_data[7])
126: return 0;
127: if (!(bh = bread(inode->i_dev,inode->i_data[7])))
128: return 0;
129: i = ((unsigned short *) (bh->b_data))[block];
130: if (create && !i)
131: if (i=minix_new_block(inode->i_dev)) {
132: ((unsigned short *) (bh->b_data))[block]=i;
133: bh->b_dirt=1;
134: }
135: brelse(bh);
136: return i;
137: }
138: block -= 512;
139: if (create && !inode->i_data[8])
140: if (inode->i_data[8]=minix_new_block(inode->i_dev)) {
141: inode->i_dirt=1;
142: inode->i_ctime=CURRENT_TIME;
143: }
144: if (!inode->i_data[8])
145: return 0;
146: if (!(bh=bread(inode->i_dev,inode->i_data[8])))
147: return 0;
148: i = ((unsigned short *)bh->b_data)[block>>9];
149: if (create && !i)
150: if (i=minix_new_block(inode->i_dev)) {
151: ((unsigned short *) (bh->b_data))[block>>9]=i;
152: bh->b_dirt=1;
153: }
154: brelse(bh);
155: if (!i)
156: return 0;
157: if (!(bh=bread(inode->i_dev,i)))
158: return 0;
159: i = ((unsigned short *)bh->b_data)[block&511];
160: if (create && !i)
161: if (i=minix_new_block(inode->i_dev)) {
162: ((unsigned short *) (bh->b_data))[block&511]=i;
163: bh->b_dirt=1;
164: }
165: brelse(bh);
166: return i;
167: }
168:
169: int minix_bmap(struct inode * inode,int block)
170: {
1.1.1.2 ! root 171: return _minix_bmap(inode,block,0);
1.1 root 172: }
173:
174: int minix_create_block(struct inode * inode, int block)
175: {
1.1.1.2 ! root 176: return _minix_bmap(inode,block,1);
1.1 root 177: }
178:
179: void minix_read_inode(struct inode * inode)
180: {
181: struct buffer_head * bh;
182: struct minix_inode * raw_inode;
183: int block;
184:
185: block = 2 + inode->i_sb->s_imap_blocks + inode->i_sb->s_zmap_blocks +
186: (inode->i_ino-1)/MINIX_INODES_PER_BLOCK;
187: if (!(bh=bread(inode->i_dev,block)))
188: panic("unable to read i-node block");
189: raw_inode = ((struct minix_inode *) bh->b_data) +
190: (inode->i_ino-1)%MINIX_INODES_PER_BLOCK;
191: inode->i_mode = raw_inode->i_mode;
192: inode->i_uid = raw_inode->i_uid;
193: inode->i_gid = raw_inode->i_gid;
194: inode->i_nlink = raw_inode->i_nlinks;
195: inode->i_size = raw_inode->i_size;
196: inode->i_mtime = inode->i_atime = inode->i_ctime = raw_inode->i_time;
197: if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
198: inode->i_rdev = raw_inode->i_zone[0];
199: else for (block = 0; block < 9; block++)
200: inode->i_data[block] = raw_inode->i_zone[block];
201: brelse(bh);
202: inode->i_op = &minix_inode_operations;
203: }
204:
205: void minix_write_inode(struct inode * inode)
206: {
207: struct buffer_head * bh;
208: struct minix_inode * raw_inode;
209: int block;
210:
211: block = 2 + inode->i_sb->s_imap_blocks + inode->i_sb->s_zmap_blocks +
212: (inode->i_ino-1)/MINIX_INODES_PER_BLOCK;
213: if (!(bh=bread(inode->i_dev,block)))
214: panic("unable to read i-node block");
215: raw_inode = ((struct minix_inode *)bh->b_data) +
216: (inode->i_ino-1)%MINIX_INODES_PER_BLOCK;
217: raw_inode->i_mode = inode->i_mode;
218: raw_inode->i_uid = inode->i_uid;
219: raw_inode->i_gid = inode->i_gid;
220: raw_inode->i_nlinks = inode->i_nlink;
221: raw_inode->i_size = inode->i_size;
222: raw_inode->i_time = inode->i_mtime;
223: if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
224: raw_inode->i_zone[0] = inode->i_rdev;
225: else for (block = 0; block < 9; block++)
226: raw_inode->i_zone[block] = inode->i_data[block];
227: bh->b_dirt=1;
228: inode->i_dirt=0;
229: brelse(bh);
230: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.