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