1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <linux/config.h>
16#include <linux/fs.h>
17#include <linux/ext2_fs.h>
18#include <linux/locks.h>
19#include <linux/quotaops.h>
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44static struct buffer_head *read_inode_bitmap (struct super_block * sb,
45 unsigned long block_group)
46{
47 struct ext2_group_desc *desc;
48 struct buffer_head *bh = NULL;
49
50 desc = ext2_get_group_desc(sb, block_group, NULL);
51 if (!desc)
52 goto error_out;
53
54 bh = sb_bread(sb, le32_to_cpu(desc->bg_inode_bitmap));
55 if (!bh)
56 ext2_error (sb, "read_inode_bitmap",
57 "Cannot read inode bitmap - "
58 "block_group = %lu, inode_bitmap = %lu",
59 block_group, (unsigned long) desc->bg_inode_bitmap);
60error_out:
61 return bh;
62}
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77static struct buffer_head *load_inode_bitmap (struct super_block * sb,
78 unsigned int block_group)
79{
80 int i, slot = 0;
81 struct ext2_sb_info *sbi = &sb->u.ext2_sb;
82 struct buffer_head *bh = sbi->s_inode_bitmap[0];
83
84 if (block_group >= sbi->s_groups_count)
85 ext2_panic (sb, "load_inode_bitmap",
86 "block_group >= groups_count - "
87 "block_group = %d, groups_count = %lu",
88 block_group, sbi->s_groups_count);
89
90 if (sbi->s_loaded_inode_bitmaps > 0 &&
91 sbi->s_inode_bitmap_number[0] == block_group && bh)
92 goto found;
93
94 if (sbi->s_groups_count <= EXT2_MAX_GROUP_LOADED) {
95 slot = block_group;
96 bh = sbi->s_inode_bitmap[slot];
97 if (!bh)
98 goto read_it;
99 if (sbi->s_inode_bitmap_number[slot] == slot)
100 goto found;
101 ext2_panic (sb, "load_inode_bitmap",
102 "block_group != inode_bitmap_number");
103 }
104
105 bh = NULL;
106 for (i = 0; i < sbi->s_loaded_inode_bitmaps &&
107 sbi->s_inode_bitmap_number[i] != block_group;
108 i++)
109 ;
110 if (i < sbi->s_loaded_inode_bitmaps)
111 bh = sbi->s_inode_bitmap[i];
112 else if (sbi->s_loaded_inode_bitmaps < EXT2_MAX_GROUP_LOADED)
113 sbi->s_loaded_inode_bitmaps++;
114 else
115 brelse (sbi->s_inode_bitmap[--i]);
116
117 while (i--) {
118 sbi->s_inode_bitmap_number[i+1] = sbi->s_inode_bitmap_number[i];
119 sbi->s_inode_bitmap[i+1] = sbi->s_inode_bitmap[i];
120 }
121
122read_it:
123 if (!bh)
124 bh = read_inode_bitmap (sb, block_group);
125 sbi->s_inode_bitmap_number[slot] = block_group;
126 sbi->s_inode_bitmap[slot] = bh;
127 if (!bh)
128 return ERR_PTR(-EIO);
129found:
130 return bh;
131}
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149void ext2_free_inode (struct inode * inode)
150{
151 struct super_block * sb = inode->i_sb;
152 int is_directory;
153 unsigned long ino;
154 struct buffer_head * bh;
155 struct buffer_head * bh2;
156 unsigned long block_group;
157 unsigned long bit;
158 struct ext2_group_desc * desc;
159 struct ext2_super_block * es;
160
161 ino = inode->i_ino;
162 ext2_debug ("freeing inode %lu\n", ino);
163
164
165
166
167
168 if (!is_bad_inode(inode)) {
169
170 DQUOT_FREE_INODE(inode);
171 DQUOT_DROP(inode);
172 }
173
174 lock_super (sb);
175 es = sb->u.ext2_sb.s_es;
176 is_directory = S_ISDIR(inode->i_mode);
177
178
179 clear_inode (inode);
180
181 if (ino < EXT2_FIRST_INO(sb) ||
182 ino > le32_to_cpu(es->s_inodes_count)) {
183 ext2_error (sb, "ext2_free_inode",
184 "reserved or nonexistent inode %lu", ino);
185 goto error_return;
186 }
187 block_group = (ino - 1) / EXT2_INODES_PER_GROUP(sb);
188 bit = (ino - 1) % EXT2_INODES_PER_GROUP(sb);
189 bh = load_inode_bitmap (sb, block_group);
190 if (IS_ERR(bh))
191 goto error_return;
192
193
194 if (!ext2_clear_bit (bit, bh->b_data))
195 ext2_error (sb, "ext2_free_inode",
196 "bit already cleared for inode %lu", ino);
197 else {
198 desc = ext2_get_group_desc (sb, block_group, &bh2);
199 if (desc) {
200 desc->bg_free_inodes_count =
201 cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) + 1);
202 if (is_directory)
203 desc->bg_used_dirs_count =
204 cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) - 1);
205 }
206 mark_buffer_dirty(bh2);
207 es->s_free_inodes_count =
208 cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) + 1);
209 mark_buffer_dirty(sb->u.ext2_sb.s_sbh);
210 }
211 mark_buffer_dirty(bh);
212 if (sb->s_flags & MS_SYNCHRONOUS) {
213 ll_rw_block (WRITE, 1, &bh);
214 wait_on_buffer (bh);
215 }
216 sb->s_dirt = 1;
217error_return:
218 unlock_super (sb);
219}
220
221
222
223
224
225
226
227
228
229
230
231
232static int find_group_dir(struct super_block *sb, int parent_group)
233{
234 struct ext2_super_block * es = sb->u.ext2_sb.s_es;
235 int ngroups = sb->u.ext2_sb.s_groups_count;
236 int avefreei = le32_to_cpu(es->s_free_inodes_count) / ngroups;
237 struct ext2_group_desc *desc, *best_desc = NULL;
238 struct buffer_head *bh, *best_bh = NULL;
239 int group, best_group = -1;
240
241 for (group = 0; group < ngroups; group++) {
242 desc = ext2_get_group_desc (sb, group, &bh);
243 if (!desc || !desc->bg_free_inodes_count)
244 continue;
245 if (le16_to_cpu(desc->bg_free_inodes_count) < avefreei)
246 continue;
247 if (!best_desc ||
248 (le16_to_cpu(desc->bg_free_blocks_count) >
249 le16_to_cpu(best_desc->bg_free_blocks_count))) {
250 best_group = group;
251 best_desc = desc;
252 best_bh = bh;
253 }
254 }
255 if (!best_desc)
256 return -1;
257 best_desc->bg_free_inodes_count =
258 cpu_to_le16(le16_to_cpu(best_desc->bg_free_inodes_count) - 1);
259 best_desc->bg_used_dirs_count =
260 cpu_to_le16(le16_to_cpu(best_desc->bg_used_dirs_count) + 1);
261 mark_buffer_dirty(best_bh);
262 return best_group;
263}
264
265static int find_group_other(struct super_block *sb, int parent_group)
266{
267 int ngroups = sb->u.ext2_sb.s_groups_count;
268 struct ext2_group_desc *desc;
269 struct buffer_head *bh;
270 int group, i;
271
272
273
274
275 group = parent_group;
276 desc = ext2_get_group_desc (sb, group, &bh);
277 if (desc && le16_to_cpu(desc->bg_free_inodes_count))
278 goto found;
279
280
281
282
283
284 for (i = 1; i < ngroups; i <<= 1) {
285 group += i;
286 if (group >= ngroups)
287 group -= ngroups;
288 desc = ext2_get_group_desc (sb, group, &bh);
289 if (desc && le16_to_cpu(desc->bg_free_inodes_count))
290 goto found;
291 }
292
293
294
295
296 group = parent_group + 1;
297 for (i = 2; i < ngroups; i++) {
298 if (++group >= ngroups)
299 group = 0;
300 desc = ext2_get_group_desc (sb, group, &bh);
301 if (desc && le16_to_cpu(desc->bg_free_inodes_count))
302 goto found;
303 }
304
305 return -1;
306
307found:
308 desc->bg_free_inodes_count =
309 cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) - 1);
310 mark_buffer_dirty(bh);
311 return group;
312}
313
314struct inode * ext2_new_inode (const struct inode * dir, int mode)
315{
316 struct super_block * sb;
317 struct buffer_head * bh;
318 struct buffer_head * bh2;
319 int group, i;
320 ino_t ino;
321 struct inode * inode;
322 struct ext2_group_desc * desc;
323 struct ext2_super_block * es;
324 int err;
325
326 sb = dir->i_sb;
327 inode = new_inode(sb);
328 if (!inode)
329 return ERR_PTR(-ENOMEM);
330
331 lock_super (sb);
332 es = sb->u.ext2_sb.s_es;
333repeat:
334 if (S_ISDIR(mode))
335 group = find_group_dir(sb, dir->u.ext2_i.i_block_group);
336 else
337 group = find_group_other(sb, dir->u.ext2_i.i_block_group);
338
339 err = -ENOSPC;
340 if (group == -1)
341 goto fail;
342
343 err = -EIO;
344 bh = load_inode_bitmap (sb, group);
345 if (IS_ERR(bh))
346 goto fail2;
347
348 i = ext2_find_first_zero_bit ((unsigned long *) bh->b_data,
349 EXT2_INODES_PER_GROUP(sb));
350 if (i >= EXT2_INODES_PER_GROUP(sb))
351 goto bad_count;
352 ext2_set_bit (i, bh->b_data);
353
354 mark_buffer_dirty(bh);
355 if (sb->s_flags & MS_SYNCHRONOUS) {
356 ll_rw_block (WRITE, 1, &bh);
357 wait_on_buffer (bh);
358 }
359
360 ino = group * EXT2_INODES_PER_GROUP(sb) + i + 1;
361 if (ino < EXT2_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) {
362 ext2_error (sb, "ext2_new_inode",
363 "reserved inode or inode > inodes count - "
364 "block_group = %d,inode=%ld", group, ino);
365 err = -EIO;
366 goto fail2;
367 }
368
369 es->s_free_inodes_count =
370 cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) - 1);
371 mark_buffer_dirty(sb->u.ext2_sb.s_sbh);
372 sb->s_dirt = 1;
373 inode->i_uid = current->fsuid;
374 if (test_opt (sb, GRPID))
375 inode->i_gid = dir->i_gid;
376 else if (dir->i_mode & S_ISGID) {
377 inode->i_gid = dir->i_gid;
378 if (S_ISDIR(mode))
379 mode |= S_ISGID;
380 } else
381 inode->i_gid = current->fsgid;
382 inode->i_mode = mode;
383
384 inode->i_ino = ino;
385 inode->i_blksize = PAGE_SIZE;
386 inode->i_blocks = 0;
387 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
388 inode->u.ext2_i.i_state = EXT2_STATE_NEW;
389 inode->u.ext2_i.i_flags = dir->u.ext2_i.i_flags & ~EXT2_BTREE_FL;
390 if (S_ISLNK(mode))
391 inode->u.ext2_i.i_flags &= ~(EXT2_IMMUTABLE_FL|EXT2_APPEND_FL);
392 inode->u.ext2_i.i_block_group = group;
393 ext2_set_inode_flags(inode);
394 insert_inode_hash(inode);
395 inode->i_generation = event++;
396 mark_inode_dirty(inode);
397
398 unlock_super (sb);
399 if(DQUOT_ALLOC_INODE(inode)) {
400 DQUOT_DROP(inode);
401 inode->i_flags |= S_NOQUOTA;
402 inode->i_nlink = 0;
403 iput(inode);
404 return ERR_PTR(-EDQUOT);
405 }
406 ext2_debug ("allocating inode %lu\n", inode->i_ino);
407 return inode;
408
409fail2:
410 desc = ext2_get_group_desc (sb, group, &bh2);
411 desc->bg_free_inodes_count =
412 cpu_to_le16(le16_to_cpu(desc->bg_free_inodes_count) + 1);
413 if (S_ISDIR(mode))
414 desc->bg_used_dirs_count =
415 cpu_to_le16(le16_to_cpu(desc->bg_used_dirs_count) - 1);
416 mark_buffer_dirty(bh2);
417fail:
418 unlock_super(sb);
419 make_bad_inode(inode);
420 iput(inode);
421 return ERR_PTR(err);
422
423bad_count:
424 ext2_error (sb, "ext2_new_inode",
425 "Free inodes count corrupted in group %d",
426 group);
427
428 err = -ENOSPC;
429 if (sb->s_flags & MS_RDONLY)
430 goto fail;
431
432 desc = ext2_get_group_desc (sb, group, &bh2);
433 desc->bg_free_inodes_count = 0;
434 mark_buffer_dirty(bh2);
435 goto repeat;
436}
437
438unsigned long ext2_count_free_inodes (struct super_block * sb)
439{
440#ifdef EXT2FS_DEBUG
441 struct ext2_super_block * es;
442 unsigned long desc_count = 0, bitmap_count = 0;
443 int i;
444
445 lock_super (sb);
446 es = sb->u.ext2_sb.s_es;
447 for (i = 0; i < sb->u.ext2_sb.s_groups_count; i++) {
448 struct ext2_group_desc *desc = ext2_get_group_desc (sb, i, NULL);
449 struct buffer_head *bh;
450 unsigned x;
451
452 if (!desc)
453 continue;
454 desc_count += le16_to_cpu(desc->bg_free_inodes_count);
455 bh = load_inode_bitmap (sb, i);
456 if (IS_ERR(bh))
457 continue;
458
459 x = ext2_count_free (bh, EXT2_INODES_PER_GROUP(sb) / 8);
460 printk ("group %d: stored = %d, counted = %lu\n",
461 i, le16_to_cpu(desc->bg_free_inodes_count), x);
462 bitmap_count += x;
463 }
464 printk("ext2_count_free_inodes: stored = %lu, computed = %lu, %lu\n",
465 le32_to_cpu(es->s_free_inodes_count), desc_count, bitmap_count);
466 unlock_super (sb);
467 return desc_count;
468#else
469 return le32_to_cpu(sb->u.ext2_sb.s_es->s_free_inodes_count);
470#endif
471}
472
473#ifdef CONFIG_EXT2_CHECK
474
475void ext2_check_inodes_bitmap (struct super_block * sb)
476{
477 struct ext2_super_block * es = sb->u.ext2_sb.s_es;
478 unsigned long desc_count = 0, bitmap_count = 0;
479 int i;
480
481 for (i = 0; i < sb->u.ext2_sb.s_groups_count; i++) {
482 struct ext2_group_desc *desc = ext2_get_group_desc(sb, i, NULL);
483 struct buffer_head *bh;
484 unsigned x;
485
486 if (!desc)
487 continue;
488 desc_count += le16_to_cpu(desc->bg_free_inodes_count);
489 bh = load_inode_bitmap (sb, i);
490 if (IS_ERR(bh))
491 continue;
492
493 x = ext2_count_free (bh, EXT2_INODES_PER_GROUP(sb) / 8);
494 if (le16_to_cpu(desc->bg_free_inodes_count) != x)
495 ext2_error (sb, "ext2_check_inodes_bitmap",
496 "Wrong free inodes count in group %d, "
497 "stored = %d, counted = %lu", i,
498 le16_to_cpu(desc->bg_free_inodes_count), x);
499 bitmap_count += x;
500 }
501 if (le32_to_cpu(es->s_free_inodes_count) != bitmap_count)
502 ext2_error (sb, "ext2_check_inodes_bitmap",
503 "Wrong free inodes count in super block, "
504 "stored = %lu, counted = %lu",
505 (unsigned long)le32_to_cpu(es->s_free_inodes_count),
506 bitmap_count);
507}
508#endif
509