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