2 * pass1.c -- pass #1 of e2fsck: sequential scan of the inode table
4 * Copyright (C) 1993, 1994, 1995, 1996, 1997 Theodore Ts'o.
7 * This file may be redistributed under the terms of the GNU Public
11 * Pass 1 of e2fsck iterates over all the inodes in the filesystems,
12 * and applies the following tests to each inode:
14 * - The mode field of the inode must be legal.
15 * - The size and block count fields of the inode are correct.
16 * - A data block must not be used by another inode
18 * Pass 1 also gathers the collects the following information:
20 * - A bitmap of which inodes are in use. (inode_used_map)
21 * - A bitmap of which inodes are directories. (inode_dir_map)
22 * - A bitmap of which inodes are regular files. (inode_reg_map)
23 * - A bitmap of which inodes have bad fields. (inode_bad_map)
24 * - A bitmap of which inodes are in bad blocks. (inode_bb_map)
25 * - A bitmap of which inodes are imagic inodes. (inode_imagic_map)
26 * - A bitmap of which blocks are in use. (block_found_map)
27 * - A bitmap of which blocks are in use by two inodes (block_dup_map)
28 * - The data blocks of the directory inodes. (dir_map)
30 * Pass 1 is designed to stash away enough information so that the
31 * other passes should not need to read in the inode information
32 * during the normal course of a filesystem check. (Althogh if an
33 * inconsistency is detected, other passes may need to read in an
36 * Note that pass 1B will be invoked if there are any duplicate blocks
40 #define _GNU_SOURCE 1 /* get strnlen() */
48 #include <ext2fs/ext2_ext_attr.h>
52 #ifdef NO_INLINE_FUNCS
55 #define _INLINE_ inline
58 static int process_block(ext2_filsys fs, blk_t *blocknr,
59 e2_blkcnt_t blockcnt, blk_t ref_blk,
60 int ref_offset, void *priv_data);
61 static int process_bad_block(ext2_filsys fs, blk_t *block_nr,
62 e2_blkcnt_t blockcnt, blk_t ref_blk,
63 int ref_offset, void *priv_data);
64 static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
66 static void mark_table_blocks(e2fsck_t ctx);
67 static void alloc_bb_map(e2fsck_t ctx);
68 static void alloc_imagic_map(e2fsck_t ctx);
69 static void mark_inode_bad(e2fsck_t ctx, ino_t ino);
70 static void handle_fs_bad_blocks(e2fsck_t ctx);
71 static void process_inodes(e2fsck_t ctx, char *block_buf);
72 static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b);
73 static errcode_t scan_callback(ext2_filsys fs, ext2_inode_scan scan,
74 dgrp_t group, void * priv_data);
75 static void adjust_extattr_refcount(e2fsck_t ctx, ext2_refcount_t refcount,
76 char *block_buf, int adjust_sign);
77 /* static char *describe_illegal_block(ext2_filsys fs, blk_t block); */
79 struct process_block_struct {
81 unsigned is_dir:1, is_reg:1, clear:1, suppress:1,
82 fragmented:1, compressed:1, bbcheck:1;
85 e2_blkcnt_t last_block;
86 e2_blkcnt_t last_db_block;
87 int num_illegal_blocks;
89 struct ext2_inode *inode;
90 struct problem_context *pctx;
91 ext2fs_block_bitmap fs_meta_blocks;
95 struct process_inode_block {
97 struct ext2_inode inode;
100 struct scan_callback_struct {
106 * For the inodes to process list.
108 static struct process_inode_block *inodes_to_process;
109 static int process_inode_count;
111 static __u64 ext2_max_sizes[EXT2_MAX_BLOCK_LOG_SIZE -
112 EXT2_MIN_BLOCK_LOG_SIZE + 1];
115 * Free all memory allocated by pass1 in preparation for restarting
118 static void unwind_pass1(ext2_filsys fs EXT2FS_ATTR((unused)))
120 ext2fs_free_mem(&inodes_to_process);
121 inodes_to_process = 0;
125 * Check to make sure a device inode is real. Returns 1 if the device
126 * checks out, 0 if not.
128 * Note: this routine is now also used to check FIFO's and Sockets,
129 * since they have the same requirement; the i_block fields should be
132 int e2fsck_pass1_check_device_inode(ext2_filsys fs EXT2FS_ATTR((unused)),
133 struct ext2_inode *inode)
138 * If the index flag is set, then this is a bogus
141 if (inode->i_flags & EXT2_INDEX_FL)
145 * We should be able to do the test below all the time, but
146 * because the kernel doesn't forcibly clear the device
147 * inode's additional i_block fields, there are some rare
148 * occasions when a legitimate device inode will have non-zero
149 * additional i_block fields. So for now, we only complain
150 * when the immutable flag is set, which should never happen
151 * for devices. (And that's when the problem is caused, since
152 * you can't set or clear immutable flags for devices.) Once
153 * the kernel has been fixed we can change this...
155 if (inode->i_flags & (EXT2_IMMUTABLE_FL | EXT2_APPEND_FL)) {
156 for (i=4; i < EXT2_N_BLOCKS; i++)
157 if (inode->i_block[i])
164 * Check to make sure a symlink inode is real. Returns 1 if the symlink
165 * checks out, 0 if not.
167 int e2fsck_pass1_check_symlink(ext2_filsys fs, ext2_ino_t ino,
168 struct ext2_inode *inode, char *buf)
173 ext2_extent_handle_t handle;
174 struct ext2_extent_info info;
175 struct ext2fs_extent extent;
177 if ((inode->i_size_high || inode->i_size == 0) ||
178 (inode->i_flags & EXT2_INDEX_FL))
181 if (inode->i_flags & EXT4_EXTENTS_FL) {
182 if (inode->i_size > fs->blocksize)
184 if (ext2fs_extent_open2(fs, ino, inode, &handle))
187 if (ext2fs_extent_get_info(handle, &info) ||
188 (info.num_entries != 1) ||
189 (info.max_depth != 0))
191 if (ext2fs_extent_get(handle, EXT2_EXTENT_ROOT, &extent) ||
192 (extent.e_lblk != 0) ||
193 (extent.e_len != 1) ||
194 (extent.e_pblk < fs->super->s_first_data_block) ||
195 (extent.e_pblk >= fs->super->s_blocks_count))
199 ext2fs_extent_free(handle);
203 blocks = ext2fs_inode_data_blocks(fs, inode);
205 if ((inode->i_size >= fs->blocksize) ||
206 (blocks != fs->blocksize >> 9) ||
207 (inode->i_block[0] < fs->super->s_first_data_block) ||
208 (inode->i_block[0] >= fs->super->s_blocks_count))
211 for (i = 1; i < EXT2_N_BLOCKS; i++)
212 if (inode->i_block[i])
215 if (io_channel_read_blk(fs->io, inode->i_block[0], 1, buf))
218 len = strnlen(buf, fs->blocksize);
219 if (len == fs->blocksize)
222 if (inode->i_size >= sizeof(inode->i_block))
225 len = strnlen((char *)inode->i_block, sizeof(inode->i_block));
226 if (len == sizeof(inode->i_block))
229 if (len != inode->i_size)
235 * If the immutable (or append-only) flag is set on the inode, offer
238 #define BAD_SPECIAL_FLAGS (EXT2_IMMUTABLE_FL | EXT2_APPEND_FL)
239 static void check_immutable(e2fsck_t ctx, struct problem_context *pctx)
241 if (!(pctx->inode->i_flags & BAD_SPECIAL_FLAGS))
244 if (!fix_problem(ctx, PR_1_SET_IMMUTABLE, pctx))
247 pctx->inode->i_flags &= ~BAD_SPECIAL_FLAGS;
248 e2fsck_write_inode(ctx, pctx->ino, pctx->inode, "pass1");
252 * If device, fifo or socket, check size is zero -- if not offer to
255 static void check_size(e2fsck_t ctx, struct problem_context *pctx)
257 struct ext2_inode *inode = pctx->inode;
259 if ((inode->i_size == 0) && (inode->i_size_high == 0))
262 if (!fix_problem(ctx, PR_1_SET_NONZSIZE, pctx))
266 inode->i_size_high = 0;
267 e2fsck_write_inode(ctx, pctx->ino, pctx->inode, "pass1");
270 static void check_ea_in_inode(e2fsck_t ctx, struct problem_context *pctx)
272 struct ext2_super_block *sb = ctx->fs->super;
273 struct ext2_inode_large *inode;
274 struct ext2_ext_attr_entry *entry;
276 unsigned int storage_size, remain;
279 inode = (struct ext2_inode_large *) pctx->inode;
280 storage_size = EXT2_INODE_SIZE(ctx->fs->super) - EXT2_GOOD_OLD_INODE_SIZE -
281 inode->i_extra_isize;
282 start = ((char *) inode) + EXT2_GOOD_OLD_INODE_SIZE +
283 inode->i_extra_isize + sizeof(__u32);
284 end = (char *) inode + EXT2_INODE_SIZE(ctx->fs->super);
285 entry = (struct ext2_ext_attr_entry *) start;
287 /* scan all entry's headers first */
289 /* take finish entry 0UL into account */
290 remain = storage_size - sizeof(__u32);
292 while (!EXT2_EXT_IS_LAST_ENTRY(entry)) {
295 /* header eats this space */
296 remain -= sizeof(struct ext2_ext_attr_entry);
298 /* is attribute name valid? */
299 if (EXT2_EXT_ATTR_SIZE(entry->e_name_len) > remain) {
300 pctx->num = entry->e_name_len;
301 problem = PR_1_ATTR_NAME_LEN;
305 /* attribute len eats this space */
306 remain -= EXT2_EXT_ATTR_SIZE(entry->e_name_len);
308 /* check value size */
309 if (entry->e_value_size == 0 || entry->e_value_size > remain) {
310 pctx->num = entry->e_value_size;
311 problem = PR_1_ATTR_VALUE_SIZE;
315 /* e_value_block must be 0 in inode's ea */
316 if (entry->e_value_block != 0) {
317 pctx->num = entry->e_value_block;
318 problem = PR_1_ATTR_VALUE_BLOCK;
322 hash = ext2fs_ext_attr_hash_entry(entry,
323 start + entry->e_value_offs);
325 /* e_hash may be 0 in older inode's ea */
326 if (entry->e_hash != 0 && entry->e_hash != hash) {
327 pctx->num = entry->e_hash;
328 problem = PR_1_ATTR_HASH;
332 remain -= entry->e_value_size;
334 entry = EXT2_EXT_ATTR_NEXT(entry);
338 * it seems like a corruption. it's very unlikely we could repair
339 * EA(s) in automatic fashion -bzzz
341 if (problem == 0 || !fix_problem(ctx, problem, pctx))
344 /* simply remove all possible EA(s) */
345 *((__u32 *)start) = 0UL;
346 e2fsck_write_inode_full(ctx, pctx->ino, pctx->inode,
347 EXT2_INODE_SIZE(sb), "pass1");
350 static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx)
352 struct ext2_super_block *sb = ctx->fs->super;
353 struct ext2_inode_large *inode;
357 inode = (struct ext2_inode_large *) pctx->inode;
358 if (EXT2_INODE_SIZE(sb) == EXT2_GOOD_OLD_INODE_SIZE) {
359 /* this isn't large inode. so, nothing to check */
364 printf("inode #%u, i_extra_size %d\n", pctx->ino,
365 inode->i_extra_isize);
367 /* i_extra_isize must cover i_extra_isize + i_pad1 at least */
368 min = sizeof(inode->i_extra_isize) + sizeof(inode->i_pad1);
369 max = EXT2_INODE_SIZE(sb) - EXT2_GOOD_OLD_INODE_SIZE;
371 * For now we will allow i_extra_isize to be 0, but really
372 * implementations should never allow i_extra_isize to be 0
374 if (inode->i_extra_isize &&
375 (inode->i_extra_isize < min || inode->i_extra_isize > max)) {
376 if (!fix_problem(ctx, PR_1_EXTRA_ISIZE, pctx))
378 inode->i_extra_isize = min;
379 e2fsck_write_inode_full(ctx, pctx->ino, pctx->inode,
380 EXT2_INODE_SIZE(sb), "pass1");
384 eamagic = (__u32 *) (((char *) inode) + EXT2_GOOD_OLD_INODE_SIZE +
385 inode->i_extra_isize);
386 if (*eamagic == EXT2_EXT_ATTR_MAGIC) {
387 /* it seems inode has an extended attribute(s) in body */
388 check_ea_in_inode(ctx, pctx);
393 * Check to see if the inode might really be a directory, despite i_mode
395 * This is a lot of complexity for something for which I'm not really
396 * convinced happens frequently in the wild. If for any reason this
397 * causes any problems, take this code out.
398 * [tytso:20070331.0827EDT]
400 static void check_is_really_dir(e2fsck_t ctx, struct problem_context *pctx,
403 struct ext2_inode *inode = pctx->inode;
404 struct ext2_dir_entry *dirent;
408 blk64_t first_dir_blk;
409 unsigned int i, rec_len, not_device = 0;
413 * If the mode looks OK, we believe it. If the first block in
414 * the i_block array is 0, this cannot be a directory. If the
415 * inode is extent-mapped, it is still the case that the latter
416 * cannot be 0 - the magic number in the extent header would make
419 if (LINUX_S_ISDIR(inode->i_mode) || LINUX_S_ISREG(inode->i_mode) ||
420 LINUX_S_ISLNK(inode->i_mode) || inode->i_block[0] == 0)
424 * Check the block numbers in the i_block array for validity:
425 * zero blocks are skipped (but the first one cannot be zero -
426 * see above), other blocks are checked against the first and
427 * max data blocks (from the the superblock) and against the
428 * block bitmap. Any invalid block found means this cannot be
431 * If there are non-zero blocks past the fourth entry, then
432 * this cannot be a device file: we remember that for the next
435 * For extent mapped files, we don't do any sanity checking:
436 * just try to get the phys block of logical block 0 and run
440 extent_fs = (ctx->fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS);
441 if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) {
443 if (ext2fs_bmap(ctx->fs, pctx->ino, inode, 0, 0, 0,
446 /* device files are never extent mapped */
449 for (i=0; i < EXT2_N_BLOCKS; i++) {
450 blk = inode->i_block[i];
456 if (blk < ctx->fs->super->s_first_data_block ||
457 blk >= ctx->fs->super->s_blocks_count ||
458 ext2fs_fast_test_block_bitmap(ctx->block_found_map,
460 return; /* Invalid block, can't be dir */
462 blk = inode->i_block[0];
466 * If the mode says this is a device file and the i_links_count field
467 * is sane and we have not ruled it out as a device file previously,
468 * we declare it a device file, not a directory.
470 if ((LINUX_S_ISCHR(inode->i_mode) || LINUX_S_ISBLK(inode->i_mode)) &&
471 (inode->i_links_count == 1) && !not_device)
474 /* read the first block */
475 old_op = ehandler_operation(_("reading directory block"));
476 retval = ext2fs_read_dir_block(ctx->fs, blk, buf);
477 ehandler_operation(0);
481 dirent = (struct ext2_dir_entry *) buf;
482 retval = ext2fs_get_rec_len(ctx->fs, dirent, &rec_len);
485 if (((dirent->name_len & 0xFF) != 1) ||
486 (dirent->name[0] != '.') ||
487 (dirent->inode != pctx->ino) ||
490 (rec_len >= ctx->fs->blocksize - 12))
493 dirent = (struct ext2_dir_entry *) (buf + rec_len);
494 retval = ext2fs_get_rec_len(ctx->fs, dirent, &rec_len);
497 if (((dirent->name_len & 0xFF) != 2) ||
498 (dirent->name[0] != '.') ||
499 (dirent->name[1] != '.') ||
504 if (fix_problem(ctx, PR_1_TREAT_AS_DIRECTORY, pctx)) {
505 inode->i_mode = (inode->i_mode & 07777) | LINUX_S_IFDIR;
506 e2fsck_write_inode_full(ctx, pctx->ino, inode,
507 EXT2_INODE_SIZE(ctx->fs->super),
508 "check_is_really_dir");
512 extern void e2fsck_setup_tdb_icount(e2fsck_t ctx, int flags,
515 unsigned int threshold;
523 profile_get_string(ctx->profile, "scratch_files", "directory", 0, 0,
525 profile_get_uint(ctx->profile, "scratch_files",
526 "numdirs_threshold", 0, 0, &threshold);
527 profile_get_boolean(ctx->profile, "scratch_files",
528 "icount", 0, 1, &enable);
530 retval = ext2fs_get_num_dirs(ctx->fs, &num_dirs);
532 num_dirs = 1024; /* Guess */
534 if (!enable || !tdb_dir || access(tdb_dir, W_OK) ||
535 (threshold && num_dirs <= threshold))
538 retval = ext2fs_create_icount_tdb(ctx->fs, tdb_dir, flags, ret);
543 void e2fsck_pass1(e2fsck_t ctx)
547 ext2_filsys fs = ctx->fs;
549 struct ext2_inode *inode;
550 ext2_inode_scan scan;
552 #ifdef RESOURCE_TRACK
553 struct resource_track rtrack;
555 unsigned char frag, fsize;
556 struct problem_context pctx;
557 struct scan_callback_struct scan_struct;
558 struct ext2_super_block *sb = ctx->fs->super;
560 int imagic_fs, extent_fs;
561 int busted_fs_time = 0;
564 init_resource_track(&rtrack, ctx->fs->io);
565 clear_problem_context(&pctx);
567 if (!(ctx->options & E2F_OPT_PREEN))
568 fix_problem(ctx, PR_1_PASS_HEADER, &pctx);
570 if ((fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_DIR_INDEX) &&
571 !(ctx->options & E2F_OPT_NO)) {
572 if (ext2fs_u32_list_create(&ctx->dirs_to_hash, 50))
573 ctx->dirs_to_hash = 0;
577 mtrace_print("Pass 1");
580 #define EXT2_BPP(bits) (1ULL << ((bits) - 2))
582 for (i = EXT2_MIN_BLOCK_LOG_SIZE; i <= EXT2_MAX_BLOCK_LOG_SIZE; i++) {
583 max_sizes = EXT2_NDIR_BLOCKS + EXT2_BPP(i);
584 max_sizes = max_sizes + EXT2_BPP(i) * EXT2_BPP(i);
585 max_sizes = max_sizes + EXT2_BPP(i) * EXT2_BPP(i) * EXT2_BPP(i);
586 max_sizes = (max_sizes * (1UL << i)) - 1;
587 ext2_max_sizes[i - EXT2_MIN_BLOCK_LOG_SIZE] = max_sizes;
591 imagic_fs = (sb->s_feature_compat & EXT2_FEATURE_COMPAT_IMAGIC_INODES);
592 extent_fs = (sb->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS);
595 * Allocate bitmaps structures
597 pctx.errcode = ext2fs_allocate_inode_bitmap(fs, _("in-use inode map"),
598 &ctx->inode_used_map);
601 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
602 ctx->flags |= E2F_FLAG_ABORT;
605 pctx.errcode = ext2fs_allocate_inode_bitmap(fs,
606 _("directory inode map"), &ctx->inode_dir_map);
609 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
610 ctx->flags |= E2F_FLAG_ABORT;
613 pctx.errcode = ext2fs_allocate_inode_bitmap(fs,
614 _("regular file inode map"), &ctx->inode_reg_map);
617 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
618 ctx->flags |= E2F_FLAG_ABORT;
621 pctx.errcode = ext2fs_allocate_block_bitmap(fs, _("in-use block map"),
622 &ctx->block_found_map);
625 fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, &pctx);
626 ctx->flags |= E2F_FLAG_ABORT;
629 e2fsck_setup_tdb_icount(ctx, 0, &ctx->inode_link_info);
630 if (!ctx->inode_link_info)
631 pctx.errcode = ext2fs_create_icount2(fs, 0, 0, 0,
632 &ctx->inode_link_info);
634 fix_problem(ctx, PR_1_ALLOCATE_ICOUNT, &pctx);
635 ctx->flags |= E2F_FLAG_ABORT;
638 inode_size = EXT2_INODE_SIZE(fs->super);
639 inode = (struct ext2_inode *)
640 e2fsck_allocate_memory(ctx, inode_size, "scratch inode");
642 inodes_to_process = (struct process_inode_block *)
643 e2fsck_allocate_memory(ctx,
644 (ctx->process_inode_size *
645 sizeof(struct process_inode_block)),
646 "array of inodes to process");
647 process_inode_count = 0;
649 pctx.errcode = ext2fs_init_dblist(fs, 0);
651 fix_problem(ctx, PR_1_ALLOCATE_DBCOUNT, &pctx);
652 ctx->flags |= E2F_FLAG_ABORT;
653 ext2fs_free_mem(&inode);
658 * If the last orphan field is set, clear it, since the pass1
659 * processing will automatically find and clear the orphans.
660 * In the future, we may want to try using the last_orphan
661 * linked list ourselves, but for now, we clear it so that the
662 * ext3 mount code won't get confused.
664 if (!(ctx->options & E2F_OPT_READONLY)) {
665 if (fs->super->s_last_orphan) {
666 fs->super->s_last_orphan = 0;
667 ext2fs_mark_super_dirty(fs);
671 mark_table_blocks(ctx);
672 block_buf = (char *) e2fsck_allocate_memory(ctx, fs->blocksize * 3,
673 "block interate buffer");
674 e2fsck_use_inode_shortcuts(ctx, 1);
675 old_op = ehandler_operation(_("opening inode scan"));
676 pctx.errcode = ext2fs_open_inode_scan(fs, ctx->inode_buffer_blocks,
678 ehandler_operation(old_op);
680 fix_problem(ctx, PR_1_ISCAN_ERROR, &pctx);
681 ctx->flags |= E2F_FLAG_ABORT;
682 ext2fs_free_mem(&block_buf);
683 ext2fs_free_mem(&inode);
686 ext2fs_inode_scan_flags(scan, EXT2_SF_SKIP_MISSING_ITABLE, 0);
687 ctx->stashed_inode = inode;
688 scan_struct.ctx = ctx;
689 scan_struct.block_buf = block_buf;
690 ext2fs_set_inode_callback(scan, scan_callback, &scan_struct);
692 if ((ctx->progress)(ctx, 1, 0, ctx->fs->group_desc_count))
694 if ((fs->super->s_wtime < fs->super->s_inodes_count) ||
695 (fs->super->s_mtime < fs->super->s_inodes_count))
699 old_op = ehandler_operation(_("getting next inode from scan"));
700 pctx.errcode = ext2fs_get_next_inode_full(scan, &ino,
702 ehandler_operation(old_op);
703 if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
705 if (pctx.errcode == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE) {
706 if (!ctx->inode_bb_map)
708 ext2fs_mark_inode_bitmap(ctx->inode_bb_map, ino);
709 ext2fs_mark_inode_bitmap(ctx->inode_used_map, ino);
713 fix_problem(ctx, PR_1_ISCAN_ERROR, &pctx);
714 ctx->flags |= E2F_FLAG_ABORT;
721 ctx->stashed_ino = ino;
722 if (inode->i_links_count) {
723 pctx.errcode = ext2fs_icount_store(ctx->inode_link_info,
724 ino, inode->i_links_count);
726 pctx.num = inode->i_links_count;
727 fix_problem(ctx, PR_1_ICOUNT_STORE, &pctx);
728 ctx->flags |= E2F_FLAG_ABORT;
734 * Test for incorrect extent flag settings.
736 * On big-endian machines we must be careful:
737 * When the inode is read, the i_block array is not swapped
738 * if the extent flag is set. Therefore if we are testing
739 * for or fixing a wrongly-set flag, we must potentially
740 * (un)swap before testing, or after fixing.
744 * In this case the extents flag was set when read, so
745 * extent_header_verify is ok. If the inode is cleared,
746 * no need to swap... so no extra swapping here.
748 if ((inode->i_flags & EXT4_EXTENTS_FL) && !extent_fs &&
749 (inode->i_links_count || (ino == EXT2_BAD_INO) ||
750 (ino == EXT2_ROOT_INO) || (ino == EXT2_JOURNAL_INO))) {
751 if ((ext2fs_extent_header_verify(inode->i_block,
752 sizeof(inode->i_block)) == 0) &&
753 fix_problem(ctx, PR_1_EXTENT_FEATURE, &pctx)) {
754 sb->s_feature_incompat |= EXT3_FEATURE_INCOMPAT_EXTENTS;
755 ext2fs_mark_super_dirty(fs);
757 } else if (fix_problem(ctx, PR_1_EXTENTS_SET, &pctx)) {
759 e2fsck_clear_inode(ctx, ino, inode, 0, "pass1");
760 if (ino == EXT2_BAD_INO)
761 ext2fs_mark_inode_bitmap(ctx->inode_used_map,
768 * For big-endian machines:
769 * If the inode didn't have the extents flag set when it
770 * was read, then the i_blocks array was swapped. To test
771 * as an extents header, we must swap it back first.
772 * IF we then set the extents flag, the entire i_block
773 * array must be un/re-swapped to make it proper extents data.
775 if (extent_fs && !(inode->i_flags & EXT4_EXTENTS_FL) &&
776 (inode->i_links_count || (ino == EXT2_BAD_INO) ||
777 (ino == EXT2_ROOT_INO) || (ino == EXT2_JOURNAL_INO)) &&
778 (LINUX_S_ISREG(inode->i_mode) ||
779 LINUX_S_ISDIR(inode->i_mode))) {
781 #ifdef WORDS_BIGENDIAN
782 __u32 tmp_block[EXT2_N_BLOCKS];
784 for (i = 0; i < EXT2_N_BLOCKS; i++)
785 tmp_block[i] = ext2fs_swab32(inode->i_block[i]);
788 ehp = inode->i_block;
790 if ((ext2fs_extent_header_verify(ehp,
791 sizeof(inode->i_block)) == 0) &&
792 (fix_problem(ctx, PR_1_UNSET_EXTENT_FL, &pctx))) {
793 inode->i_flags |= EXT4_EXTENTS_FL;
794 #ifdef WORDS_BIGENDIAN
795 memcpy(inode->i_block, tmp_block,
796 sizeof(inode->i_block));
798 e2fsck_write_inode(ctx, ino, inode, "pass1");
802 if (ino == EXT2_BAD_INO) {
803 struct process_block_struct pb;
805 pctx.errcode = ext2fs_copy_bitmap(ctx->block_found_map,
809 fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, &pctx);
810 ctx->flags |= E2F_FLAG_ABORT;
813 pb.ino = EXT2_BAD_INO;
814 pb.num_blocks = pb.last_block = 0;
815 pb.last_db_block = -1;
816 pb.num_illegal_blocks = 0;
817 pb.suppress = 0; pb.clear = 0; pb.is_dir = 0;
818 pb.is_reg = 0; pb.fragmented = 0; pb.bbcheck = 0;
822 pctx.errcode = ext2fs_block_iterate2(fs, ino, 0,
823 block_buf, process_bad_block, &pb);
824 ext2fs_free_block_bitmap(pb.fs_meta_blocks);
826 fix_problem(ctx, PR_1_BLOCK_ITERATE, &pctx);
827 ctx->flags |= E2F_FLAG_ABORT;
831 if (!fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK_PROMPT, &pctx)) {
832 ctx->flags |= E2F_FLAG_ABORT;
835 ext2fs_mark_inode_bitmap(ctx->inode_used_map, ino);
836 clear_problem_context(&pctx);
838 } else if (ino == EXT2_ROOT_INO) {
840 * Make sure the root inode is a directory; if
841 * not, offer to clear it. It will be
842 * regnerated in pass #3.
844 if (!LINUX_S_ISDIR(inode->i_mode)) {
845 if (fix_problem(ctx, PR_1_ROOT_NO_DIR, &pctx))
849 * If dtime is set, offer to clear it. mke2fs
850 * version 0.2b created filesystems with the
851 * dtime field set for the root and lost+found
852 * directories. We won't worry about
853 * /lost+found, since that can be regenerated
854 * easily. But we will fix the root directory
857 if (inode->i_dtime && inode->i_links_count) {
858 if (fix_problem(ctx, PR_1_ROOT_DTIME, &pctx)) {
860 e2fsck_write_inode(ctx, ino, inode,
864 } else if (ino == EXT2_JOURNAL_INO) {
865 ext2fs_mark_inode_bitmap(ctx->inode_used_map, ino);
866 if (fs->super->s_journal_inum == EXT2_JOURNAL_INO) {
867 if (!LINUX_S_ISREG(inode->i_mode) &&
868 fix_problem(ctx, PR_1_JOURNAL_BAD_MODE,
870 inode->i_mode = LINUX_S_IFREG;
871 e2fsck_write_inode(ctx, ino, inode,
874 check_blocks(ctx, &pctx, block_buf);
877 if ((inode->i_links_count || inode->i_blocks ||
878 inode->i_blocks || inode->i_block[0]) &&
879 fix_problem(ctx, PR_1_JOURNAL_INODE_NOT_CLEAR,
881 memset(inode, 0, inode_size);
882 ext2fs_icount_store(ctx->inode_link_info,
884 e2fsck_write_inode_full(ctx, ino, inode,
885 inode_size, "pass1");
887 } else if (ino < EXT2_FIRST_INODE(fs->super)) {
890 ext2fs_mark_inode_bitmap(ctx->inode_used_map, ino);
891 if (ino == EXT2_BOOT_LOADER_INO) {
892 if (LINUX_S_ISDIR(inode->i_mode))
893 problem = PR_1_RESERVED_BAD_MODE;
894 } else if (ino == EXT2_RESIZE_INO) {
896 !LINUX_S_ISREG(inode->i_mode))
897 problem = PR_1_RESERVED_BAD_MODE;
899 if (inode->i_mode != 0)
900 problem = PR_1_RESERVED_BAD_MODE;
903 if (fix_problem(ctx, problem, &pctx)) {
905 e2fsck_write_inode(ctx, ino, inode,
909 check_blocks(ctx, &pctx, block_buf);
913 * Check for inodes who might have been part of the
914 * orphaned list linked list. They should have gotten
915 * dealt with by now, unless the list had somehow been
918 * FIXME: In the future, inodes which are still in use
919 * (and which are therefore) pending truncation should
920 * be handled specially. Right now we just clear the
921 * dtime field, and the normal e2fsck handling of
922 * inodes where i_size and the inode blocks are
923 * inconsistent is to fix i_size, instead of releasing
924 * the extra blocks. This won't catch the inodes that
925 * was at the end of the orphan list, but it's better
926 * than nothing. The right answer is that there
927 * shouldn't be any bugs in the orphan list handling. :-)
929 if (inode->i_dtime && !busted_fs_time &&
930 inode->i_dtime < ctx->fs->super->s_inodes_count) {
931 if (fix_problem(ctx, PR_1_LOW_DTIME, &pctx)) {
932 inode->i_dtime = inode->i_links_count ?
934 e2fsck_write_inode(ctx, ino, inode,
940 * This code assumes that deleted inodes have
941 * i_links_count set to 0.
943 if (!inode->i_links_count) {
944 if (!inode->i_dtime && inode->i_mode) {
946 PR_1_ZERO_DTIME, &pctx)) {
947 inode->i_dtime = ctx->now;
948 e2fsck_write_inode(ctx, ino, inode,
955 * n.b. 0.3c ext2fs code didn't clear i_links_count for
956 * deleted files. Oops.
958 * Since all new ext2 implementations get this right,
959 * we now assume that the case of non-zero
960 * i_links_count and non-zero dtime means that we
961 * should keep the file, not delete it.
964 if (inode->i_dtime) {
965 if (fix_problem(ctx, PR_1_SET_DTIME, &pctx)) {
967 e2fsck_write_inode(ctx, ino, inode, "pass1");
971 ext2fs_mark_inode_bitmap(ctx->inode_used_map, ino);
972 switch (fs->super->s_creator_os) {
974 frag = inode->osd2.hurd2.h_i_frag;
975 fsize = inode->osd2.hurd2.h_i_fsize;
981 if (inode->i_faddr || frag || fsize ||
982 (LINUX_S_ISDIR(inode->i_mode) && inode->i_dir_acl))
983 mark_inode_bad(ctx, ino);
984 if (!(fs->super->s_feature_incompat &
985 EXT4_FEATURE_INCOMPAT_64BIT) &&
986 inode->osd2.linux2.l_i_file_acl_high != 0)
987 mark_inode_bad(ctx, ino);
988 if ((fs->super->s_creator_os == EXT2_OS_LINUX) &&
989 !(fs->super->s_feature_ro_compat &
990 EXT4_FEATURE_RO_COMPAT_HUGE_FILE) &&
991 (inode->osd2.linux2.l_i_blocks_hi != 0))
992 mark_inode_bad(ctx, ino);
993 if (inode->i_flags & EXT2_IMAGIC_FL) {
995 if (!ctx->inode_imagic_map)
996 alloc_imagic_map(ctx);
997 ext2fs_mark_inode_bitmap(ctx->inode_imagic_map,
1000 if (fix_problem(ctx, PR_1_SET_IMAGIC, &pctx)) {
1001 inode->i_flags &= ~EXT2_IMAGIC_FL;
1002 e2fsck_write_inode(ctx, ino,
1008 check_inode_extra_space(ctx, &pctx);
1009 check_is_really_dir(ctx, &pctx, block_buf);
1012 * ext2fs_inode_has_valid_blocks does not actually look
1013 * at i_block[] values, so not endian-sensitive here.
1015 if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL) &&
1016 LINUX_S_ISLNK(inode->i_mode) &&
1017 !ext2fs_inode_has_valid_blocks(inode) &&
1018 fix_problem(ctx, PR_1_FAST_SYMLINK_EXTENT_FL, &pctx)) {
1019 inode->i_flags &= ~EXT4_EXTENTS_FL;
1020 e2fsck_write_inode(ctx, ino, inode, "pass1");
1023 if (LINUX_S_ISDIR(inode->i_mode)) {
1024 ext2fs_mark_inode_bitmap(ctx->inode_dir_map, ino);
1025 e2fsck_add_dir_info(ctx, ino, 0);
1026 ctx->fs_directory_count++;
1027 } else if (LINUX_S_ISREG (inode->i_mode)) {
1028 ext2fs_mark_inode_bitmap(ctx->inode_reg_map, ino);
1029 ctx->fs_regular_count++;
1030 } else if (LINUX_S_ISCHR (inode->i_mode) &&
1031 e2fsck_pass1_check_device_inode(fs, inode)) {
1032 check_immutable(ctx, &pctx);
1033 check_size(ctx, &pctx);
1034 ctx->fs_chardev_count++;
1035 } else if (LINUX_S_ISBLK (inode->i_mode) &&
1036 e2fsck_pass1_check_device_inode(fs, inode)) {
1037 check_immutable(ctx, &pctx);
1038 check_size(ctx, &pctx);
1039 ctx->fs_blockdev_count++;
1040 } else if (LINUX_S_ISLNK (inode->i_mode) &&
1041 e2fsck_pass1_check_symlink(fs, ino, inode,
1043 check_immutable(ctx, &pctx);
1044 ctx->fs_symlinks_count++;
1045 if (ext2fs_inode_data_blocks(fs, inode) == 0) {
1046 ctx->fs_fast_symlinks_count++;
1047 check_blocks(ctx, &pctx, block_buf);
1051 else if (LINUX_S_ISFIFO (inode->i_mode) &&
1052 e2fsck_pass1_check_device_inode(fs, inode)) {
1053 check_immutable(ctx, &pctx);
1054 check_size(ctx, &pctx);
1055 ctx->fs_fifo_count++;
1056 } else if ((LINUX_S_ISSOCK (inode->i_mode)) &&
1057 e2fsck_pass1_check_device_inode(fs, inode)) {
1058 check_immutable(ctx, &pctx);
1059 check_size(ctx, &pctx);
1060 ctx->fs_sockets_count++;
1062 mark_inode_bad(ctx, ino);
1063 if (!(inode->i_flags & EXT4_EXTENTS_FL)) {
1064 if (inode->i_block[EXT2_IND_BLOCK])
1065 ctx->fs_ind_count++;
1066 if (inode->i_block[EXT2_DIND_BLOCK])
1067 ctx->fs_dind_count++;
1068 if (inode->i_block[EXT2_TIND_BLOCK])
1069 ctx->fs_tind_count++;
1071 if (!(inode->i_flags & EXT4_EXTENTS_FL) &&
1072 (inode->i_block[EXT2_IND_BLOCK] ||
1073 inode->i_block[EXT2_DIND_BLOCK] ||
1074 inode->i_block[EXT2_TIND_BLOCK] ||
1075 inode->i_file_acl)) {
1076 inodes_to_process[process_inode_count].ino = ino;
1077 inodes_to_process[process_inode_count].inode = *inode;
1078 process_inode_count++;
1080 check_blocks(ctx, &pctx, block_buf);
1082 if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
1085 if (process_inode_count >= ctx->process_inode_size) {
1086 process_inodes(ctx, block_buf);
1088 if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
1092 process_inodes(ctx, block_buf);
1093 ext2fs_close_inode_scan(scan);
1096 * If any extended attribute blocks' reference counts need to
1097 * be adjusted, either up (ctx->refcount_extra), or down
1098 * (ctx->refcount), then fix them.
1100 if (ctx->refcount) {
1101 adjust_extattr_refcount(ctx, ctx->refcount, block_buf, -1);
1102 ea_refcount_free(ctx->refcount);
1105 if (ctx->refcount_extra) {
1106 adjust_extattr_refcount(ctx, ctx->refcount_extra,
1108 ea_refcount_free(ctx->refcount_extra);
1109 ctx->refcount_extra = 0;
1112 if (ctx->invalid_bitmaps)
1113 handle_fs_bad_blocks(ctx);
1115 /* We don't need the block_ea_map any more */
1116 if (ctx->block_ea_map) {
1117 ext2fs_free_block_bitmap(ctx->block_ea_map);
1118 ctx->block_ea_map = 0;
1121 if (ctx->flags & E2F_FLAG_RESIZE_INODE) {
1122 ext2fs_block_bitmap save_bmap;
1124 save_bmap = fs->block_map;
1125 fs->block_map = ctx->block_found_map;
1126 clear_problem_context(&pctx);
1127 pctx.errcode = ext2fs_create_resize_inode(fs);
1129 fix_problem(ctx, PR_1_RESIZE_INODE_CREATE, &pctx);
1130 /* Should never get here */
1131 ctx->flags |= E2F_FLAG_ABORT;
1134 e2fsck_read_inode(ctx, EXT2_RESIZE_INO, inode,
1136 inode->i_mtime = ctx->now;
1137 e2fsck_write_inode(ctx, EXT2_RESIZE_INO, inode,
1139 fs->block_map = save_bmap;
1140 ctx->flags &= ~E2F_FLAG_RESIZE_INODE;
1143 if (ctx->flags & E2F_FLAG_RESTART) {
1145 * Only the master copy of the superblock and block
1146 * group descriptors are going to be written during a
1147 * restart, so set the superblock to be used to be the
1148 * master superblock.
1150 ctx->use_superblock = 0;
1155 if (ctx->block_dup_map) {
1156 if (ctx->options & E2F_OPT_PREEN) {
1157 clear_problem_context(&pctx);
1158 fix_problem(ctx, PR_1_DUP_BLOCKS_PREENSTOP, &pctx);
1160 e2fsck_pass1_dupblocks(ctx, block_buf);
1162 ext2fs_free_mem(&inodes_to_process);
1164 e2fsck_use_inode_shortcuts(ctx, 0);
1166 ext2fs_free_mem(&block_buf);
1167 ext2fs_free_mem(&inode);
1169 print_resource_track(ctx, _("Pass 1"), &rtrack, ctx->fs->io);
1173 * When the inode_scan routines call this callback at the end of the
1174 * glock group, call process_inodes.
1176 static errcode_t scan_callback(ext2_filsys fs,
1177 ext2_inode_scan scan EXT2FS_ATTR((unused)),
1178 dgrp_t group, void * priv_data)
1180 struct scan_callback_struct *scan_struct;
1183 scan_struct = (struct scan_callback_struct *) priv_data;
1184 ctx = scan_struct->ctx;
1186 process_inodes((e2fsck_t) fs->priv_data, scan_struct->block_buf);
1189 if ((ctx->progress)(ctx, 1, group+1,
1190 ctx->fs->group_desc_count))
1191 return EXT2_ET_CANCEL_REQUESTED;
1197 * Process the inodes in the "inodes to process" list.
1199 static void process_inodes(e2fsck_t ctx, char *block_buf)
1202 struct ext2_inode *old_stashed_inode;
1203 ext2_ino_t old_stashed_ino;
1204 const char *old_operation;
1206 struct problem_context pctx;
1209 printf("begin process_inodes: ");
1211 if (process_inode_count == 0)
1213 old_operation = ehandler_operation(0);
1214 old_stashed_inode = ctx->stashed_inode;
1215 old_stashed_ino = ctx->stashed_ino;
1216 qsort(inodes_to_process, process_inode_count,
1217 sizeof(struct process_inode_block), process_inode_cmp);
1218 clear_problem_context(&pctx);
1219 for (i=0; i < process_inode_count; i++) {
1220 pctx.inode = ctx->stashed_inode = &inodes_to_process[i].inode;
1221 pctx.ino = ctx->stashed_ino = inodes_to_process[i].ino;
1224 printf("%u ", pctx.ino);
1226 sprintf(buf, _("reading indirect blocks of inode %u"),
1228 ehandler_operation(buf);
1229 check_blocks(ctx, &pctx, block_buf);
1230 if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
1233 ctx->stashed_inode = old_stashed_inode;
1234 ctx->stashed_ino = old_stashed_ino;
1235 process_inode_count = 0;
1237 printf("end process inodes\n");
1239 ehandler_operation(old_operation);
1242 static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b)
1244 const struct process_inode_block *ib_a =
1245 (const struct process_inode_block *) a;
1246 const struct process_inode_block *ib_b =
1247 (const struct process_inode_block *) b;
1250 ret = (ib_a->inode.i_block[EXT2_IND_BLOCK] -
1251 ib_b->inode.i_block[EXT2_IND_BLOCK]);
1253 ret = ib_a->inode.i_file_acl - ib_b->inode.i_file_acl;
1255 ret = ib_a->ino - ib_b->ino;
1260 * Mark an inode as being bad in some what
1262 static void mark_inode_bad(e2fsck_t ctx, ino_t ino)
1264 struct problem_context pctx;
1266 if (!ctx->inode_bad_map) {
1267 clear_problem_context(&pctx);
1269 pctx.errcode = ext2fs_allocate_inode_bitmap(ctx->fs,
1270 _("bad inode map"), &ctx->inode_bad_map);
1273 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
1274 /* Should never get here */
1275 ctx->flags |= E2F_FLAG_ABORT;
1279 ext2fs_mark_inode_bitmap(ctx->inode_bad_map, ino);
1284 * This procedure will allocate the inode "bb" (badblock) map table
1286 static void alloc_bb_map(e2fsck_t ctx)
1288 struct problem_context pctx;
1290 clear_problem_context(&pctx);
1291 pctx.errcode = ext2fs_allocate_inode_bitmap(ctx->fs,
1292 _("inode in bad block map"),
1293 &ctx->inode_bb_map);
1296 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
1297 /* Should never get here */
1298 ctx->flags |= E2F_FLAG_ABORT;
1304 * This procedure will allocate the inode imagic table
1306 static void alloc_imagic_map(e2fsck_t ctx)
1308 struct problem_context pctx;
1310 clear_problem_context(&pctx);
1311 pctx.errcode = ext2fs_allocate_inode_bitmap(ctx->fs,
1312 _("imagic inode map"),
1313 &ctx->inode_imagic_map);
1316 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx);
1317 /* Should never get here */
1318 ctx->flags |= E2F_FLAG_ABORT;
1324 * Marks a block as in use, setting the dup_map if it's been set
1325 * already. Called by process_block and process_bad_block.
1327 * WARNING: Assumes checks have already been done to make sure block
1328 * is valid. This is true in both process_block and process_bad_block.
1330 static _INLINE_ void mark_block_used(e2fsck_t ctx, blk_t block)
1332 struct problem_context pctx;
1334 clear_problem_context(&pctx);
1336 if (ext2fs_fast_test_block_bitmap(ctx->block_found_map, block)) {
1337 if (!ctx->block_dup_map) {
1338 pctx.errcode = ext2fs_allocate_block_bitmap(ctx->fs,
1339 _("multiply claimed block map"),
1340 &ctx->block_dup_map);
1343 fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR,
1345 /* Should never get here */
1346 ctx->flags |= E2F_FLAG_ABORT;
1350 ext2fs_fast_mark_block_bitmap(ctx->block_dup_map, block);
1352 ext2fs_fast_mark_block_bitmap(ctx->block_found_map, block);
1357 * Adjust the extended attribute block's reference counts at the end
1358 * of pass 1, either by subtracting out references for EA blocks that
1359 * are still referenced in ctx->refcount, or by adding references for
1360 * EA blocks that had extra references as accounted for in
1361 * ctx->refcount_extra.
1363 static void adjust_extattr_refcount(e2fsck_t ctx, ext2_refcount_t refcount,
1364 char *block_buf, int adjust_sign)
1366 struct ext2_ext_attr_header *header;
1367 struct problem_context pctx;
1368 ext2_filsys fs = ctx->fs;
1373 clear_problem_context(&pctx);
1375 ea_refcount_intr_begin(refcount);
1377 if ((blk = ea_refcount_intr_next(refcount, &count)) == 0)
1380 pctx.errcode = ext2fs_read_ext_attr(fs, blk, block_buf);
1382 fix_problem(ctx, PR_1_EXTATTR_READ_ABORT, &pctx);
1385 header = (struct ext2_ext_attr_header *) block_buf;
1386 pctx.blkcount = header->h_refcount;
1387 should_be = header->h_refcount + adjust_sign * count;
1388 pctx.num = should_be;
1389 if (fix_problem(ctx, PR_1_EXTATTR_REFCOUNT, &pctx)) {
1390 header->h_refcount = should_be;
1391 pctx.errcode = ext2fs_write_ext_attr(fs, blk,
1394 fix_problem(ctx, PR_1_EXTATTR_WRITE, &pctx);
1402 * Handle processing the extended attribute blocks
1404 static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx,
1407 ext2_filsys fs = ctx->fs;
1408 ext2_ino_t ino = pctx->ino;
1409 struct ext2_inode *inode = pctx->inode;
1412 struct ext2_ext_attr_header *header;
1413 struct ext2_ext_attr_entry *entry;
1415 region_t region = 0;
1417 blk = inode->i_file_acl;
1422 * If the Extended attribute flag isn't set, then a non-zero
1423 * file acl means that the inode is corrupted.
1425 * Or if the extended attribute block is an invalid block,
1426 * then the inode is also corrupted.
1428 if (!(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_EXT_ATTR) ||
1429 (blk < fs->super->s_first_data_block) ||
1430 (blk >= fs->super->s_blocks_count)) {
1431 mark_inode_bad(ctx, ino);
1435 /* If ea bitmap hasn't been allocated, create it */
1436 if (!ctx->block_ea_map) {
1437 pctx->errcode = ext2fs_allocate_block_bitmap(fs,
1438 _("ext attr block map"),
1439 &ctx->block_ea_map);
1440 if (pctx->errcode) {
1442 fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, pctx);
1443 ctx->flags |= E2F_FLAG_ABORT;
1448 /* Create the EA refcount structure if necessary */
1449 if (!ctx->refcount) {
1450 pctx->errcode = ea_refcount_create(0, &ctx->refcount);
1451 if (pctx->errcode) {
1453 fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
1454 ctx->flags |= E2F_FLAG_ABORT;
1460 /* Debugging text */
1461 printf("Inode %u has EA block %u\n", ino, blk);
1464 /* Have we seen this EA block before? */
1465 if (ext2fs_fast_test_block_bitmap(ctx->block_ea_map, blk)) {
1466 if (ea_refcount_decrement(ctx->refcount, blk, 0) == 0)
1468 /* Ooops, this EA was referenced more than it stated */
1469 if (!ctx->refcount_extra) {
1470 pctx->errcode = ea_refcount_create(0,
1471 &ctx->refcount_extra);
1472 if (pctx->errcode) {
1474 fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx);
1475 ctx->flags |= E2F_FLAG_ABORT;
1479 ea_refcount_increment(ctx->refcount_extra, blk, 0);
1484 * OK, we haven't seen this EA block yet. So we need to
1488 pctx->errcode = ext2fs_read_ext_attr(fs, blk, block_buf);
1489 if (pctx->errcode && fix_problem(ctx, PR_1_READ_EA_BLOCK, pctx))
1491 header = (struct ext2_ext_attr_header *) block_buf;
1492 pctx->blk = inode->i_file_acl;
1493 if (((ctx->ext_attr_ver == 1) &&
1494 (header->h_magic != EXT2_EXT_ATTR_MAGIC_v1)) ||
1495 ((ctx->ext_attr_ver == 2) &&
1496 (header->h_magic != EXT2_EXT_ATTR_MAGIC))) {
1497 if (fix_problem(ctx, PR_1_BAD_EA_BLOCK, pctx))
1501 if (header->h_blocks != 1) {
1502 if (fix_problem(ctx, PR_1_EA_MULTI_BLOCK, pctx))
1506 region = region_create(0, fs->blocksize);
1508 fix_problem(ctx, PR_1_EA_ALLOC_REGION, pctx);
1509 ctx->flags |= E2F_FLAG_ABORT;
1512 if (region_allocate(region, 0, sizeof(struct ext2_ext_attr_header))) {
1513 if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx))
1517 entry = (struct ext2_ext_attr_entry *)(header+1);
1518 end = block_buf + fs->blocksize;
1519 while ((char *)entry < end && *(__u32 *)entry) {
1522 if (region_allocate(region, (char *)entry - (char *)header,
1523 EXT2_EXT_ATTR_LEN(entry->e_name_len))) {
1524 if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx))
1528 if ((ctx->ext_attr_ver == 1 &&
1529 (entry->e_name_len == 0 || entry->e_name_index != 0)) ||
1530 (ctx->ext_attr_ver == 2 &&
1531 entry->e_name_index == 0)) {
1532 if (fix_problem(ctx, PR_1_EA_BAD_NAME, pctx))
1536 if (entry->e_value_block != 0) {
1537 if (fix_problem(ctx, PR_1_EA_BAD_VALUE, pctx))
1540 if (entry->e_value_offs + entry->e_value_size > fs->blocksize) {
1541 if (fix_problem(ctx, PR_1_EA_BAD_VALUE, pctx))
1545 if (entry->e_value_size &&
1546 region_allocate(region, entry->e_value_offs,
1547 EXT2_EXT_ATTR_SIZE(entry->e_value_size))) {
1548 if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx))
1552 hash = ext2fs_ext_attr_hash_entry(entry, block_buf +
1553 entry->e_value_offs);
1555 if (entry->e_hash != hash) {
1556 pctx->num = entry->e_hash;
1557 if (fix_problem(ctx, PR_1_ATTR_HASH, pctx))
1559 entry->e_hash = hash;
1562 entry = EXT2_EXT_ATTR_NEXT(entry);
1564 if (region_allocate(region, (char *)entry - (char *)header, 4)) {
1565 if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx))
1568 region_free(region);
1570 count = header->h_refcount - 1;
1572 ea_refcount_store(ctx->refcount, blk, count);
1573 mark_block_used(ctx, blk);
1574 ext2fs_fast_mark_block_bitmap(ctx->block_ea_map, blk);
1579 region_free(region);
1580 inode->i_file_acl = 0;
1581 e2fsck_write_inode(ctx, ino, inode, "check_ext_attr");
1585 /* Returns 1 if bad htree, 0 if OK */
1586 static int handle_htree(e2fsck_t ctx, struct problem_context *pctx,
1587 ext2_ino_t ino, struct ext2_inode *inode,
1590 struct ext2_dx_root_info *root;
1591 ext2_filsys fs = ctx->fs;
1595 if ((!LINUX_S_ISDIR(inode->i_mode) &&
1596 fix_problem(ctx, PR_1_HTREE_NODIR, pctx)) ||
1597 (!(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_DIR_INDEX) &&
1598 fix_problem(ctx, PR_1_HTREE_SET, pctx)))
1601 pctx->errcode = ext2fs_bmap(fs, ino, inode, 0, 0, 0, &blk);
1603 if ((pctx->errcode) ||
1605 (blk < fs->super->s_first_data_block) ||
1606 (blk >= fs->super->s_blocks_count)) {
1607 if (fix_problem(ctx, PR_1_HTREE_BADROOT, pctx))
1613 retval = io_channel_read_blk(fs->io, blk, 1, block_buf);
1614 if (retval && fix_problem(ctx, PR_1_HTREE_BADROOT, pctx))
1617 /* XXX should check that beginning matches a directory */
1618 root = (struct ext2_dx_root_info *) (block_buf + 24);
1620 if ((root->reserved_zero || root->info_length < 8) &&
1621 fix_problem(ctx, PR_1_HTREE_BADROOT, pctx))
1624 pctx->num = root->hash_version;
1625 if ((root->hash_version != EXT2_HASH_LEGACY) &&
1626 (root->hash_version != EXT2_HASH_HALF_MD4) &&
1627 (root->hash_version != EXT2_HASH_TEA) &&
1628 fix_problem(ctx, PR_1_HTREE_HASHV, pctx))
1631 if ((root->unused_flags & EXT2_HASH_FLAG_INCOMPAT) &&
1632 fix_problem(ctx, PR_1_HTREE_INCOMPAT, pctx))
1635 pctx->num = root->indirect_levels;
1636 if ((root->indirect_levels > 1) &&
1637 fix_problem(ctx, PR_1_HTREE_DEPTH, pctx))
1643 void e2fsck_clear_inode(e2fsck_t ctx, ext2_ino_t ino,
1644 struct ext2_inode *inode, int restart_flag,
1648 inode->i_links_count = 0;
1649 ext2fs_icount_store(ctx->inode_link_info, ino, 0);
1650 inode->i_dtime = ctx->now;
1652 ext2fs_unmark_inode_bitmap(ctx->inode_dir_map, ino);
1653 ext2fs_unmark_inode_bitmap(ctx->inode_used_map, ino);
1654 if (ctx->inode_reg_map)
1655 ext2fs_unmark_inode_bitmap(ctx->inode_reg_map, ino);
1656 if (ctx->inode_bad_map)
1657 ext2fs_unmark_inode_bitmap(ctx->inode_bad_map, ino);
1660 * If the inode was partially accounted for before processing
1661 * was aborted, we need to restart the pass 1 scan.
1663 ctx->flags |= restart_flag;
1665 e2fsck_write_inode(ctx, ino, inode, source);
1668 static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx,
1669 struct process_block_struct *pb,
1670 blk64_t start_block,
1671 ext2_extent_handle_t ehandle)
1673 struct ext2fs_extent extent;
1675 e2_blkcnt_t blockcnt;
1677 int is_dir, is_leaf;
1679 struct ext2_extent_info info;
1681 pctx->errcode = ext2fs_extent_get_info(ehandle, &info);
1685 pctx->errcode = ext2fs_extent_get(ehandle, EXT2_EXTENT_FIRST_SIB,
1687 while (!pctx->errcode && info.num_entries-- > 0) {
1688 is_leaf = extent.e_flags & EXT2_EXTENT_FLAGS_LEAF;
1689 is_dir = LINUX_S_ISDIR(pctx->inode->i_mode);
1692 if (extent.e_pblk < ctx->fs->super->s_first_data_block ||
1693 extent.e_pblk >= ctx->fs->super->s_blocks_count)
1694 problem = PR_1_EXTENT_BAD_START_BLK;
1695 else if (extent.e_lblk < start_block)
1696 problem = PR_1_OUT_OF_ORDER_EXTENTS;
1698 (extent.e_pblk + extent.e_len) >
1699 ctx->fs->super->s_blocks_count)
1700 problem = PR_1_EXTENT_ENDS_BEYOND;
1704 pctx->blk = extent.e_pblk;
1705 pctx->blk2 = extent.e_lblk;
1706 pctx->num = extent.e_len;
1707 if (fix_problem(ctx, problem, pctx)) {
1709 ext2fs_extent_delete(ehandle, 0);
1710 if (pctx->errcode) {
1711 pctx->str = "ext2fs_extent_delete";
1714 pctx->errcode = ext2fs_extent_get(ehandle,
1715 EXT2_EXTENT_CURRENT,
1717 if (pctx->errcode == EXT2_ET_NO_CURRENT_NODE) {
1727 blk = extent.e_pblk;
1728 pctx->errcode = ext2fs_extent_get(ehandle,
1729 EXT2_EXTENT_DOWN, &extent);
1730 if (pctx->errcode) {
1731 pctx->str = "EXT2_EXTENT_DOWN";
1732 problem = PR_1_EXTENT_HEADER_INVALID;
1733 if (pctx->errcode == EXT2_ET_EXTENT_HEADER_BAD)
1734 goto report_problem;
1737 scan_extent_node(ctx, pctx, pb, extent.e_lblk, ehandle);
1740 pctx->errcode = ext2fs_extent_get(ehandle,
1741 EXT2_EXTENT_UP, &extent);
1742 if (pctx->errcode) {
1743 pctx->str = "EXT2_EXTENT_UP";
1746 mark_block_used(ctx, blk);
1751 if ((pb->previous_block != 0) &&
1752 (pb->previous_block+1 != extent.e_pblk)) {
1753 if (ctx->options & E2F_OPT_FRAGCHECK) {
1758 else if (pb->is_reg)
1761 printf(("%6lu(%c): expecting %6lu "
1763 "phys %6lu log %lu len %lu\n"),
1764 (unsigned long) pctx->ino, type,
1765 (unsigned long) pb->previous_block+1,
1766 (unsigned long) extent.e_pblk,
1767 (unsigned long) extent.e_lblk,
1768 (unsigned long) extent.e_len);
1772 while (is_dir && ++pb->last_db_block < extent.e_lblk) {
1773 pctx->errcode = ext2fs_add_dir_block(ctx->fs->dblist,
1776 if (pctx->errcode) {
1778 pctx->num = pb->last_db_block;
1779 goto failed_add_dir_block;
1782 for (blk = extent.e_pblk, blockcnt = extent.e_lblk, i = 0;
1784 blk++, blockcnt++, i++) {
1785 mark_block_used(ctx, blk);
1788 pctx->errcode = ext2fs_add_dir_block(ctx->fs->dblist, pctx->ino, blk, blockcnt);
1789 if (pctx->errcode) {
1791 pctx->num = blockcnt;
1792 failed_add_dir_block:
1793 fix_problem(ctx, PR_1_ADD_DBLOCK, pctx);
1794 /* Should never get here */
1795 ctx->flags |= E2F_FLAG_ABORT;
1800 if (is_dir && extent.e_len > 0)
1801 pb->last_db_block = blockcnt - 1;
1802 pb->num_blocks += extent.e_len;
1803 pb->previous_block = extent.e_pblk + extent.e_len - 1;
1804 start_block = pb->last_block = extent.e_lblk + extent.e_len - 1;
1806 pctx->errcode = ext2fs_extent_get(ehandle,
1807 EXT2_EXTENT_NEXT_SIB,
1810 if (pctx->errcode == EXT2_ET_EXTENT_NO_NEXT)
1814 static void check_blocks_extents(e2fsck_t ctx, struct problem_context *pctx,
1815 struct process_block_struct *pb)
1817 struct ext2_extent_info info;
1818 struct ext2_inode *inode = pctx->inode;
1819 ext2_extent_handle_t ehandle;
1820 ext2_filsys fs = ctx->fs;
1821 ext2_ino_t ino = pctx->ino;
1824 pctx->errcode = ext2fs_extent_open2(fs, ino, inode, &ehandle);
1825 if (pctx->errcode) {
1826 if (fix_problem(ctx, PR_1_READ_EXTENT, pctx))
1827 e2fsck_clear_inode(ctx, ino, inode, 0,
1828 "check_blocks_extents");
1833 retval = ext2fs_extent_get_info(ehandle, &info);
1835 if (info.max_depth >= MAX_EXTENT_DEPTH_COUNT)
1836 info.max_depth = MAX_EXTENT_DEPTH_COUNT-1;
1837 ctx->extent_depth_count[info.max_depth]++;
1840 scan_extent_node(ctx, pctx, pb, 0, ehandle);
1841 if (pctx->errcode &&
1842 fix_problem(ctx, PR_1_EXTENT_ITERATE_FAILURE, pctx)) {
1844 inode->i_blocks = 0;
1845 e2fsck_clear_inode(ctx, ino, inode, E2F_FLAG_RESTART,
1846 "check_blocks_extents");
1849 ext2fs_extent_free(ehandle);
1852 static blk64_t ext2fs_inode_i_blocks(ext2_filsys fs,
1853 struct ext2_inode *inode)
1855 return (inode->i_blocks |
1856 (fs->super->s_feature_ro_compat &
1857 EXT4_FEATURE_RO_COMPAT_HUGE_FILE ?
1858 (__u64)inode->osd2.linux2.l_i_blocks_hi << 32 : 0));
1862 * This subroutine is called on each inode to account for all of the
1863 * blocks used by that inode.
1865 static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
1868 ext2_filsys fs = ctx->fs;
1869 struct process_block_struct pb;
1870 ext2_ino_t ino = pctx->ino;
1871 struct ext2_inode *inode = pctx->inode;
1873 int dirty_inode = 0;
1880 pb.last_db_block = -1;
1881 pb.num_illegal_blocks = 0;
1882 pb.suppress = 0; pb.clear = 0;
1885 pb.previous_block = 0;
1886 pb.is_dir = LINUX_S_ISDIR(inode->i_mode);
1887 pb.is_reg = LINUX_S_ISREG(inode->i_mode);
1888 pb.max_blocks = 1 << (31 - fs->super->s_log_block_size);
1895 extent_fs = (ctx->fs->super->s_feature_incompat &
1896 EXT3_FEATURE_INCOMPAT_EXTENTS);
1898 if (inode->i_flags & EXT2_COMPRBLK_FL) {
1899 if (fs->super->s_feature_incompat &
1900 EXT2_FEATURE_INCOMPAT_COMPRESSION)
1903 if (fix_problem(ctx, PR_1_COMPR_SET, pctx)) {
1904 inode->i_flags &= ~EXT2_COMPRBLK_FL;
1910 if (inode->i_file_acl && check_ext_attr(ctx, pctx, block_buf)) {
1911 if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
1916 if (ext2fs_inode_has_valid_blocks(inode)) {
1917 if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL))
1918 check_blocks_extents(ctx, pctx, &pb);
1920 pctx->errcode = ext2fs_block_iterate2(fs, ino,
1921 pb.is_dir ? BLOCK_FLAG_HOLE : 0,
1922 block_buf, process_block, &pb);
1924 end_problem_latch(ctx, PR_LATCH_BLOCK);
1925 end_problem_latch(ctx, PR_LATCH_TOOBIG);
1926 if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
1929 fix_problem(ctx, PR_1_BLOCK_ITERATE, pctx);
1931 if (pb.fragmented && pb.num_blocks < fs->super->s_blocks_per_group) {
1932 if (LINUX_S_ISDIR(inode->i_mode))
1933 ctx->fs_fragmented_dir++;
1935 ctx->fs_fragmented++;
1939 e2fsck_clear_inode(ctx, ino, inode, E2F_FLAG_RESTART,
1944 if (inode->i_flags & EXT2_INDEX_FL) {
1945 if (handle_htree(ctx, pctx, ino, inode, block_buf)) {
1946 inode->i_flags &= ~EXT2_INDEX_FL;
1950 e2fsck_add_dx_dir(ctx, ino, pb.last_block+1);
1955 if (!pb.num_blocks && pb.is_dir) {
1956 if (fix_problem(ctx, PR_1_ZERO_LENGTH_DIR, pctx)) {
1957 e2fsck_clear_inode(ctx, ino, inode, 0, "check_blocks");
1958 ctx->fs_directory_count--;
1963 if (!(fs->super->s_feature_ro_compat &
1964 EXT4_FEATURE_RO_COMPAT_HUGE_FILE) ||
1965 !(inode->i_flags & EXT4_HUGE_FILE_FL))
1966 pb.num_blocks *= (fs->blocksize / 512);
1968 printf("inode %u, i_size = %lu, last_block = %lld, i_blocks=%lu, num_blocks = %lu\n",
1969 ino, inode->i_size, pb.last_block, inode->i_blocks,
1973 int nblock = inode->i_size >> EXT2_BLOCK_SIZE_BITS(fs->super);
1974 if (inode->i_size & (fs->blocksize - 1))
1976 else if (nblock > (pb.last_block + 1))
1978 else if (nblock < (pb.last_block + 1)) {
1979 if (((pb.last_block + 1) - nblock) >
1980 fs->super->s_prealloc_dir_blocks)
1984 e2_blkcnt_t blkpg = ctx->blocks_per_page;
1986 size = EXT2_I_SIZE(inode);
1987 if ((pb.last_block >= 0) &&
1988 /* allow allocated blocks to end of PAGE_SIZE */
1989 (size < (__u64)pb.last_block * fs->blocksize) &&
1990 (pb.last_block / blkpg * blkpg != pb.last_block ||
1991 size < (__u64)(pb.last_block & ~(blkpg-1)) *fs->blocksize) &&
1992 !(inode->i_flags & EXT4_EOFBLOCKS_FL))
1994 else if (!(extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) &&
1995 size > ext2_max_sizes[fs->super->s_log_block_size])
1996 /* too big for a direct/indirect-mapped file */
1998 else if ((extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) &&
2000 ((1ULL << (32 + EXT2_BLOCK_SIZE_BITS(fs->super))) - 1))
2001 /* too big for an extent-based file - 32bit ee_block */
2004 /* i_size for symlinks is checked elsewhere */
2005 if (bad_size && !LINUX_S_ISLNK(inode->i_mode)) {
2006 pctx->num = (pb.last_block+1) * fs->blocksize;
2007 pctx->group = bad_size;
2008 if (fix_problem(ctx, PR_1_BAD_I_SIZE, pctx)) {
2009 inode->i_size = pctx->num;
2010 if (!LINUX_S_ISDIR(inode->i_mode))
2011 inode->i_size_high = pctx->num >> 32;
2016 if (LINUX_S_ISREG(inode->i_mode) &&
2017 (inode->i_size_high || inode->i_size & 0x80000000UL))
2019 if ((pb.num_blocks != ext2fs_inode_i_blocks(fs, inode)) ||
2020 ((fs->super->s_feature_ro_compat &
2021 EXT4_FEATURE_RO_COMPAT_HUGE_FILE) &&
2022 (inode->i_flags & EXT4_HUGE_FILE_FL) &&
2023 (inode->osd2.linux2.l_i_blocks_hi != 0))) {
2024 pctx->num = pb.num_blocks;
2025 if (fix_problem(ctx, PR_1_BAD_I_BLOCKS, pctx)) {
2026 inode->i_blocks = pb.num_blocks;
2027 inode->osd2.linux2.l_i_blocks_hi = 0;
2033 if (ctx->dirs_to_hash && pb.is_dir &&
2034 !(inode->i_flags & EXT2_INDEX_FL) &&
2035 ((inode->i_size / fs->blocksize) >= 3))
2036 ext2fs_u32_list_add(ctx->dirs_to_hash, ino);
2040 e2fsck_write_inode(ctx, ino, inode, "check_blocks");
2045 * Helper function called by process block when an illegal block is
2046 * found. It returns a description about why the block is illegal
2048 static char *describe_illegal_block(ext2_filsys fs, blk_t block)
2052 static char problem[80];
2054 super = fs->super->s_first_data_block;
2055 strcpy(problem, "PROGRAMMING ERROR: Unknown reason for illegal block");
2056 if (block < super) {
2057 sprintf(problem, "< FIRSTBLOCK (%u)", super);
2059 } else if (block >= fs->super->s_blocks_count) {
2060 sprintf(problem, "> BLOCKS (%u)", fs->super->s_blocks_count);
2063 for (i = 0; i < fs->group_desc_count; i++) {
2064 if (block == super) {
2065 sprintf(problem, "is the superblock in group %d", i);
2068 if (block > super &&
2069 block <= (super + fs->desc_blocks)) {
2070 sprintf(problem, "is in the group descriptors "
2074 if (block == fs->group_desc[i].bg_block_bitmap) {
2075 sprintf(problem, "is the block bitmap of group %d", i);
2078 if (block == fs->group_desc[i].bg_inode_bitmap) {
2079 sprintf(problem, "is the inode bitmap of group %d", i);
2082 if (block >= fs->group_desc[i].bg_inode_table &&
2083 (block < fs->group_desc[i].bg_inode_table
2084 + fs->inode_blocks_per_group)) {
2085 sprintf(problem, "is in the inode table of group %d",
2089 super += fs->super->s_blocks_per_group;
2096 * This is a helper function for check_blocks().
2098 static int process_block(ext2_filsys fs,
2100 e2_blkcnt_t blockcnt,
2101 blk_t ref_block EXT2FS_ATTR((unused)),
2102 int ref_offset EXT2FS_ATTR((unused)),
2105 struct process_block_struct *p;
2106 struct problem_context *pctx;
2107 blk_t blk = *block_nr;
2112 p = (struct process_block_struct *) priv_data;
2116 if (p->compressed && (blk == EXT2FS_COMPRESSED_BLKADDR)) {
2117 /* todo: Check that the comprblk_fl is high, that the
2118 blkaddr pattern looks right (all non-holes up to
2119 first EXT2FS_COMPRESSED_BLKADDR, then all
2120 EXT2FS_COMPRESSED_BLKADDR up to end of cluster),
2121 that the feature_incompat bit is high, and that the
2122 inode is a regular file. If we're doing a "full
2123 check" (a concept introduced to e2fsck by e2compr,
2124 meaning that we look at data blocks as well as
2125 metadata) then call some library routine that
2126 checks the compressed data. I'll have to think
2127 about this, because one particularly important
2128 problem to be able to fix is to recalculate the
2129 cluster size if necessary. I think that perhaps
2130 we'd better do most/all e2compr-specific checks
2131 separately, after the non-e2compr checks. If not
2132 doing a full check, it may be useful to test that
2133 the personality is linux; e.g. if it isn't then
2134 perhaps this really is just an illegal block. */
2142 printf("Process_block, inode %lu, block %u, #%d\n", p->ino, blk,
2147 * Simplistic fragmentation check. We merely require that the
2148 * file be contiguous. (Which can never be true for really
2149 * big files that are greater than a block group.)
2151 if (!HOLE_BLKADDR(p->previous_block) && p->ino != EXT2_RESIZE_INO) {
2152 if (p->previous_block+1 != blk) {
2153 if (ctx->options & E2F_OPT_FRAGCHECK) {
2161 printf(_("%6lu(%c): expecting %6lu "
2162 "got phys %6lu (blkcnt %lld)\n"),
2163 (unsigned long) pctx->ino, type,
2164 (unsigned long) p->previous_block+1,
2165 (unsigned long) blk,
2171 p->previous_block = blk;
2173 if (p->is_dir && blockcnt > (1 << (21 - fs->super->s_log_block_size)))
2174 problem = PR_1_TOOBIG_DIR;
2175 if (p->is_reg && p->num_blocks+1 >= p->max_blocks)
2176 problem = PR_1_TOOBIG_REG;
2177 if (!p->is_dir && !p->is_reg && blockcnt > 0)
2178 problem = PR_1_TOOBIG_SYMLINK;
2180 if (blk < fs->super->s_first_data_block ||
2181 blk >= fs->super->s_blocks_count)
2182 problem = PR_1_ILLEGAL_BLOCK_NUM;
2185 p->num_illegal_blocks++;
2186 if (!p->suppress && (p->num_illegal_blocks % 12) == 0) {
2187 if (fix_problem(ctx, PR_1_TOO_MANY_BAD_BLOCKS, pctx)) {
2191 if (fix_problem(ctx, PR_1_SUPPRESS_MESSAGES, pctx)) {
2193 set_latch_flags(PR_LATCH_BLOCK,
2198 pctx->blkcount = blockcnt;
2199 if (fix_problem(ctx, problem, pctx)) {
2200 blk = *block_nr = 0;
2201 ret_code = BLOCK_CHANGED;
2207 if (p->ino == EXT2_RESIZE_INO) {
2209 * The resize inode has already be sanity checked
2210 * during pass #0 (the superblock checks). All we
2211 * have to do is mark the double indirect block as
2212 * being in use; all of the other blocks are handled
2213 * by mark_table_blocks()).
2215 if (blockcnt == BLOCK_COUNT_DIND)
2216 mark_block_used(ctx, blk);
2218 mark_block_used(ctx, blk);
2221 p->last_block = blockcnt;
2223 if (p->is_dir && (blockcnt >= 0)) {
2224 while (++p->last_db_block < blockcnt) {
2225 pctx->errcode = ext2fs_add_dir_block(fs->dblist,
2228 if (pctx->errcode) {
2230 pctx->num = p->last_db_block;
2231 goto failed_add_dir_block;
2234 pctx->errcode = ext2fs_add_dir_block(fs->dblist, p->ino,
2236 if (pctx->errcode) {
2238 pctx->num = blockcnt;
2239 failed_add_dir_block:
2240 fix_problem(ctx, PR_1_ADD_DBLOCK, pctx);
2241 /* Should never get here */
2242 ctx->flags |= E2F_FLAG_ABORT;
2249 static int process_bad_block(ext2_filsys fs,
2251 e2_blkcnt_t blockcnt,
2252 blk_t ref_block EXT2FS_ATTR((unused)),
2253 int ref_offset EXT2FS_ATTR((unused)),
2256 struct process_block_struct *p;
2257 blk_t blk = *block_nr;
2260 struct problem_context *pctx;
2264 * Note: This function processes blocks for the bad blocks
2265 * inode, which is never compressed. So we don't use HOLE_BLKADDR().
2271 p = (struct process_block_struct *) priv_data;
2275 pctx->ino = EXT2_BAD_INO;
2277 pctx->blkcount = blockcnt;
2279 if ((blk < fs->super->s_first_data_block) ||
2280 (blk >= fs->super->s_blocks_count)) {
2281 if (fix_problem(ctx, PR_1_BB_ILLEGAL_BLOCK_NUM, pctx)) {
2283 return BLOCK_CHANGED;
2289 if (ext2fs_test_block_bitmap(p->fs_meta_blocks, blk)) {
2291 if (fix_problem(ctx, PR_1_BB_FS_BLOCK, pctx)) {
2293 return BLOCK_CHANGED;
2295 } else if (ext2fs_test_block_bitmap(ctx->block_found_map,
2298 if (fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK,
2301 return BLOCK_CHANGED;
2303 if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
2306 mark_block_used(ctx, blk);
2310 printf ("DEBUG: Marking %u as bad.\n", blk);
2312 ctx->fs_badblocks_count++;
2314 * If the block is not used, then mark it as used and return.
2315 * If it is already marked as found, this must mean that
2316 * there's an overlap between the filesystem table blocks
2317 * (bitmaps and inode table) and the bad block list.
2319 if (!ext2fs_test_block_bitmap(ctx->block_found_map, blk)) {
2320 ext2fs_mark_block_bitmap(ctx->block_found_map, blk);
2324 * Try to find the where the filesystem block was used...
2326 first_block = fs->super->s_first_data_block;
2328 for (i = 0; i < fs->group_desc_count; i++ ) {
2331 if (!ext2fs_bg_has_super(fs, i))
2333 if (blk == first_block) {
2335 if (fix_problem(ctx,
2336 PR_1_BAD_PRIMARY_SUPERBLOCK,
2339 return BLOCK_CHANGED;
2343 fix_problem(ctx, PR_1_BAD_SUPERBLOCK, pctx);
2346 if ((blk > first_block) &&
2347 (blk <= first_block + fs->desc_blocks)) {
2349 pctx->blk = *block_nr;
2350 if (fix_problem(ctx,
2351 PR_1_BAD_PRIMARY_GROUP_DESCRIPTOR, pctx)) {
2353 return BLOCK_CHANGED;
2357 fix_problem(ctx, PR_1_BAD_GROUP_DESCRIPTORS, pctx);
2361 if (blk == fs->group_desc[i].bg_block_bitmap) {
2362 if (fix_problem(ctx, PR_1_BB_BAD_BLOCK, pctx)) {
2363 ctx->invalid_block_bitmap_flag[i]++;
2364 ctx->invalid_bitmaps++;
2368 if (blk == fs->group_desc[i].bg_inode_bitmap) {
2369 if (fix_problem(ctx, PR_1_IB_BAD_BLOCK, pctx)) {
2370 ctx->invalid_inode_bitmap_flag[i]++;
2371 ctx->invalid_bitmaps++;
2375 if ((blk >= fs->group_desc[i].bg_inode_table) &&
2376 (blk < (fs->group_desc[i].bg_inode_table +
2377 fs->inode_blocks_per_group))) {
2379 * If there are bad blocks in the inode table,
2380 * the inode scan code will try to do
2381 * something reasonable automatically.
2385 first_block += fs->super->s_blocks_per_group;
2388 * If we've gotten to this point, then the only
2389 * possibility is that the bad block inode meta data
2390 * is using a bad block.
2392 if ((blk == p->inode->i_block[EXT2_IND_BLOCK]) ||
2393 (blk == p->inode->i_block[EXT2_DIND_BLOCK]) ||
2394 (blk == p->inode->i_block[EXT2_TIND_BLOCK])) {
2396 if (fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK, pctx)) {
2398 return BLOCK_CHANGED;
2400 if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
2407 /* Warn user that the block wasn't claimed */
2408 fix_problem(ctx, PR_1_PROGERR_CLAIMED_BLOCK, pctx);
2413 static void new_table_block(e2fsck_t ctx, blk_t first_block, int group,
2414 const char *name, int num, blk_t *new_block)
2416 ext2_filsys fs = ctx->fs;
2418 blk_t old_block = *new_block;
2420 int i, is_flexbg, flexbg, flexbg_size;
2422 struct problem_context pctx;
2424 clear_problem_context(&pctx);
2427 pctx.blk = old_block;
2431 * For flex_bg filesystems, first try to allocate the metadata
2432 * within the flex_bg, and if that fails then try finding the
2433 * space anywhere in the filesystem.
2435 is_flexbg = EXT2_HAS_INCOMPAT_FEATURE(fs->super,
2436 EXT4_FEATURE_INCOMPAT_FLEX_BG);
2438 flexbg_size = 1 << fs->super->s_log_groups_per_flex;
2439 flexbg = group / flexbg_size;
2440 first_block = ext2fs_group_first_block(fs,
2441 flexbg_size * flexbg);
2442 last_grp = group | (flexbg_size - 1);
2443 if (last_grp > fs->group_desc_count)
2444 last_grp = fs->group_desc_count;
2445 last_block = ext2fs_group_last_block(fs, last_grp);
2447 last_block = ext2fs_group_last_block(fs, group);
2448 pctx.errcode = ext2fs_get_free_blocks(fs, first_block, last_block,
2449 num, ctx->block_found_map,
2451 if (is_flexbg && (pctx.errcode == EXT2_ET_BLOCK_ALLOC_FAIL))
2452 pctx.errcode = ext2fs_get_free_blocks(fs,
2453 fs->super->s_first_data_block,
2454 fs->super->s_blocks_count,
2455 num, ctx->block_found_map, new_block);
2458 fix_problem(ctx, PR_1_RELOC_BLOCK_ALLOCATE, &pctx);
2459 ext2fs_unmark_valid(fs);
2460 ctx->flags |= E2F_FLAG_ABORT;
2463 pctx.errcode = ext2fs_get_mem(fs->blocksize, &buf);
2465 fix_problem(ctx, PR_1_RELOC_MEMORY_ALLOCATE, &pctx);
2466 ext2fs_unmark_valid(fs);
2467 ctx->flags |= E2F_FLAG_ABORT;
2470 ext2fs_mark_super_dirty(fs);
2471 fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
2472 pctx.blk2 = *new_block;
2473 fix_problem(ctx, (old_block ? PR_1_RELOC_FROM_TO :
2474 PR_1_RELOC_TO), &pctx);
2476 for (i = 0; i < num; i++) {
2478 ext2fs_mark_block_bitmap(ctx->block_found_map, (*new_block)+i);
2480 pctx.errcode = io_channel_read_blk(fs->io,
2481 old_block + i, 1, buf);
2483 fix_problem(ctx, PR_1_RELOC_READ_ERR, &pctx);
2485 memset(buf, 0, fs->blocksize);
2487 pctx.blk = (*new_block) + i;
2488 pctx.errcode = io_channel_write_blk(fs->io, pctx.blk,
2491 fix_problem(ctx, PR_1_RELOC_WRITE_ERR, &pctx);
2493 ext2fs_free_mem(&buf);
2497 * This routine gets called at the end of pass 1 if bad blocks are
2498 * detected in the superblock, group descriptors, inode_bitmaps, or
2499 * block bitmaps. At this point, all of the blocks have been mapped
2500 * out, so we can try to allocate new block(s) to replace the bad
2503 static void handle_fs_bad_blocks(e2fsck_t ctx)
2505 ext2_filsys fs = ctx->fs;
2509 for (i = 0; i < fs->group_desc_count; i++) {
2510 first_block = ext2fs_group_first_block(fs, i);
2512 if (ctx->invalid_block_bitmap_flag[i]) {
2513 new_table_block(ctx, first_block, i, _("block bitmap"),
2514 1, &fs->group_desc[i].bg_block_bitmap);
2516 if (ctx->invalid_inode_bitmap_flag[i]) {
2517 new_table_block(ctx, first_block, i, _("inode bitmap"),
2518 1, &fs->group_desc[i].bg_inode_bitmap);
2520 if (ctx->invalid_inode_table_flag[i]) {
2521 new_table_block(ctx, first_block, i, _("inode table"),
2522 fs->inode_blocks_per_group,
2523 &fs->group_desc[i].bg_inode_table);
2524 ctx->flags |= E2F_FLAG_RESTART;
2527 ctx->invalid_bitmaps = 0;
2531 * This routine marks all blocks which are used by the superblock,
2532 * group descriptors, inode bitmaps, and block bitmaps.
2534 static void mark_table_blocks(e2fsck_t ctx)
2536 ext2_filsys fs = ctx->fs;
2540 struct problem_context pctx;
2542 clear_problem_context(&pctx);
2544 for (i = 0; i < fs->group_desc_count; i++) {
2547 ext2fs_reserve_super_and_bgd(fs, i, ctx->block_found_map);
2550 * Mark the blocks used for the inode table
2552 if (fs->group_desc[i].bg_inode_table) {
2553 for (j = 0, b = fs->group_desc[i].bg_inode_table;
2554 j < fs->inode_blocks_per_group;
2556 if (ext2fs_test_block_bitmap(ctx->block_found_map,
2559 if (!ctx->invalid_inode_table_flag[i] &&
2561 PR_1_ITABLE_CONFLICT, &pctx)) {
2562 ctx->invalid_inode_table_flag[i]++;
2563 ctx->invalid_bitmaps++;
2566 ext2fs_mark_block_bitmap(ctx->block_found_map,
2573 * Mark block used for the block bitmap
2575 if (fs->group_desc[i].bg_block_bitmap) {
2576 if (ext2fs_test_block_bitmap(ctx->block_found_map,
2577 fs->group_desc[i].bg_block_bitmap)) {
2578 pctx.blk = fs->group_desc[i].bg_block_bitmap;
2579 if (fix_problem(ctx, PR_1_BB_CONFLICT, &pctx)) {
2580 ctx->invalid_block_bitmap_flag[i]++;
2581 ctx->invalid_bitmaps++;
2584 ext2fs_mark_block_bitmap(ctx->block_found_map,
2585 fs->group_desc[i].bg_block_bitmap);
2590 * Mark block used for the inode bitmap
2592 if (fs->group_desc[i].bg_inode_bitmap) {
2593 if (ext2fs_test_block_bitmap(ctx->block_found_map,
2594 fs->group_desc[i].bg_inode_bitmap)) {
2595 pctx.blk = fs->group_desc[i].bg_inode_bitmap;
2596 if (fix_problem(ctx, PR_1_IB_CONFLICT, &pctx)) {
2597 ctx->invalid_inode_bitmap_flag[i]++;
2598 ctx->invalid_bitmaps++;
2601 ext2fs_mark_block_bitmap(ctx->block_found_map,
2602 fs->group_desc[i].bg_inode_bitmap);
2609 * Thes subroutines short circuits ext2fs_get_blocks and
2610 * ext2fs_check_directory; we use them since we already have the inode
2611 * structure, so there's no point in letting the ext2fs library read
2614 static errcode_t pass1_get_blocks(ext2_filsys fs, ext2_ino_t ino,
2617 e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2620 if ((ino != ctx->stashed_ino) || !ctx->stashed_inode)
2621 return EXT2_ET_CALLBACK_NOTHANDLED;
2623 for (i=0; i < EXT2_N_BLOCKS; i++)
2624 blocks[i] = ctx->stashed_inode->i_block[i];
2628 static errcode_t pass1_read_inode(ext2_filsys fs, ext2_ino_t ino,
2629 struct ext2_inode *inode)
2631 e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2633 if ((ino != ctx->stashed_ino) || !ctx->stashed_inode)
2634 return EXT2_ET_CALLBACK_NOTHANDLED;
2635 *inode = *ctx->stashed_inode;
2639 static errcode_t pass1_write_inode(ext2_filsys fs, ext2_ino_t ino,
2640 struct ext2_inode *inode)
2642 e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2644 if ((ino == ctx->stashed_ino) && ctx->stashed_inode &&
2645 (inode != ctx->stashed_inode))
2646 *ctx->stashed_inode = *inode;
2647 return EXT2_ET_CALLBACK_NOTHANDLED;
2650 static errcode_t pass1_check_directory(ext2_filsys fs, ext2_ino_t ino)
2652 e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2654 if ((ino != ctx->stashed_ino) || !ctx->stashed_inode)
2655 return EXT2_ET_CALLBACK_NOTHANDLED;
2657 if (!LINUX_S_ISDIR(ctx->stashed_inode->i_mode))
2658 return EXT2_ET_NO_DIRECTORY;
2662 static errcode_t e2fsck_get_alloc_block(ext2_filsys fs, blk64_t goal,
2665 e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2669 if (ctx->block_found_map) {
2670 retval = ext2fs_new_block(fs, (blk_t) goal,
2671 ctx->block_found_map, &new_block);
2674 if (fs->block_map) {
2675 ext2fs_mark_block_bitmap(fs->block_map, new_block);
2676 ext2fs_mark_bb_dirty(fs);
2679 if (!fs->block_map) {
2680 retval = ext2fs_read_block_bitmap(fs);
2685 retval = ext2fs_new_block(fs, (blk_t) goal, 0, &new_block);
2694 static void e2fsck_block_alloc_stats(ext2_filsys fs, blk64_t blk, int inuse)
2696 e2fsck_t ctx = (e2fsck_t) fs->priv_data;
2698 if (ctx->block_found_map) {
2700 ext2fs_mark_block_bitmap(ctx->block_found_map,
2703 ext2fs_unmark_block_bitmap(ctx->block_found_map,
2708 void e2fsck_use_inode_shortcuts(e2fsck_t ctx, int bool)
2710 ext2_filsys fs = ctx->fs;
2713 fs->get_blocks = pass1_get_blocks;
2714 fs->check_directory = pass1_check_directory;
2715 fs->read_inode = pass1_read_inode;
2716 fs->write_inode = pass1_write_inode;
2717 ctx->stashed_ino = 0;
2718 ext2fs_set_alloc_block_callback(fs, e2fsck_get_alloc_block,
2720 ext2fs_set_block_alloc_stats_callback(fs,
2721 e2fsck_block_alloc_stats,
2725 fs->check_directory = 0;
2727 fs->write_inode = 0;