This source file includes following definitions.
- minix_put_inode
- minix_put_super
- minix_read_super
- _minix_bmap
- minix_bmap
- minix_create_block
- minix_read_inode
- minix_write_inode
1
2
3
4
5
6
7 #include <linux/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
16 int sync_dev(int dev);
17
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
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,
41 minix_write_inode,
42 minix_put_inode,
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
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)
107 {
108 struct buffer_head * bh;
109 int i;
110
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 }
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 {
180 return _minix_bmap(inode,block,0);
181 }
182
183 int minix_create_block(struct inode * inode, int block)
184 {
185 return _minix_bmap(inode,block,1);
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);
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;
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 }