1 /* 2 * pass1.c -- pass #1 of e2fsck: sequential scan of the inode table 3 * 4 * Copyright (C) 1993, 1994, 1995, 1996, 1997 Theodore Ts'o. 5 * 6 * %Begin-Header% 7 * This file may be redistributed under the terms of the GNU Public 8 * License. 9 * %End-Header% 10 * 11 * Pass 1 of e2fsck iterates over all the inodes in the filesystems, 12 * and applies the following tests to each inode: 13 * 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 17 * 18 * Pass 1 also gathers the collects the following information: 19 * 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) 29 * 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 34 * inode to fix it.) 35 * 36 * Note that pass 1B will be invoked if there are any duplicate blocks 37 * found. 38 */ 39 40 #define _GNU_SOURCE 1 /* get strnlen() */ 41 #include <string.h> 42 #include <time.h> 43 #ifdef HAVE_ERRNO_H 44 #include <errno.h> 45 #endif 46 47 #include "e2fsck.h" 48 #include <ext2fs/ext2_ext_attr.h> 49 50 #include "problem.h" 51 52 #ifdef NO_INLINE_FUNCS 53 #define _INLINE_ 54 #else 55 #define _INLINE_ inline 56 #endif 57 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, 65 char *block_buf); 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); */ 78 79 struct process_block_struct { 80 ext2_ino_t ino; 81 unsigned is_dir:1, is_reg:1, clear:1, suppress:1, 82 fragmented:1, compressed:1, bbcheck:1; 83 blk64_t num_blocks; 84 blk_t max_blocks; 85 e2_blkcnt_t last_block; 86 e2_blkcnt_t last_db_block; 87 int num_illegal_blocks; 88 blk_t previous_block; 89 struct ext2_inode *inode; 90 struct problem_context *pctx; 91 ext2fs_block_bitmap fs_meta_blocks; 92 e2fsck_t ctx; 93 }; 94 95 struct process_inode_block { 96 ext2_ino_t ino; 97 struct ext2_inode inode; 98 }; 99 100 struct scan_callback_struct { 101 e2fsck_t ctx; 102 char *block_buf; 103 }; 104 105 /* 106 * For the inodes to process list. 107 */ 108 static struct process_inode_block *inodes_to_process; 109 static int process_inode_count; 110 111 static __u64 ext2_max_sizes[EXT2_MAX_BLOCK_LOG_SIZE - 112 EXT2_MIN_BLOCK_LOG_SIZE + 1]; 113 114 /* 115 * Free all memory allocated by pass1 in preparation for restarting 116 * things. 117 */ 118 static void unwind_pass1(ext2_filsys fs EXT2FS_ATTR((unused))) 119 { 120 ext2fs_free_mem(&inodes_to_process); 121 inodes_to_process = 0; 122 } 123 124 /* 125 * Check to make sure a device inode is real. Returns 1 if the device 126 * checks out, 0 if not. 127 * 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 130 * zero. 131 */ 132 int e2fsck_pass1_check_device_inode(ext2_filsys fs EXT2FS_ATTR((unused)), 133 struct ext2_inode *inode) 134 { 135 int i; 136 137 /* 138 * If the index flag is set, then this is a bogus 139 * device/fifo/socket 140 */ 141 if (inode->i_flags & EXT2_INDEX_FL) 142 return 0; 143 144 /* 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... 154 */ 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]) 158 return 0; 159 } 160 return 1; 161 } 162 163 /* 164 * Check to make sure a symlink inode is real. Returns 1 if the symlink 165 * checks out, 0 if not. 166 */ 167 int e2fsck_pass1_check_symlink(ext2_filsys fs, ext2_ino_t ino, 168 struct ext2_inode *inode, char *buf) 169 { 170 unsigned int len; 171 int i; 172 blk_t blocks; 173 ext2_extent_handle_t handle; 174 struct ext2_extent_info info; 175 struct ext2fs_extent extent; 176 177 if ((inode->i_size_high || inode->i_size == 0) || 178 (inode->i_flags & EXT2_INDEX_FL)) 179 return 0; 180 181 if (inode->i_flags & EXT4_EXTENTS_FL) { 182 if (inode->i_size > fs->blocksize) 183 return 0; 184 if (ext2fs_extent_open2(fs, ino, inode, &handle)) 185 return 0; 186 i = 0; 187 if (ext2fs_extent_get_info(handle, &info) || 188 (info.num_entries != 1) || 189 (info.max_depth != 0)) 190 goto exit_extent; 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)) 196 goto exit_extent; 197 i = 1; 198 exit_extent: 199 ext2fs_extent_free(handle); 200 return i; 201 } 202 203 blocks = ext2fs_inode_data_blocks(fs, inode); 204 if (blocks) { 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)) 209 return 0; 210 211 for (i = 1; i < EXT2_N_BLOCKS; i++) 212 if (inode->i_block[i]) 213 return 0; 214 215 if (io_channel_read_blk(fs->io, inode->i_block[0], 1, buf)) 216 return 0; 217 218 len = strnlen(buf, fs->blocksize); 219 if (len == fs->blocksize) 220 return 0; 221 } else { 222 if (inode->i_size >= sizeof(inode->i_block)) 223 return 0; 224 225 len = strnlen((char *)inode->i_block, sizeof(inode->i_block)); 226 if (len == sizeof(inode->i_block)) 227 return 0; 228 } 229 if (len != inode->i_size) 230 return 0; 231 return 1; 232 } 233 234 /* 235 * If the immutable (or append-only) flag is set on the inode, offer 236 * to clear it. 237 */ 238 #define BAD_SPECIAL_FLAGS (EXT2_IMMUTABLE_FL | EXT2_APPEND_FL) 239 static void check_immutable(e2fsck_t ctx, struct problem_context *pctx) 240 { 241 if (!(pctx->inode->i_flags & BAD_SPECIAL_FLAGS)) 242 return; 243 244 if (!fix_problem(ctx, PR_1_SET_IMMUTABLE, pctx)) 245 return; 246 247 pctx->inode->i_flags &= ~BAD_SPECIAL_FLAGS; 248 e2fsck_write_inode(ctx, pctx->ino, pctx->inode, "pass1"); 249 } 250 251 /* 252 * If device, fifo or socket, check size is zero -- if not offer to 253 * clear it 254 */ 255 static void check_size(e2fsck_t ctx, struct problem_context *pctx) 256 { 257 struct ext2_inode *inode = pctx->inode; 258 259 if ((inode->i_size == 0) && (inode->i_size_high == 0)) 260 return; 261 262 if (!fix_problem(ctx, PR_1_SET_NONZSIZE, pctx)) 263 return; 264 265 inode->i_size = 0; 266 inode->i_size_high = 0; 267 e2fsck_write_inode(ctx, pctx->ino, pctx->inode, "pass1"); 268 } 269 270 static void check_ea_in_inode(e2fsck_t ctx, struct problem_context *pctx) 271 { 272 struct ext2_super_block *sb = ctx->fs->super; 273 struct ext2_inode_large *inode; 274 struct ext2_ext_attr_entry *entry; 275 char *start, *end; 276 unsigned int storage_size, remain; 277 int problem = 0; 278 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; 286 287 /* scan all entry's headers first */ 288 289 /* take finish entry 0UL into account */ 290 remain = storage_size - sizeof(__u32); 291 292 while (!EXT2_EXT_IS_LAST_ENTRY(entry)) { 293 __u32 hash; 294 295 /* header eats this space */ 296 remain -= sizeof(struct ext2_ext_attr_entry); 297 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; 302 goto fix; 303 } 304 305 /* attribute len eats this space */ 306 remain -= EXT2_EXT_ATTR_SIZE(entry->e_name_len); 307 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; 312 goto fix; 313 } 314 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; 319 goto fix; 320 } 321 322 hash = ext2fs_ext_attr_hash_entry(entry, 323 start + entry->e_value_offs); 324 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; 329 goto fix; 330 } 331 332 remain -= entry->e_value_size; 333 334 entry = EXT2_EXT_ATTR_NEXT(entry); 335 } 336 fix: 337 /* 338 * it seems like a corruption. it's very unlikely we could repair 339 * EA(s) in automatic fashion -bzzz 340 */ 341 if (problem == 0 || !fix_problem(ctx, problem, pctx)) 342 return; 343 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"); 348 } 349 350 static void check_inode_extra_space(e2fsck_t ctx, struct problem_context *pctx) 351 { 352 struct ext2_super_block *sb = ctx->fs->super; 353 struct ext2_inode_large *inode; 354 __u32 *eamagic; 355 int min, max; 356 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 */ 360 return; 361 } 362 363 #if 0 364 printf("inode #%u, i_extra_size %d\n", pctx->ino, 365 inode->i_extra_isize); 366 #endif 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; 370 /* 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 373 */ 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)) 377 return; 378 inode->i_extra_isize = min; 379 e2fsck_write_inode_full(ctx, pctx->ino, pctx->inode, 380 EXT2_INODE_SIZE(sb), "pass1"); 381 return; 382 } 383 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); 389 } 390 } 391 392 /* 393 * Check to see if the inode might really be a directory, despite i_mode 394 * 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] 399 */ 400 static void check_is_really_dir(e2fsck_t ctx, struct problem_context *pctx, 401 char *buf) 402 { 403 struct ext2_inode *inode = pctx->inode; 404 struct ext2_dir_entry *dirent; 405 const char *old_op; 406 errcode_t retval; 407 blk_t blk; 408 blk64_t first_dir_blk; 409 unsigned int i, rec_len, not_device = 0; 410 int extent_fs; 411 412 /* 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 417 * it nonzero. 418 */ 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) 421 return; 422 423 /* 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 429 * a directory. 430 * 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 433 * check. 434 * 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 437 * with it. 438 */ 439 440 extent_fs = (ctx->fs->super->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS); 441 if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) { 442 /* extent mapped */ 443 if (ext2fs_bmap(ctx->fs, pctx->ino, inode, 0, 0, 0, 444 &blk)) 445 return; 446 /* device files are never extent mapped */ 447 not_device++; 448 } else { 449 for (i=0; i < EXT2_N_BLOCKS; i++) { 450 blk = inode->i_block[i]; 451 if (!blk) 452 continue; 453 if (i >= 4) 454 not_device++; 455 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, 459 blk)) 460 return; /* Invalid block, can't be dir */ 461 } 462 blk = inode->i_block[0]; 463 } 464 465 /* 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. 469 */ 470 if ((LINUX_S_ISCHR(inode->i_mode) || LINUX_S_ISBLK(inode->i_mode)) && 471 (inode->i_links_count == 1) && !not_device) 472 return; 473 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); 478 if (retval) 479 return; 480 481 dirent = (struct ext2_dir_entry *) buf; 482 retval = ext2fs_get_rec_len(ctx->fs, dirent, &rec_len); 483 if (retval) 484 return; 485 if (((dirent->name_len & 0xFF) != 1) || 486 (dirent->name[0] != '.') || 487 (dirent->inode != pctx->ino) || 488 (rec_len < 12) || 489 (rec_len % 4) || 490 (rec_len >= ctx->fs->blocksize - 12)) 491 return; 492 493 dirent = (struct ext2_dir_entry *) (buf + rec_len); 494 retval = ext2fs_get_rec_len(ctx->fs, dirent, &rec_len); 495 if (retval) 496 return; 497 if (((dirent->name_len & 0xFF) != 2) || 498 (dirent->name[0] != '.') || 499 (dirent->name[1] != '.') || 500 (rec_len < 12) || 501 (rec_len % 4)) 502 return; 503 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"); 509 } 510 } 511 512 extern void e2fsck_setup_tdb_icount(e2fsck_t ctx, int flags, 513 ext2_icount_t *ret) 514 { 515 unsigned int threshold; 516 ext2_ino_t num_dirs; 517 errcode_t retval; 518 char *tdb_dir; 519 int enable; 520 521 *ret = 0; 522 523 profile_get_string(ctx->profile, "scratch_files", "directory", 0, 0, 524 &tdb_dir); 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); 529 530 retval = ext2fs_get_num_dirs(ctx->fs, &num_dirs); 531 if (retval) 532 num_dirs = 1024; /* Guess */ 533 534 if (!enable || !tdb_dir || access(tdb_dir, W_OK) || 535 (threshold && num_dirs <= threshold)) 536 return; 537 538 retval = ext2fs_create_icount_tdb(ctx->fs, tdb_dir, flags, ret); 539 if (retval) 540 *ret = 0; 541 } 542 543 void e2fsck_pass1(e2fsck_t ctx) 544 { 545 int i; 546 __u64 max_sizes; 547 ext2_filsys fs = ctx->fs; 548 ext2_ino_t ino; 549 struct ext2_inode *inode; 550 ext2_inode_scan scan; 551 char *block_buf; 552 #ifdef RESOURCE_TRACK 553 struct resource_track rtrack; 554 #endif 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; 559 const char *old_op; 560 int imagic_fs, extent_fs; 561 int busted_fs_time = 0; 562 int inode_size; 563 564 init_resource_track(&rtrack, ctx->fs->io); 565 clear_problem_context(&pctx); 566 567 if (!(ctx->options & E2F_OPT_PREEN)) 568 fix_problem(ctx, PR_1_PASS_HEADER, &pctx); 569 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; 574 } 575 576 #ifdef MTRACE 577 mtrace_print("Pass 1"); 578 #endif 579 580 #define EXT2_BPP(bits) (1ULL << ((bits) - 2)) 581 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; 588 } 589 #undef EXT2_BPP 590 591 imagic_fs = (sb->s_feature_compat & EXT2_FEATURE_COMPAT_IMAGIC_INODES); 592 extent_fs = (sb->s_feature_incompat & EXT3_FEATURE_INCOMPAT_EXTENTS); 593 594 /* 595 * Allocate bitmaps structures 596 */ 597 pctx.errcode = ext2fs_allocate_inode_bitmap(fs, _("in-use inode map"), 598 &ctx->inode_used_map); 599 if (pctx.errcode) { 600 pctx.num = 1; 601 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx); 602 ctx->flags |= E2F_FLAG_ABORT; 603 return; 604 } 605 pctx.errcode = ext2fs_allocate_inode_bitmap(fs, 606 _("directory inode map"), &ctx->inode_dir_map); 607 if (pctx.errcode) { 608 pctx.num = 2; 609 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx); 610 ctx->flags |= E2F_FLAG_ABORT; 611 return; 612 } 613 pctx.errcode = ext2fs_allocate_inode_bitmap(fs, 614 _("regular file inode map"), &ctx->inode_reg_map); 615 if (pctx.errcode) { 616 pctx.num = 6; 617 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx); 618 ctx->flags |= E2F_FLAG_ABORT; 619 return; 620 } 621 pctx.errcode = ext2fs_allocate_block_bitmap(fs, _("in-use block map"), 622 &ctx->block_found_map); 623 if (pctx.errcode) { 624 pctx.num = 1; 625 fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, &pctx); 626 ctx->flags |= E2F_FLAG_ABORT; 627 return; 628 } 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); 633 if (pctx.errcode) { 634 fix_problem(ctx, PR_1_ALLOCATE_ICOUNT, &pctx); 635 ctx->flags |= E2F_FLAG_ABORT; 636 return; 637 } 638 inode_size = EXT2_INODE_SIZE(fs->super); 639 inode = (struct ext2_inode *) 640 e2fsck_allocate_memory(ctx, inode_size, "scratch inode"); 641 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; 648 649 pctx.errcode = ext2fs_init_dblist(fs, 0); 650 if (pctx.errcode) { 651 fix_problem(ctx, PR_1_ALLOCATE_DBCOUNT, &pctx); 652 ctx->flags |= E2F_FLAG_ABORT; 653 ext2fs_free_mem(&inode); 654 return; 655 } 656 657 /* 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. 663 */ 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); 668 } 669 } 670 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, 677 &scan); 678 ehandler_operation(old_op); 679 if (pctx.errcode) { 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); 684 return; 685 } 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); 691 if (ctx->progress) 692 if ((ctx->progress)(ctx, 1, 0, ctx->fs->group_desc_count)) 693 return; 694 if ((fs->super->s_wtime < fs->super->s_inodes_count) || 695 (fs->super->s_mtime < fs->super->s_inodes_count)) 696 busted_fs_time = 1; 697 698 while (1) { 699 old_op = ehandler_operation(_("getting next inode from scan")); 700 pctx.errcode = ext2fs_get_next_inode_full(scan, &ino, 701 inode, inode_size); 702 ehandler_operation(old_op); 703 if (ctx->flags & E2F_FLAG_SIGNAL_MASK) 704 return; 705 if (pctx.errcode == EXT2_ET_BAD_BLOCK_IN_INODE_TABLE) { 706 if (!ctx->inode_bb_map) 707 alloc_bb_map(ctx); 708 ext2fs_mark_inode_bitmap(ctx->inode_bb_map, ino); 709 ext2fs_mark_inode_bitmap(ctx->inode_used_map, ino); 710 continue; 711 } 712 if (pctx.errcode) { 713 fix_problem(ctx, PR_1_ISCAN_ERROR, &pctx); 714 ctx->flags |= E2F_FLAG_ABORT; 715 return; 716 } 717 if (!ino) 718 break; 719 pctx.ino = ino; 720 pctx.inode = inode; 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); 725 if (pctx.errcode) { 726 pctx.num = inode->i_links_count; 727 fix_problem(ctx, PR_1_ICOUNT_STORE, &pctx); 728 ctx->flags |= E2F_FLAG_ABORT; 729 return; 730 } 731 } 732 733 /* 734 * Test for incorrect extent flag settings. 735 * 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. 741 */ 742 743 /* 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. 747 */ 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); 756 extent_fs = 1; 757 } else if (fix_problem(ctx, PR_1_EXTENTS_SET, &pctx)) { 758 clear_inode: 759 e2fsck_clear_inode(ctx, ino, inode, 0, "pass1"); 760 if (ino == EXT2_BAD_INO) 761 ext2fs_mark_inode_bitmap(ctx->inode_used_map, 762 ino); 763 continue; 764 } 765 } 766 767 /* 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. 774 */ 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))) { 780 void *ehp; 781 #ifdef WORDS_BIGENDIAN 782 __u32 tmp_block[EXT2_N_BLOCKS]; 783 784 for (i = 0; i < EXT2_N_BLOCKS; i++) 785 tmp_block[i] = ext2fs_swab32(inode->i_block[i]); 786 ehp = tmp_block; 787 #else 788 ehp = inode->i_block; 789 #endif 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)); 797 #endif 798 e2fsck_write_inode(ctx, ino, inode, "pass1"); 799 } 800 } 801 802 if (ino == EXT2_BAD_INO) { 803 struct process_block_struct pb; 804 805 pctx.errcode = ext2fs_copy_bitmap(ctx->block_found_map, 806 &pb.fs_meta_blocks); 807 if (pctx.errcode) { 808 pctx.num = 4; 809 fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, &pctx); 810 ctx->flags |= E2F_FLAG_ABORT; 811 return; 812 } 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; 819 pb.inode = inode; 820 pb.pctx = &pctx; 821 pb.ctx = ctx; 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); 825 if (pctx.errcode) { 826 fix_problem(ctx, PR_1_BLOCK_ITERATE, &pctx); 827 ctx->flags |= E2F_FLAG_ABORT; 828 return; 829 } 830 if (pb.bbcheck) 831 if (!fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK_PROMPT, &pctx)) { 832 ctx->flags |= E2F_FLAG_ABORT; 833 return; 834 } 835 ext2fs_mark_inode_bitmap(ctx->inode_used_map, ino); 836 clear_problem_context(&pctx); 837 continue; 838 } else if (ino == EXT2_ROOT_INO) { 839 /* 840 * Make sure the root inode is a directory; if 841 * not, offer to clear it. It will be 842 * regnerated in pass #3. 843 */ 844 if (!LINUX_S_ISDIR(inode->i_mode)) { 845 if (fix_problem(ctx, PR_1_ROOT_NO_DIR, &pctx)) 846 goto clear_inode; 847 } 848 /* 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 855 * as a special case. 856 */ 857 if (inode->i_dtime && inode->i_links_count) { 858 if (fix_problem(ctx, PR_1_ROOT_DTIME, &pctx)) { 859 inode->i_dtime = 0; 860 e2fsck_write_inode(ctx, ino, inode, 861 "pass1"); 862 } 863 } 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, 869 &pctx)) { 870 inode->i_mode = LINUX_S_IFREG; 871 e2fsck_write_inode(ctx, ino, inode, 872 "pass1"); 873 } 874 check_blocks(ctx, &pctx, block_buf); 875 continue; 876 } 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, 880 &pctx)) { 881 memset(inode, 0, inode_size); 882 ext2fs_icount_store(ctx->inode_link_info, 883 ino, 0); 884 e2fsck_write_inode_full(ctx, ino, inode, 885 inode_size, "pass1"); 886 } 887 } else if (ino < EXT2_FIRST_INODE(fs->super)) { 888 int problem = 0; 889 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) { 895 if (inode->i_mode && 896 !LINUX_S_ISREG(inode->i_mode)) 897 problem = PR_1_RESERVED_BAD_MODE; 898 } else { 899 if (inode->i_mode != 0) 900 problem = PR_1_RESERVED_BAD_MODE; 901 } 902 if (problem) { 903 if (fix_problem(ctx, problem, &pctx)) { 904 inode->i_mode = 0; 905 e2fsck_write_inode(ctx, ino, inode, 906 "pass1"); 907 } 908 } 909 check_blocks(ctx, &pctx, block_buf); 910 continue; 911 } 912 /* 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 916 * corrupted. 917 * 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. :-) 928 */ 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 ? 933 0 : ctx->now; 934 e2fsck_write_inode(ctx, ino, inode, 935 "pass1"); 936 } 937 } 938 939 /* 940 * This code assumes that deleted inodes have 941 * i_links_count set to 0. 942 */ 943 if (!inode->i_links_count) { 944 if (!inode->i_dtime && inode->i_mode) { 945 if (fix_problem(ctx, 946 PR_1_ZERO_DTIME, &pctx)) { 947 inode->i_dtime = ctx->now; 948 e2fsck_write_inode(ctx, ino, inode, 949 "pass1"); 950 } 951 } 952 continue; 953 } 954 /* 955 * n.b. 0.3c ext2fs code didn't clear i_links_count for 956 * deleted files. Oops. 957 * 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. 962 * 963 */ 964 if (inode->i_dtime) { 965 if (fix_problem(ctx, PR_1_SET_DTIME, &pctx)) { 966 inode->i_dtime = 0; 967 e2fsck_write_inode(ctx, ino, inode, "pass1"); 968 } 969 } 970 971 ext2fs_mark_inode_bitmap(ctx->inode_used_map, ino); 972 switch (fs->super->s_creator_os) { 973 case EXT2_OS_HURD: 974 frag = inode->osd2.hurd2.h_i_frag; 975 fsize = inode->osd2.hurd2.h_i_fsize; 976 break; 977 default: 978 frag = fsize = 0; 979 } 980 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) { 994 if (imagic_fs) { 995 if (!ctx->inode_imagic_map) 996 alloc_imagic_map(ctx); 997 ext2fs_mark_inode_bitmap(ctx->inode_imagic_map, 998 ino); 999 } else { 1000 if (fix_problem(ctx, PR_1_SET_IMAGIC, &pctx)) { 1001 inode->i_flags &= ~EXT2_IMAGIC_FL; 1002 e2fsck_write_inode(ctx, ino, 1003 inode, "pass1"); 1004 } 1005 } 1006 } 1007 1008 check_inode_extra_space(ctx, &pctx); 1009 check_is_really_dir(ctx, &pctx, block_buf); 1010 1011 /* 1012 * ext2fs_inode_has_valid_blocks does not actually look 1013 * at i_block[] values, so not endian-sensitive here. 1014 */ 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"); 1021 } 1022 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, 1042 block_buf)) { 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); 1048 continue; 1049 } 1050 } 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++; 1061 } else 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++; 1070 } 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++; 1079 } else 1080 check_blocks(ctx, &pctx, block_buf); 1081 1082 if (ctx->flags & E2F_FLAG_SIGNAL_MASK) 1083 return; 1084 1085 if (process_inode_count >= ctx->process_inode_size) { 1086 process_inodes(ctx, block_buf); 1087 1088 if (ctx->flags & E2F_FLAG_SIGNAL_MASK) 1089 return; 1090 } 1091 } 1092 process_inodes(ctx, block_buf); 1093 ext2fs_close_inode_scan(scan); 1094 1095 /* 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. 1099 */ 1100 if (ctx->refcount) { 1101 adjust_extattr_refcount(ctx, ctx->refcount, block_buf, -1); 1102 ea_refcount_free(ctx->refcount); 1103 ctx->refcount = 0; 1104 } 1105 if (ctx->refcount_extra) { 1106 adjust_extattr_refcount(ctx, ctx->refcount_extra, 1107 block_buf, +1); 1108 ea_refcount_free(ctx->refcount_extra); 1109 ctx->refcount_extra = 0; 1110 } 1111 1112 if (ctx->invalid_bitmaps) 1113 handle_fs_bad_blocks(ctx); 1114 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; 1119 } 1120 1121 if (ctx->flags & E2F_FLAG_RESIZE_INODE) { 1122 ext2fs_block_bitmap save_bmap; 1123 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); 1128 if (pctx.errcode) { 1129 if (!fix_problem(ctx, PR_1_RESIZE_INODE_CREATE, 1130 &pctx)) { 1131 ctx->flags |= E2F_FLAG_ABORT; 1132 return; 1133 } 1134 pctx.errcode = 0; 1135 } 1136 if (!pctx.errcode) { 1137 e2fsck_read_inode(ctx, EXT2_RESIZE_INO, inode, 1138 "recreate inode"); 1139 inode->i_mtime = ctx->now; 1140 e2fsck_write_inode(ctx, EXT2_RESIZE_INO, inode, 1141 "recreate inode"); 1142 } 1143 fs->block_map = save_bmap; 1144 ctx->flags &= ~E2F_FLAG_RESIZE_INODE; 1145 } 1146 1147 if (ctx->flags & E2F_FLAG_RESTART) { 1148 /* 1149 * Only the master copy of the superblock and block 1150 * group descriptors are going to be written during a 1151 * restart, so set the superblock to be used to be the 1152 * master superblock. 1153 */ 1154 ctx->use_superblock = 0; 1155 unwind_pass1(fs); 1156 goto endit; 1157 } 1158 1159 if (ctx->block_dup_map) { 1160 if (ctx->options & E2F_OPT_PREEN) { 1161 clear_problem_context(&pctx); 1162 fix_problem(ctx, PR_1_DUP_BLOCKS_PREENSTOP, &pctx); 1163 } 1164 e2fsck_pass1_dupblocks(ctx, block_buf); 1165 } 1166 ext2fs_free_mem(&inodes_to_process); 1167 endit: 1168 e2fsck_use_inode_shortcuts(ctx, 0); 1169 1170 ext2fs_free_mem(&block_buf); 1171 ext2fs_free_mem(&inode); 1172 1173 print_resource_track(ctx, _("Pass 1"), &rtrack, ctx->fs->io); 1174 } 1175 1176 /* 1177 * When the inode_scan routines call this callback at the end of the 1178 * glock group, call process_inodes. 1179 */ 1180 static errcode_t scan_callback(ext2_filsys fs, 1181 ext2_inode_scan scan EXT2FS_ATTR((unused)), 1182 dgrp_t group, void * priv_data) 1183 { 1184 struct scan_callback_struct *scan_struct; 1185 e2fsck_t ctx; 1186 1187 scan_struct = (struct scan_callback_struct *) priv_data; 1188 ctx = scan_struct->ctx; 1189 1190 process_inodes((e2fsck_t) fs->priv_data, scan_struct->block_buf); 1191 1192 if (ctx->progress) 1193 if ((ctx->progress)(ctx, 1, group+1, 1194 ctx->fs->group_desc_count)) 1195 return EXT2_ET_CANCEL_REQUESTED; 1196 1197 return 0; 1198 } 1199 1200 /* 1201 * Process the inodes in the "inodes to process" list. 1202 */ 1203 static void process_inodes(e2fsck_t ctx, char *block_buf) 1204 { 1205 int i; 1206 struct ext2_inode *old_stashed_inode; 1207 ext2_ino_t old_stashed_ino; 1208 const char *old_operation; 1209 char buf[80]; 1210 struct problem_context pctx; 1211 1212 #if 0 1213 printf("begin process_inodes: "); 1214 #endif 1215 if (process_inode_count == 0) 1216 return; 1217 old_operation = ehandler_operation(0); 1218 old_stashed_inode = ctx->stashed_inode; 1219 old_stashed_ino = ctx->stashed_ino; 1220 qsort(inodes_to_process, process_inode_count, 1221 sizeof(struct process_inode_block), process_inode_cmp); 1222 clear_problem_context(&pctx); 1223 for (i=0; i < process_inode_count; i++) { 1224 pctx.inode = ctx->stashed_inode = &inodes_to_process[i].inode; 1225 pctx.ino = ctx->stashed_ino = inodes_to_process[i].ino; 1226 1227 #if 0 1228 printf("%u ", pctx.ino); 1229 #endif 1230 sprintf(buf, _("reading indirect blocks of inode %u"), 1231 pctx.ino); 1232 ehandler_operation(buf); 1233 check_blocks(ctx, &pctx, block_buf); 1234 if (ctx->flags & E2F_FLAG_SIGNAL_MASK) 1235 break; 1236 } 1237 ctx->stashed_inode = old_stashed_inode; 1238 ctx->stashed_ino = old_stashed_ino; 1239 process_inode_count = 0; 1240 #if 0 1241 printf("end process inodes\n"); 1242 #endif 1243 ehandler_operation(old_operation); 1244 } 1245 1246 static EXT2_QSORT_TYPE process_inode_cmp(const void *a, const void *b) 1247 { 1248 const struct process_inode_block *ib_a = 1249 (const struct process_inode_block *) a; 1250 const struct process_inode_block *ib_b = 1251 (const struct process_inode_block *) b; 1252 int ret; 1253 1254 ret = (ib_a->inode.i_block[EXT2_IND_BLOCK] - 1255 ib_b->inode.i_block[EXT2_IND_BLOCK]); 1256 if (ret == 0) 1257 ret = ib_a->inode.i_file_acl - ib_b->inode.i_file_acl; 1258 if (ret == 0) 1259 ret = ib_a->ino - ib_b->ino; 1260 return ret; 1261 } 1262 1263 /* 1264 * Mark an inode as being bad in some what 1265 */ 1266 static void mark_inode_bad(e2fsck_t ctx, ino_t ino) 1267 { 1268 struct problem_context pctx; 1269 1270 if (!ctx->inode_bad_map) { 1271 clear_problem_context(&pctx); 1272 1273 pctx.errcode = ext2fs_allocate_inode_bitmap(ctx->fs, 1274 _("bad inode map"), &ctx->inode_bad_map); 1275 if (pctx.errcode) { 1276 pctx.num = 3; 1277 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx); 1278 /* Should never get here */ 1279 ctx->flags |= E2F_FLAG_ABORT; 1280 return; 1281 } 1282 } 1283 ext2fs_mark_inode_bitmap(ctx->inode_bad_map, ino); 1284 } 1285 1286 1287 /* 1288 * This procedure will allocate the inode "bb" (badblock) map table 1289 */ 1290 static void alloc_bb_map(e2fsck_t ctx) 1291 { 1292 struct problem_context pctx; 1293 1294 clear_problem_context(&pctx); 1295 pctx.errcode = ext2fs_allocate_inode_bitmap(ctx->fs, 1296 _("inode in bad block map"), 1297 &ctx->inode_bb_map); 1298 if (pctx.errcode) { 1299 pctx.num = 4; 1300 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx); 1301 /* Should never get here */ 1302 ctx->flags |= E2F_FLAG_ABORT; 1303 return; 1304 } 1305 } 1306 1307 /* 1308 * This procedure will allocate the inode imagic table 1309 */ 1310 static void alloc_imagic_map(e2fsck_t ctx) 1311 { 1312 struct problem_context pctx; 1313 1314 clear_problem_context(&pctx); 1315 pctx.errcode = ext2fs_allocate_inode_bitmap(ctx->fs, 1316 _("imagic inode map"), 1317 &ctx->inode_imagic_map); 1318 if (pctx.errcode) { 1319 pctx.num = 5; 1320 fix_problem(ctx, PR_1_ALLOCATE_IBITMAP_ERROR, &pctx); 1321 /* Should never get here */ 1322 ctx->flags |= E2F_FLAG_ABORT; 1323 return; 1324 } 1325 } 1326 1327 /* 1328 * Marks a block as in use, setting the dup_map if it's been set 1329 * already. Called by process_block and process_bad_block. 1330 * 1331 * WARNING: Assumes checks have already been done to make sure block 1332 * is valid. This is true in both process_block and process_bad_block. 1333 */ 1334 static _INLINE_ void mark_block_used(e2fsck_t ctx, blk_t block) 1335 { 1336 struct problem_context pctx; 1337 1338 clear_problem_context(&pctx); 1339 1340 if (ext2fs_fast_test_block_bitmap(ctx->block_found_map, block)) { 1341 if (!ctx->block_dup_map) { 1342 pctx.errcode = ext2fs_allocate_block_bitmap(ctx->fs, 1343 _("multiply claimed block map"), 1344 &ctx->block_dup_map); 1345 if (pctx.errcode) { 1346 pctx.num = 3; 1347 fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, 1348 &pctx); 1349 /* Should never get here */ 1350 ctx->flags |= E2F_FLAG_ABORT; 1351 return; 1352 } 1353 } 1354 ext2fs_fast_mark_block_bitmap(ctx->block_dup_map, block); 1355 } else { 1356 ext2fs_fast_mark_block_bitmap(ctx->block_found_map, block); 1357 } 1358 } 1359 1360 /* 1361 * Adjust the extended attribute block's reference counts at the end 1362 * of pass 1, either by subtracting out references for EA blocks that 1363 * are still referenced in ctx->refcount, or by adding references for 1364 * EA blocks that had extra references as accounted for in 1365 * ctx->refcount_extra. 1366 */ 1367 static void adjust_extattr_refcount(e2fsck_t ctx, ext2_refcount_t refcount, 1368 char *block_buf, int adjust_sign) 1369 { 1370 struct ext2_ext_attr_header *header; 1371 struct problem_context pctx; 1372 ext2_filsys fs = ctx->fs; 1373 blk_t blk; 1374 __u32 should_be; 1375 int count; 1376 1377 clear_problem_context(&pctx); 1378 1379 ea_refcount_intr_begin(refcount); 1380 while (1) { 1381 if ((blk = ea_refcount_intr_next(refcount, &count)) == 0) 1382 break; 1383 pctx.blk = blk; 1384 pctx.errcode = ext2fs_read_ext_attr(fs, blk, block_buf); 1385 if (pctx.errcode) { 1386 fix_problem(ctx, PR_1_EXTATTR_READ_ABORT, &pctx); 1387 return; 1388 } 1389 header = (struct ext2_ext_attr_header *) block_buf; 1390 pctx.blkcount = header->h_refcount; 1391 should_be = header->h_refcount + adjust_sign * count; 1392 pctx.num = should_be; 1393 if (fix_problem(ctx, PR_1_EXTATTR_REFCOUNT, &pctx)) { 1394 header->h_refcount = should_be; 1395 pctx.errcode = ext2fs_write_ext_attr(fs, blk, 1396 block_buf); 1397 if (pctx.errcode) { 1398 fix_problem(ctx, PR_1_EXTATTR_WRITE_ABORT, 1399 &pctx); 1400 continue; 1401 } 1402 } 1403 } 1404 } 1405 1406 /* 1407 * Handle processing the extended attribute blocks 1408 */ 1409 static int check_ext_attr(e2fsck_t ctx, struct problem_context *pctx, 1410 char *block_buf) 1411 { 1412 ext2_filsys fs = ctx->fs; 1413 ext2_ino_t ino = pctx->ino; 1414 struct ext2_inode *inode = pctx->inode; 1415 blk_t blk; 1416 char * end; 1417 struct ext2_ext_attr_header *header; 1418 struct ext2_ext_attr_entry *entry; 1419 int count; 1420 region_t region = 0; 1421 1422 blk = inode->i_file_acl; 1423 if (blk == 0) 1424 return 0; 1425 1426 /* 1427 * If the Extended attribute flag isn't set, then a non-zero 1428 * file acl means that the inode is corrupted. 1429 * 1430 * Or if the extended attribute block is an invalid block, 1431 * then the inode is also corrupted. 1432 */ 1433 if (!(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_EXT_ATTR) || 1434 (blk < fs->super->s_first_data_block) || 1435 (blk >= fs->super->s_blocks_count)) { 1436 mark_inode_bad(ctx, ino); 1437 return 0; 1438 } 1439 1440 /* If ea bitmap hasn't been allocated, create it */ 1441 if (!ctx->block_ea_map) { 1442 pctx->errcode = ext2fs_allocate_block_bitmap(fs, 1443 _("ext attr block map"), 1444 &ctx->block_ea_map); 1445 if (pctx->errcode) { 1446 pctx->num = 2; 1447 fix_problem(ctx, PR_1_ALLOCATE_BBITMAP_ERROR, pctx); 1448 ctx->flags |= E2F_FLAG_ABORT; 1449 return 0; 1450 } 1451 } 1452 1453 /* Create the EA refcount structure if necessary */ 1454 if (!ctx->refcount) { 1455 pctx->errcode = ea_refcount_create(0, &ctx->refcount); 1456 if (pctx->errcode) { 1457 pctx->num = 1; 1458 fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx); 1459 ctx->flags |= E2F_FLAG_ABORT; 1460 return 0; 1461 } 1462 } 1463 1464 #if 0 1465 /* Debugging text */ 1466 printf("Inode %u has EA block %u\n", ino, blk); 1467 #endif 1468 1469 /* Have we seen this EA block before? */ 1470 if (ext2fs_fast_test_block_bitmap(ctx->block_ea_map, blk)) { 1471 if (ea_refcount_decrement(ctx->refcount, blk, 0) == 0) 1472 return 1; 1473 /* Ooops, this EA was referenced more than it stated */ 1474 if (!ctx->refcount_extra) { 1475 pctx->errcode = ea_refcount_create(0, 1476 &ctx->refcount_extra); 1477 if (pctx->errcode) { 1478 pctx->num = 2; 1479 fix_problem(ctx, PR_1_ALLOCATE_REFCOUNT, pctx); 1480 ctx->flags |= E2F_FLAG_ABORT; 1481 return 0; 1482 } 1483 } 1484 ea_refcount_increment(ctx->refcount_extra, blk, 0); 1485 return 1; 1486 } 1487 1488 /* 1489 * OK, we haven't seen this EA block yet. So we need to 1490 * validate it 1491 */ 1492 pctx->blk = blk; 1493 pctx->errcode = ext2fs_read_ext_attr(fs, blk, block_buf); 1494 if (pctx->errcode && fix_problem(ctx, PR_1_READ_EA_BLOCK, pctx)) 1495 goto clear_extattr; 1496 header = (struct ext2_ext_attr_header *) block_buf; 1497 pctx->blk = inode->i_file_acl; 1498 if (((ctx->ext_attr_ver == 1) && 1499 (header->h_magic != EXT2_EXT_ATTR_MAGIC_v1)) || 1500 ((ctx->ext_attr_ver == 2) && 1501 (header->h_magic != EXT2_EXT_ATTR_MAGIC))) { 1502 if (fix_problem(ctx, PR_1_BAD_EA_BLOCK, pctx)) 1503 goto clear_extattr; 1504 } 1505 1506 if (header->h_blocks != 1) { 1507 if (fix_problem(ctx, PR_1_EA_MULTI_BLOCK, pctx)) 1508 goto clear_extattr; 1509 } 1510 1511 region = region_create(0, fs->blocksize); 1512 if (!region) { 1513 fix_problem(ctx, PR_1_EA_ALLOC_REGION_ABORT, pctx); 1514 ctx->flags |= E2F_FLAG_ABORT; 1515 return 0; 1516 } 1517 if (region_allocate(region, 0, sizeof(struct ext2_ext_attr_header))) { 1518 if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx)) 1519 goto clear_extattr; 1520 } 1521 1522 entry = (struct ext2_ext_attr_entry *)(header+1); 1523 end = block_buf + fs->blocksize; 1524 while ((char *)entry < end && *(__u32 *)entry) { 1525 __u32 hash; 1526 1527 if (region_allocate(region, (char *)entry - (char *)header, 1528 EXT2_EXT_ATTR_LEN(entry->e_name_len))) { 1529 if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx)) 1530 goto clear_extattr; 1531 break; 1532 } 1533 if ((ctx->ext_attr_ver == 1 && 1534 (entry->e_name_len == 0 || entry->e_name_index != 0)) || 1535 (ctx->ext_attr_ver == 2 && 1536 entry->e_name_index == 0)) { 1537 if (fix_problem(ctx, PR_1_EA_BAD_NAME, pctx)) 1538 goto clear_extattr; 1539 break; 1540 } 1541 if (entry->e_value_block != 0) { 1542 if (fix_problem(ctx, PR_1_EA_BAD_VALUE, pctx)) 1543 goto clear_extattr; 1544 } 1545 if (entry->e_value_offs + entry->e_value_size > fs->blocksize) { 1546 if (fix_problem(ctx, PR_1_EA_BAD_VALUE, pctx)) 1547 goto clear_extattr; 1548 break; 1549 } 1550 if (entry->e_value_size && 1551 region_allocate(region, entry->e_value_offs, 1552 EXT2_EXT_ATTR_SIZE(entry->e_value_size))) { 1553 if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx)) 1554 goto clear_extattr; 1555 } 1556 1557 hash = ext2fs_ext_attr_hash_entry(entry, block_buf + 1558 entry->e_value_offs); 1559 1560 if (entry->e_hash != hash) { 1561 pctx->num = entry->e_hash; 1562 if (fix_problem(ctx, PR_1_ATTR_HASH, pctx)) 1563 goto clear_extattr; 1564 entry->e_hash = hash; 1565 } 1566 1567 entry = EXT2_EXT_ATTR_NEXT(entry); 1568 } 1569 if (region_allocate(region, (char *)entry - (char *)header, 4)) { 1570 if (fix_problem(ctx, PR_1_EA_ALLOC_COLLISION, pctx)) 1571 goto clear_extattr; 1572 } 1573 region_free(region); 1574 1575 count = header->h_refcount - 1; 1576 if (count) 1577 ea_refcount_store(ctx->refcount, blk, count); 1578 mark_block_used(ctx, blk); 1579 ext2fs_fast_mark_block_bitmap(ctx->block_ea_map, blk); 1580 return 1; 1581 1582 clear_extattr: 1583 if (region) 1584 region_free(region); 1585 inode->i_file_acl = 0; 1586 e2fsck_write_inode(ctx, ino, inode, "check_ext_attr"); 1587 return 0; 1588 } 1589 1590 /* Returns 1 if bad htree, 0 if OK */ 1591 static int handle_htree(e2fsck_t ctx, struct problem_context *pctx, 1592 ext2_ino_t ino, struct ext2_inode *inode, 1593 char *block_buf) 1594 { 1595 struct ext2_dx_root_info *root; 1596 ext2_filsys fs = ctx->fs; 1597 errcode_t retval; 1598 blk_t blk; 1599 1600 if ((!LINUX_S_ISDIR(inode->i_mode) && 1601 fix_problem(ctx, PR_1_HTREE_NODIR, pctx)) || 1602 (!(fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_DIR_INDEX) && 1603 fix_problem(ctx, PR_1_HTREE_SET, pctx))) 1604 return 1; 1605 1606 pctx->errcode = ext2fs_bmap(fs, ino, inode, 0, 0, 0, &blk); 1607 1608 if ((pctx->errcode) || 1609 (blk == 0) || 1610 (blk < fs->super->s_first_data_block) || 1611 (blk >= fs->super->s_blocks_count)) { 1612 if (fix_problem(ctx, PR_1_HTREE_BADROOT, pctx)) 1613 return 1; 1614 else 1615 return 0; 1616 } 1617 1618 retval = io_channel_read_blk(fs->io, blk, 1, block_buf); 1619 if (retval && fix_problem(ctx, PR_1_HTREE_BADROOT, pctx)) 1620 return 1; 1621 1622 /* XXX should check that beginning matches a directory */ 1623 root = (struct ext2_dx_root_info *) (block_buf + 24); 1624 1625 if ((root->reserved_zero || root->info_length < 8) && 1626 fix_problem(ctx, PR_1_HTREE_BADROOT, pctx)) 1627 return 1; 1628 1629 pctx->num = root->hash_version; 1630 if ((root->hash_version != EXT2_HASH_LEGACY) && 1631 (root->hash_version != EXT2_HASH_HALF_MD4) && 1632 (root->hash_version != EXT2_HASH_TEA) && 1633 fix_problem(ctx, PR_1_HTREE_HASHV, pctx)) 1634 return 1; 1635 1636 if ((root->unused_flags & EXT2_HASH_FLAG_INCOMPAT) && 1637 fix_problem(ctx, PR_1_HTREE_INCOMPAT, pctx)) 1638 return 1; 1639 1640 pctx->num = root->indirect_levels; 1641 if ((root->indirect_levels > 1) && 1642 fix_problem(ctx, PR_1_HTREE_DEPTH, pctx)) 1643 return 1; 1644 1645 return 0; 1646 } 1647 1648 void e2fsck_clear_inode(e2fsck_t ctx, ext2_ino_t ino, 1649 struct ext2_inode *inode, int restart_flag, 1650 const char *source) 1651 { 1652 inode->i_flags = 0; 1653 inode->i_links_count = 0; 1654 ext2fs_icount_store(ctx->inode_link_info, ino, 0); 1655 inode->i_dtime = ctx->now; 1656 1657 ext2fs_unmark_inode_bitmap(ctx->inode_dir_map, ino); 1658 ext2fs_unmark_inode_bitmap(ctx->inode_used_map, ino); 1659 if (ctx->inode_reg_map) 1660 ext2fs_unmark_inode_bitmap(ctx->inode_reg_map, ino); 1661 if (ctx->inode_bad_map) 1662 ext2fs_unmark_inode_bitmap(ctx->inode_bad_map, ino); 1663 1664 /* 1665 * If the inode was partially accounted for before processing 1666 * was aborted, we need to restart the pass 1 scan. 1667 */ 1668 ctx->flags |= restart_flag; 1669 1670 e2fsck_write_inode(ctx, ino, inode, source); 1671 } 1672 1673 static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx, 1674 struct process_block_struct *pb, 1675 blk64_t start_block, 1676 ext2_extent_handle_t ehandle) 1677 { 1678 struct ext2fs_extent extent; 1679 blk_t blk; 1680 e2_blkcnt_t blockcnt; 1681 unsigned int i; 1682 int is_dir, is_leaf; 1683 errcode_t problem; 1684 struct ext2_extent_info info; 1685 1686 pctx->errcode = ext2fs_extent_get_info(ehandle, &info); 1687 if (pctx->errcode) 1688 return; 1689 1690 pctx->errcode = ext2fs_extent_get(ehandle, EXT2_EXTENT_FIRST_SIB, 1691 &extent); 1692 while (!pctx->errcode && info.num_entries-- > 0) { 1693 is_leaf = extent.e_flags & EXT2_EXTENT_FLAGS_LEAF; 1694 is_dir = LINUX_S_ISDIR(pctx->inode->i_mode); 1695 1696 problem = 0; 1697 if (extent.e_pblk == 0 || 1698 extent.e_pblk < ctx->fs->super->s_first_data_block || 1699 extent.e_pblk >= ctx->fs->super->s_blocks_count) 1700 problem = PR_1_EXTENT_BAD_START_BLK; 1701 else if (extent.e_lblk < start_block) 1702 problem = PR_1_OUT_OF_ORDER_EXTENTS; 1703 else if (is_leaf && 1704 (extent.e_pblk + extent.e_len) > 1705 ctx->fs->super->s_blocks_count) 1706 problem = PR_1_EXTENT_ENDS_BEYOND; 1707 1708 if (problem) { 1709 report_problem: 1710 pctx->blk = extent.e_pblk; 1711 pctx->blk2 = extent.e_lblk; 1712 pctx->num = extent.e_len; 1713 if (fix_problem(ctx, problem, pctx)) { 1714 e2fsck_read_bitmaps(ctx); 1715 pctx->errcode = 1716 ext2fs_extent_delete(ehandle, 0); 1717 if (pctx->errcode) { 1718 pctx->str = "ext2fs_extent_delete"; 1719 return; 1720 } 1721 pctx->errcode = ext2fs_extent_get(ehandle, 1722 EXT2_EXTENT_CURRENT, 1723 &extent); 1724 if (pctx->errcode == EXT2_ET_NO_CURRENT_NODE) { 1725 pctx->errcode = 0; 1726 break; 1727 } 1728 continue; 1729 } 1730 goto next; 1731 } 1732 1733 if (!is_leaf) { 1734 blk = extent.e_pblk; 1735 pctx->errcode = ext2fs_extent_get(ehandle, 1736 EXT2_EXTENT_DOWN, &extent); 1737 if (pctx->errcode) { 1738 pctx->str = "EXT2_EXTENT_DOWN"; 1739 problem = PR_1_EXTENT_HEADER_INVALID; 1740 if (pctx->errcode == EXT2_ET_EXTENT_HEADER_BAD) 1741 goto report_problem; 1742 return; 1743 } 1744 scan_extent_node(ctx, pctx, pb, extent.e_lblk, ehandle); 1745 if (pctx->errcode) 1746 return; 1747 pctx->errcode = ext2fs_extent_get(ehandle, 1748 EXT2_EXTENT_UP, &extent); 1749 if (pctx->errcode) { 1750 pctx->str = "EXT2_EXTENT_UP"; 1751 return; 1752 } 1753 mark_block_used(ctx, blk); 1754 pb->num_blocks++; 1755 goto next; 1756 } 1757 1758 if ((pb->previous_block != 0) && 1759 (pb->previous_block+1 != extent.e_pblk)) { 1760 if (ctx->options & E2F_OPT_FRAGCHECK) { 1761 char type = '?'; 1762 1763 if (pb->is_dir) 1764 type = 'd'; 1765 else if (pb->is_reg) 1766 type = 'f'; 1767 1768 printf(("%6lu(%c): expecting %6lu " 1769 "actual extent " 1770 "phys %6lu log %lu len %lu\n"), 1771 (unsigned long) pctx->ino, type, 1772 (unsigned long) pb->previous_block+1, 1773 (unsigned long) extent.e_pblk, 1774 (unsigned long) extent.e_lblk, 1775 (unsigned long) extent.e_len); 1776 } 1777 pb->fragmented = 1; 1778 } 1779 while (is_dir && ++pb->last_db_block < extent.e_lblk) { 1780 pctx->errcode = ext2fs_add_dir_block(ctx->fs->dblist, 1781 pb->ino, 0, 1782 pb->last_db_block); 1783 if (pctx->errcode) { 1784 pctx->blk = 0; 1785 pctx->num = pb->last_db_block; 1786 goto failed_add_dir_block; 1787 } 1788 } 1789 for (blk = extent.e_pblk, blockcnt = extent.e_lblk, i = 0; 1790 i < extent.e_len; 1791 blk++, blockcnt++, i++) { 1792 mark_block_used(ctx, blk); 1793 1794 if (is_dir) { 1795 pctx->errcode = ext2fs_add_dir_block(ctx->fs->dblist, pctx->ino, blk, blockcnt); 1796 if (pctx->errcode) { 1797 pctx->blk = blk; 1798 pctx->num = blockcnt; 1799 failed_add_dir_block: 1800 fix_problem(ctx, PR_1_ADD_DBLOCK, pctx); 1801 /* Should never get here */ 1802 ctx->flags |= E2F_FLAG_ABORT; 1803 return; 1804 } 1805 } 1806 } 1807 if (is_dir && extent.e_len > 0) 1808 pb->last_db_block = blockcnt - 1; 1809 pb->num_blocks += extent.e_len; 1810 pb->previous_block = extent.e_pblk + extent.e_len - 1; 1811 start_block = pb->last_block = extent.e_lblk + extent.e_len - 1; 1812 next: 1813 pctx->errcode = ext2fs_extent_get(ehandle, 1814 EXT2_EXTENT_NEXT_SIB, 1815 &extent); 1816 } 1817 if (pctx->errcode == EXT2_ET_EXTENT_NO_NEXT) 1818 pctx->errcode = 0; 1819 } 1820 1821 static void check_blocks_extents(e2fsck_t ctx, struct problem_context *pctx, 1822 struct process_block_struct *pb) 1823 { 1824 struct ext2_extent_info info; 1825 struct ext2_inode *inode = pctx->inode; 1826 ext2_extent_handle_t ehandle; 1827 ext2_filsys fs = ctx->fs; 1828 ext2_ino_t ino = pctx->ino; 1829 errcode_t retval; 1830 1831 pctx->errcode = ext2fs_extent_open2(fs, ino, inode, &ehandle); 1832 if (pctx->errcode) { 1833 if (fix_problem(ctx, PR_1_READ_EXTENT, pctx)) 1834 e2fsck_clear_inode(ctx, ino, inode, 0, 1835 "check_blocks_extents"); 1836 pctx->errcode = 0; 1837 return; 1838 } 1839 1840 retval = ext2fs_extent_get_info(ehandle, &info); 1841 if (retval == 0) { 1842 if (info.max_depth >= MAX_EXTENT_DEPTH_COUNT) 1843 info.max_depth = MAX_EXTENT_DEPTH_COUNT-1; 1844 ctx->extent_depth_count[info.max_depth]++; 1845 } 1846 1847 scan_extent_node(ctx, pctx, pb, 0, ehandle); 1848 if (pctx->errcode && 1849 fix_problem(ctx, PR_1_EXTENT_ITERATE_FAILURE, pctx)) { 1850 pb->num_blocks = 0; 1851 inode->i_blocks = 0; 1852 e2fsck_clear_inode(ctx, ino, inode, E2F_FLAG_RESTART, 1853 "check_blocks_extents"); 1854 pctx->errcode = 0; 1855 } 1856 ext2fs_extent_free(ehandle); 1857 } 1858 1859 static blk64_t ext2fs_inode_i_blocks(ext2_filsys fs, 1860 struct ext2_inode *inode) 1861 { 1862 return (inode->i_blocks | 1863 (fs->super->s_feature_ro_compat & 1864 EXT4_FEATURE_RO_COMPAT_HUGE_FILE ? 1865 (__u64)inode->osd2.linux2.l_i_blocks_hi << 32 : 0)); 1866 } 1867 1868 /* 1869 * This subroutine is called on each inode to account for all of the 1870 * blocks used by that inode. 1871 */ 1872 static void check_blocks(e2fsck_t ctx, struct problem_context *pctx, 1873 char *block_buf) 1874 { 1875 ext2_filsys fs = ctx->fs; 1876 struct process_block_struct pb; 1877 ext2_ino_t ino = pctx->ino; 1878 struct ext2_inode *inode = pctx->inode; 1879 int bad_size = 0; 1880 int dirty_inode = 0; 1881 int extent_fs; 1882 __u64 size; 1883 1884 pb.ino = ino; 1885 pb.num_blocks = 0; 1886 pb.last_block = -1; 1887 pb.last_db_block = -1; 1888 pb.num_illegal_blocks = 0; 1889 pb.suppress = 0; pb.clear = 0; 1890 pb.fragmented = 0; 1891 pb.compressed = 0; 1892 pb.previous_block = 0; 1893 pb.is_dir = LINUX_S_ISDIR(inode->i_mode); 1894 pb.is_reg = LINUX_S_ISREG(inode->i_mode); 1895 pb.max_blocks = 1 << (31 - fs->super->s_log_block_size); 1896 pb.inode = inode; 1897 pb.pctx = pctx; 1898 pb.ctx = ctx; 1899 pctx->ino = ino; 1900 pctx->errcode = 0; 1901 1902 extent_fs = (ctx->fs->super->s_feature_incompat & 1903 EXT3_FEATURE_INCOMPAT_EXTENTS); 1904 1905 if (inode->i_flags & EXT2_COMPRBLK_FL) { 1906 if (fs->super->s_feature_incompat & 1907 EXT2_FEATURE_INCOMPAT_COMPRESSION) 1908 pb.compressed = 1; 1909 else { 1910 if (fix_problem(ctx, PR_1_COMPR_SET, pctx)) { 1911 inode->i_flags &= ~EXT2_COMPRBLK_FL; 1912 dirty_inode++; 1913 } 1914 } 1915 } 1916 1917 if (inode->i_file_acl && check_ext_attr(ctx, pctx, block_buf)) { 1918 if (ctx->flags & E2F_FLAG_SIGNAL_MASK) 1919 goto out; 1920 pb.num_blocks++; 1921 } 1922 1923 if (ext2fs_inode_has_valid_blocks(inode)) { 1924 if (extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) 1925 check_blocks_extents(ctx, pctx, &pb); 1926 else 1927 pctx->errcode = ext2fs_block_iterate2(fs, ino, 1928 pb.is_dir ? BLOCK_FLAG_HOLE : 0, 1929 block_buf, process_block, &pb); 1930 } 1931 end_problem_latch(ctx, PR_LATCH_BLOCK); 1932 end_problem_latch(ctx, PR_LATCH_TOOBIG); 1933 if (ctx->flags & E2F_FLAG_SIGNAL_MASK) 1934 goto out; 1935 if (pctx->errcode) 1936 fix_problem(ctx, PR_1_BLOCK_ITERATE, pctx); 1937 1938 if (pb.fragmented && pb.num_blocks < fs->super->s_blocks_per_group) { 1939 if (LINUX_S_ISDIR(inode->i_mode)) 1940 ctx->fs_fragmented_dir++; 1941 else 1942 ctx->fs_fragmented++; 1943 } 1944 1945 if (pb.clear) { 1946 e2fsck_clear_inode(ctx, ino, inode, E2F_FLAG_RESTART, 1947 "check_blocks"); 1948 return; 1949 } 1950 1951 if (inode->i_flags & EXT2_INDEX_FL) { 1952 if (handle_htree(ctx, pctx, ino, inode, block_buf)) { 1953 inode->i_flags &= ~EXT2_INDEX_FL; 1954 dirty_inode++; 1955 } else { 1956 #ifdef ENABLE_HTREE 1957 e2fsck_add_dx_dir(ctx, ino, pb.last_block+1); 1958 #endif 1959 } 1960 } 1961 1962 if (!pb.num_blocks && pb.is_dir) { 1963 if (fix_problem(ctx, PR_1_ZERO_LENGTH_DIR, pctx)) { 1964 e2fsck_clear_inode(ctx, ino, inode, 0, "check_blocks"); 1965 ctx->fs_directory_count--; 1966 return; 1967 } 1968 } 1969 1970 if (!(fs->super->s_feature_ro_compat & 1971 EXT4_FEATURE_RO_COMPAT_HUGE_FILE) || 1972 !(inode->i_flags & EXT4_HUGE_FILE_FL)) 1973 pb.num_blocks *= (fs->blocksize / 512); 1974 #if 0 1975 printf("inode %u, i_size = %lu, last_block = %lld, i_blocks=%lu, num_blocks = %lu\n", 1976 ino, inode->i_size, pb.last_block, inode->i_blocks, 1977 pb.num_blocks); 1978 #endif 1979 if (pb.is_dir) { 1980 int nblock = inode->i_size >> EXT2_BLOCK_SIZE_BITS(fs->super); 1981 if (inode->i_size & (fs->blocksize - 1)) 1982 bad_size = 5; 1983 else if (nblock > (pb.last_block + 1)) 1984 bad_size = 1; 1985 else if (nblock < (pb.last_block + 1)) { 1986 if (((pb.last_block + 1) - nblock) > 1987 fs->super->s_prealloc_dir_blocks) 1988 bad_size = 2; 1989 } 1990 } else { 1991 e2_blkcnt_t blkpg = ctx->blocks_per_page; 1992 1993 size = EXT2_I_SIZE(inode); 1994 if ((pb.last_block >= 0) && 1995 /* allow allocated blocks to end of PAGE_SIZE */ 1996 (size < (__u64)pb.last_block * fs->blocksize) && 1997 (pb.last_block / blkpg * blkpg != pb.last_block || 1998 size < (__u64)(pb.last_block & ~(blkpg-1)) *fs->blocksize) && 1999 !(inode->i_flags & EXT4_EOFBLOCKS_FL)) 2000 bad_size = 3; 2001 else if (!(extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) && 2002 size > ext2_max_sizes[fs->super->s_log_block_size]) 2003 /* too big for a direct/indirect-mapped file */ 2004 bad_size = 4; 2005 else if ((extent_fs && (inode->i_flags & EXT4_EXTENTS_FL)) && 2006 size > 2007 ((1ULL << (32 + EXT2_BLOCK_SIZE_BITS(fs->super))) - 1)) 2008 /* too big for an extent-based file - 32bit ee_block */ 2009 bad_size = 6; 2010 2011 /* 2012 * Check to see if the EOFBLOCKS flag is set where it 2013 * doesn't need to be. 2014 */ 2015 if ((inode->i_flags & EXT4_EOFBLOCKS_FL) && 2016 (size >= (((__u64)pb.last_block + 1) * fs->blocksize))) { 2017 pctx->blkcount = pb.last_block; 2018 if (fix_problem(ctx, PR_1_EOFBLOCKS_FL_SET, pctx)) { 2019 inode->i_flags &= ~EXT4_EOFBLOCKS_FL; 2020 dirty_inode++; 2021 } 2022 } 2023 } 2024 /* i_size for symlinks is checked elsewhere */ 2025 if (bad_size && !LINUX_S_ISLNK(inode->i_mode)) { 2026 pctx->num = (pb.last_block+1) * fs->blocksize; 2027 pctx->group = bad_size; 2028 if (fix_problem(ctx, PR_1_BAD_I_SIZE, pctx)) { 2029 inode->i_size = pctx->num; 2030 if (!LINUX_S_ISDIR(inode->i_mode)) 2031 inode->i_size_high = pctx->num >> 32; 2032 dirty_inode++; 2033 } 2034 pctx->num = 0; 2035 } 2036 if (LINUX_S_ISREG(inode->i_mode) && 2037 (inode->i_size_high || inode->i_size & 0x80000000UL)) 2038 ctx->large_files++; 2039 if ((pb.num_blocks != ext2fs_inode_i_blocks(fs, inode)) || 2040 ((fs->super->s_feature_ro_compat & 2041 EXT4_FEATURE_RO_COMPAT_HUGE_FILE) && 2042 (inode->i_flags & EXT4_HUGE_FILE_FL) && 2043 (inode->osd2.linux2.l_i_blocks_hi != 0))) { 2044 pctx->num = pb.num_blocks; 2045 if (fix_problem(ctx, PR_1_BAD_I_BLOCKS, pctx)) { 2046 inode->i_blocks = pb.num_blocks; 2047 inode->osd2.linux2.l_i_blocks_hi = 0; 2048 dirty_inode++; 2049 } 2050 pctx->num = 0; 2051 } 2052 2053 if (ctx->dirs_to_hash && pb.is_dir && 2054 !(inode->i_flags & EXT2_INDEX_FL) && 2055 ((inode->i_size / fs->blocksize) >= 3)) 2056 ext2fs_u32_list_add(ctx->dirs_to_hash, ino); 2057 2058 out: 2059 if (dirty_inode) 2060 e2fsck_write_inode(ctx, ino, inode, "check_blocks"); 2061 } 2062 2063 #if 0 2064 /* 2065 * Helper function called by process block when an illegal block is 2066 * found. It returns a description about why the block is illegal 2067 */ 2068 static char *describe_illegal_block(ext2_filsys fs, blk_t block) 2069 { 2070 blk_t super; 2071 int i; 2072 static char problem[80]; 2073 2074 super = fs->super->s_first_data_block; 2075 strcpy(problem, "PROGRAMMING ERROR: Unknown reason for illegal block"); 2076 if (block < super) { 2077 sprintf(problem, "< FIRSTBLOCK (%u)", super); 2078 return(problem); 2079 } else if (block >= fs->super->s_blocks_count) { 2080 sprintf(problem, "> BLOCKS (%u)", fs->super->s_blocks_count); 2081 return(problem); 2082 } 2083 for (i = 0; i < fs->group_desc_count; i++) { 2084 if (block == super) { 2085 sprintf(problem, "is the superblock in group %d", i); 2086 break; 2087 } 2088 if (block > super && 2089 block <= (super + fs->desc_blocks)) { 2090 sprintf(problem, "is in the group descriptors " 2091 "of group %d", i); 2092 break; 2093 } 2094 if (block == fs->group_desc[i].bg_block_bitmap) { 2095 sprintf(problem, "is the block bitmap of group %d", i); 2096 break; 2097 } 2098 if (block == fs->group_desc[i].bg_inode_bitmap) { 2099 sprintf(problem, "is the inode bitmap of group %d", i); 2100 break; 2101 } 2102 if (block >= fs->group_desc[i].bg_inode_table && 2103 (block < fs->group_desc[i].bg_inode_table 2104 + fs->inode_blocks_per_group)) { 2105 sprintf(problem, "is in the inode table of group %d", 2106 i); 2107 break; 2108 } 2109 super += fs->super->s_blocks_per_group; 2110 } 2111 return(problem); 2112 } 2113 #endif 2114 2115 /* 2116 * This is a helper function for check_blocks(). 2117 */ 2118 static int process_block(ext2_filsys fs, 2119 blk_t *block_nr, 2120 e2_blkcnt_t blockcnt, 2121 blk_t ref_block EXT2FS_ATTR((unused)), 2122 int ref_offset EXT2FS_ATTR((unused)), 2123 void *priv_data) 2124 { 2125 struct process_block_struct *p; 2126 struct problem_context *pctx; 2127 blk_t blk = *block_nr; 2128 int ret_code = 0; 2129 int problem = 0; 2130 e2fsck_t ctx; 2131 2132 p = (struct process_block_struct *) priv_data; 2133 pctx = p->pctx; 2134 ctx = p->ctx; 2135 2136 if (p->compressed && (blk == EXT2FS_COMPRESSED_BLKADDR)) { 2137 /* todo: Check that the comprblk_fl is high, that the 2138 blkaddr pattern looks right (all non-holes up to 2139 first EXT2FS_COMPRESSED_BLKADDR, then all 2140 EXT2FS_COMPRESSED_BLKADDR up to end of cluster), 2141 that the feature_incompat bit is high, and that the 2142 inode is a regular file. If we're doing a "full 2143 check" (a concept introduced to e2fsck by e2compr, 2144 meaning that we look at data blocks as well as 2145 metadata) then call some library routine that 2146 checks the compressed data. I'll have to think 2147 about this, because one particularly important 2148 problem to be able to fix is to recalculate the 2149 cluster size if necessary. I think that perhaps 2150 we'd better do most/all e2compr-specific checks 2151 separately, after the non-e2compr checks. If not 2152 doing a full check, it may be useful to test that 2153 the personality is linux; e.g. if it isn't then 2154 perhaps this really is just an illegal block. */ 2155 return 0; 2156 } 2157 2158 if (blk == 0) 2159 return 0; 2160 2161 #if 0 2162 printf("Process_block, inode %lu, block %u, #%d\n", p->ino, blk, 2163 blockcnt); 2164 #endif 2165 2166 /* 2167 * Simplistic fragmentation check. We merely require that the 2168 * file be contiguous. (Which can never be true for really 2169 * big files that are greater than a block group.) 2170 */ 2171 if (!HOLE_BLKADDR(p->previous_block) && p->ino != EXT2_RESIZE_INO) { 2172 if (p->previous_block+1 != blk) { 2173 if (ctx->options & E2F_OPT_FRAGCHECK) { 2174 char type = '?'; 2175 2176 if (p->is_dir) 2177 type = 'd'; 2178 else if (p->is_reg) 2179 type = 'f'; 2180 2181 printf(_("%6lu(%c): expecting %6lu " 2182 "got phys %6lu (blkcnt %lld)\n"), 2183 (unsigned long) pctx->ino, type, 2184 (unsigned long) p->previous_block+1, 2185 (unsigned long) blk, 2186 blockcnt); 2187 } 2188 p->fragmented = 1; 2189 } 2190 } 2191 p->previous_block = blk; 2192 2193 if (p->is_dir && blockcnt > (1 << (21 - fs->super->s_log_block_size))) 2194 problem = PR_1_TOOBIG_DIR; 2195 if (p->is_reg && p->num_blocks+1 >= p->max_blocks) 2196 problem = PR_1_TOOBIG_REG; 2197 if (!p->is_dir && !p->is_reg && blockcnt > 0) 2198 problem = PR_1_TOOBIG_SYMLINK; 2199 2200 if (blk < fs->super->s_first_data_block || 2201 blk >= fs->super->s_blocks_count) 2202 problem = PR_1_ILLEGAL_BLOCK_NUM; 2203 2204 if (problem) { 2205 p->num_illegal_blocks++; 2206 if (!p->suppress && (p->num_illegal_blocks % 12) == 0) { 2207 if (fix_problem(ctx, PR_1_TOO_MANY_BAD_BLOCKS, pctx)) { 2208 p->clear = 1; 2209 return BLOCK_ABORT; 2210 } 2211 if (fix_problem(ctx, PR_1_SUPPRESS_MESSAGES, pctx)) { 2212 p->suppress = 1; 2213 set_latch_flags(PR_LATCH_BLOCK, 2214 PRL_SUPPRESS, 0); 2215 } 2216 } 2217 pctx->blk = blk; 2218 pctx->blkcount = blockcnt; 2219 if (fix_problem(ctx, problem, pctx)) { 2220 blk = *block_nr = 0; 2221 ret_code = BLOCK_CHANGED; 2222 goto mark_dir; 2223 } else 2224 return 0; 2225 } 2226 2227 if (p->ino == EXT2_RESIZE_INO) { 2228 /* 2229 * The resize inode has already be sanity checked 2230 * during pass #0 (the superblock checks). All we 2231 * have to do is mark the double indirect block as 2232 * being in use; all of the other blocks are handled 2233 * by mark_table_blocks()). 2234 */ 2235 if (blockcnt == BLOCK_COUNT_DIND) 2236 mark_block_used(ctx, blk); 2237 } else 2238 mark_block_used(ctx, blk); 2239 p->num_blocks++; 2240 if (blockcnt >= 0) 2241 p->last_block = blockcnt; 2242 mark_dir: 2243 if (p->is_dir && (blockcnt >= 0)) { 2244 while (++p->last_db_block < blockcnt) { 2245 pctx->errcode = ext2fs_add_dir_block(fs->dblist, 2246 p->ino, 0, 2247 p->last_db_block); 2248 if (pctx->errcode) { 2249 pctx->blk = 0; 2250 pctx->num = p->last_db_block; 2251 goto failed_add_dir_block; 2252 } 2253 } 2254 pctx->errcode = ext2fs_add_dir_block(fs->dblist, p->ino, 2255 blk, blockcnt); 2256 if (pctx->errcode) { 2257 pctx->blk = blk; 2258 pctx->num = blockcnt; 2259 failed_add_dir_block: 2260 fix_problem(ctx, PR_1_ADD_DBLOCK, pctx); 2261 /* Should never get here */ 2262 ctx->flags |= E2F_FLAG_ABORT; 2263 return BLOCK_ABORT; 2264 } 2265 } 2266 return ret_code; 2267 } 2268 2269 static int process_bad_block(ext2_filsys fs, 2270 blk_t *block_nr, 2271 e2_blkcnt_t blockcnt, 2272 blk_t ref_block EXT2FS_ATTR((unused)), 2273 int ref_offset EXT2FS_ATTR((unused)), 2274 void *priv_data) 2275 { 2276 struct process_block_struct *p; 2277 blk_t blk = *block_nr; 2278 blk_t first_block; 2279 dgrp_t i; 2280 struct problem_context *pctx; 2281 e2fsck_t ctx; 2282 2283 /* 2284 * Note: This function processes blocks for the bad blocks 2285 * inode, which is never compressed. So we don't use HOLE_BLKADDR(). 2286 */ 2287 2288 if (!blk) 2289 return 0; 2290 2291 p = (struct process_block_struct *) priv_data; 2292 ctx = p->ctx; 2293 pctx = p->pctx; 2294 2295 pctx->ino = EXT2_BAD_INO; 2296 pctx->blk = blk; 2297 pctx->blkcount = blockcnt; 2298 2299 if ((blk < fs->super->s_first_data_block) || 2300 (blk >= fs->super->s_blocks_count)) { 2301 if (fix_problem(ctx, PR_1_BB_ILLEGAL_BLOCK_NUM, pctx)) { 2302 *block_nr = 0; 2303 return BLOCK_CHANGED; 2304 } else 2305 return 0; 2306 } 2307 2308 if (blockcnt < 0) { 2309 if (ext2fs_test_block_bitmap(p->fs_meta_blocks, blk)) { 2310 p->bbcheck = 1; 2311 if (fix_problem(ctx, PR_1_BB_FS_BLOCK, pctx)) { 2312 *block_nr = 0; 2313 return BLOCK_CHANGED; 2314 } 2315 } else if (ext2fs_test_block_bitmap(ctx->block_found_map, 2316 blk)) { 2317 p->bbcheck = 1; 2318 if (fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK, 2319 pctx)) { 2320 *block_nr = 0; 2321 return BLOCK_CHANGED; 2322 } 2323 if (ctx->flags & E2F_FLAG_SIGNAL_MASK) 2324 return BLOCK_ABORT; 2325 } else 2326 mark_block_used(ctx, blk); 2327 return 0; 2328 } 2329 #if 0 2330 printf ("DEBUG: Marking %u as bad.\n", blk); 2331 #endif 2332 ctx->fs_badblocks_count++; 2333 /* 2334 * If the block is not used, then mark it as used and return. 2335 * If it is already marked as found, this must mean that 2336 * there's an overlap between the filesystem table blocks 2337 * (bitmaps and inode table) and the bad block list. 2338 */ 2339 if (!ext2fs_test_block_bitmap(ctx->block_found_map, blk)) { 2340 ext2fs_mark_block_bitmap(ctx->block_found_map, blk); 2341 return 0; 2342 } 2343 /* 2344 * Try to find the where the filesystem block was used... 2345 */ 2346 first_block = fs->super->s_first_data_block; 2347 2348 for (i = 0; i < fs->group_desc_count; i++ ) { 2349 pctx->group = i; 2350 pctx->blk = blk; 2351 if (!ext2fs_bg_has_super(fs, i)) 2352 goto skip_super; 2353 if (blk == first_block) { 2354 if (i == 0) { 2355 if (fix_problem(ctx, 2356 PR_1_BAD_PRIMARY_SUPERBLOCK, 2357 pctx)) { 2358 *block_nr = 0; 2359 return BLOCK_CHANGED; 2360 } 2361 return 0; 2362 } 2363 fix_problem(ctx, PR_1_BAD_SUPERBLOCK, pctx); 2364 return 0; 2365 } 2366 if ((blk > first_block) && 2367 (blk <= first_block + fs->desc_blocks)) { 2368 if (i == 0) { 2369 pctx->blk = *block_nr; 2370 if (fix_problem(ctx, 2371 PR_1_BAD_PRIMARY_GROUP_DESCRIPTOR, pctx)) { 2372 *block_nr = 0; 2373 return BLOCK_CHANGED; 2374 } 2375 return 0; 2376 } 2377 fix_problem(ctx, PR_1_BAD_GROUP_DESCRIPTORS, pctx); 2378 return 0; 2379 } 2380 skip_super: 2381 if (blk == fs->group_desc[i].bg_block_bitmap) { 2382 if (fix_problem(ctx, PR_1_BB_BAD_BLOCK, pctx)) { 2383 ctx->invalid_block_bitmap_flag[i]++; 2384 ctx->invalid_bitmaps++; 2385 } 2386 return 0; 2387 } 2388 if (blk == fs->group_desc[i].bg_inode_bitmap) { 2389 if (fix_problem(ctx, PR_1_IB_BAD_BLOCK, pctx)) { 2390 ctx->invalid_inode_bitmap_flag[i]++; 2391 ctx->invalid_bitmaps++; 2392 } 2393 return 0; 2394 } 2395 if ((blk >= fs->group_desc[i].bg_inode_table) && 2396 (blk < (fs->group_desc[i].bg_inode_table + 2397 fs->inode_blocks_per_group))) { 2398 /* 2399 * If there are bad blocks in the inode table, 2400 * the inode scan code will try to do 2401 * something reasonable automatically. 2402 */ 2403 return 0; 2404 } 2405 first_block += fs->super->s_blocks_per_group; 2406 } 2407 /* 2408 * If we've gotten to this point, then the only 2409 * possibility is that the bad block inode meta data 2410 * is using a bad block. 2411 */ 2412 if ((blk == p->inode->i_block[EXT2_IND_BLOCK]) || 2413 (blk == p->inode->i_block[EXT2_DIND_BLOCK]) || 2414 (blk == p->inode->i_block[EXT2_TIND_BLOCK])) { 2415 p->bbcheck = 1; 2416 if (fix_problem(ctx, PR_1_BBINODE_BAD_METABLOCK, pctx)) { 2417 *block_nr = 0; 2418 return BLOCK_CHANGED; 2419 } 2420 if (ctx->flags & E2F_FLAG_SIGNAL_MASK) 2421 return BLOCK_ABORT; 2422 return 0; 2423 } 2424 2425 pctx->group = -1; 2426 2427 /* Warn user that the block wasn't claimed */ 2428 fix_problem(ctx, PR_1_PROGERR_CLAIMED_BLOCK, pctx); 2429 2430 return 0; 2431 } 2432 2433 static void new_table_block(e2fsck_t ctx, blk_t first_block, int group, 2434 const char *name, int num, blk_t *new_block) 2435 { 2436 ext2_filsys fs = ctx->fs; 2437 dgrp_t last_grp; 2438 blk_t old_block = *new_block; 2439 blk_t last_block; 2440 int i, is_flexbg, flexbg, flexbg_size; 2441 char *buf; 2442 struct problem_context pctx; 2443 2444 clear_problem_context(&pctx); 2445 2446 pctx.group = group; 2447 pctx.blk = old_block; 2448 pctx.str = name; 2449 2450 /* 2451 * For flex_bg filesystems, first try to allocate the metadata 2452 * within the flex_bg, and if that fails then try finding the 2453 * space anywhere in the filesystem. 2454 */ 2455 is_flexbg = EXT2_HAS_INCOMPAT_FEATURE(fs->super, 2456 EXT4_FEATURE_INCOMPAT_FLEX_BG); 2457 if (is_flexbg) { 2458 flexbg_size = 1 << fs->super->s_log_groups_per_flex; 2459 flexbg = group / flexbg_size; 2460 first_block = ext2fs_group_first_block(fs, 2461 flexbg_size * flexbg); 2462 last_grp = group | (flexbg_size - 1); 2463 if (last_grp > fs->group_desc_count) 2464 last_grp = fs->group_desc_count; 2465 last_block = ext2fs_group_last_block(fs, last_grp); 2466 } else 2467 last_block = ext2fs_group_last_block(fs, group); 2468 pctx.errcode = ext2fs_get_free_blocks(fs, first_block, last_block, 2469 num, ctx->block_found_map, 2470 new_block); 2471 if (is_flexbg && (pctx.errcode == EXT2_ET_BLOCK_ALLOC_FAIL)) 2472 pctx.errcode = ext2fs_get_free_blocks(fs, 2473 fs->super->s_first_data_block, 2474 fs->super->s_blocks_count, 2475 num, ctx->block_found_map, new_block); 2476 if (pctx.errcode) { 2477 pctx.num = num; 2478 fix_problem(ctx, PR_1_RELOC_BLOCK_ALLOCATE, &pctx); 2479 ext2fs_unmark_valid(fs); 2480 ctx->flags |= E2F_FLAG_ABORT; 2481 return; 2482 } 2483 pctx.errcode = ext2fs_get_mem(fs->blocksize, &buf); 2484 if (pctx.errcode) { 2485 fix_problem(ctx, PR_1_RELOC_MEMORY_ALLOCATE, &pctx); 2486 ext2fs_unmark_valid(fs); 2487 ctx->flags |= E2F_FLAG_ABORT; 2488 return; 2489 } 2490 ext2fs_mark_super_dirty(fs); 2491 fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY; 2492 pctx.blk2 = *new_block; 2493 fix_problem(ctx, (old_block ? PR_1_RELOC_FROM_TO : 2494 PR_1_RELOC_TO), &pctx); 2495 pctx.blk2 = 0; 2496 for (i = 0; i < num; i++) { 2497 pctx.blk = i; 2498 ext2fs_mark_block_bitmap(ctx->block_found_map, (*new_block)+i); 2499 if (old_block) { 2500 pctx.errcode = io_channel_read_blk(fs->io, 2501 old_block + i, 1, buf); 2502 if (pctx.errcode) 2503 fix_problem(ctx, PR_1_RELOC_READ_ERR, &pctx); 2504 } else 2505 memset(buf, 0, fs->blocksize); 2506 2507 pctx.blk = (*new_block) + i; 2508 pctx.errcode = io_channel_write_blk(fs->io, pctx.blk, 2509 1, buf); 2510 if (pctx.errcode) 2511 fix_problem(ctx, PR_1_RELOC_WRITE_ERR, &pctx); 2512 } 2513 ext2fs_free_mem(&buf); 2514 } 2515 2516 /* 2517 * This routine gets called at the end of pass 1 if bad blocks are 2518 * detected in the superblock, group descriptors, inode_bitmaps, or 2519 * block bitmaps. At this point, all of the blocks have been mapped 2520 * out, so we can try to allocate new block(s) to replace the bad 2521 * blocks. 2522 */ 2523 static void handle_fs_bad_blocks(e2fsck_t ctx) 2524 { 2525 ext2_filsys fs = ctx->fs; 2526 dgrp_t i; 2527 blk_t first_block; 2528 2529 for (i = 0; i < fs->group_desc_count; i++) { 2530 first_block = ext2fs_group_first_block(fs, i); 2531 2532 if (ctx->invalid_block_bitmap_flag[i]) { 2533 new_table_block(ctx, first_block, i, _("block bitmap"), 2534 1, &fs->group_desc[i].bg_block_bitmap); 2535 } 2536 if (ctx->invalid_inode_bitmap_flag[i]) { 2537 new_table_block(ctx, first_block, i, _("inode bitmap"), 2538 1, &fs->group_desc[i].bg_inode_bitmap); 2539 } 2540 if (ctx->invalid_inode_table_flag[i]) { 2541 new_table_block(ctx, first_block, i, _("inode table"), 2542 fs->inode_blocks_per_group, 2543 &fs->group_desc[i].bg_inode_table); 2544 ctx->flags |= E2F_FLAG_RESTART; 2545 } 2546 } 2547 ctx->invalid_bitmaps = 0; 2548 } 2549 2550 /* 2551 * This routine marks all blocks which are used by the superblock, 2552 * group descriptors, inode bitmaps, and block bitmaps. 2553 */ 2554 static void mark_table_blocks(e2fsck_t ctx) 2555 { 2556 ext2_filsys fs = ctx->fs; 2557 blk_t b; 2558 dgrp_t i; 2559 int j; 2560 struct problem_context pctx; 2561 2562 clear_problem_context(&pctx); 2563 2564 for (i = 0; i < fs->group_desc_count; i++) { 2565 pctx.group = i; 2566 2567 ext2fs_reserve_super_and_bgd(fs, i, ctx->block_found_map); 2568 2569 /* 2570 * Mark the blocks used for the inode table 2571 */ 2572 if (fs->group_desc[i].bg_inode_table) { 2573 for (j = 0, b = fs->group_desc[i].bg_inode_table; 2574 j < fs->inode_blocks_per_group; 2575 j++, b++) { 2576 if (ext2fs_test_block_bitmap(ctx->block_found_map, 2577 b)) { 2578 pctx.blk = b; 2579 if (!ctx->invalid_inode_table_flag[i] && 2580 fix_problem(ctx, 2581 PR_1_ITABLE_CONFLICT, &pctx)) { 2582 ctx->invalid_inode_table_flag[i]++; 2583 ctx->invalid_bitmaps++; 2584 } 2585 } else { 2586 ext2fs_mark_block_bitmap(ctx->block_found_map, 2587 b); 2588 } 2589 } 2590 } 2591 2592 /* 2593 * Mark block used for the block bitmap 2594 */ 2595 if (fs->group_desc[i].bg_block_bitmap) { 2596 if (ext2fs_test_block_bitmap(ctx->block_found_map, 2597 fs->group_desc[i].bg_block_bitmap)) { 2598 pctx.blk = fs->group_desc[i].bg_block_bitmap; 2599 if (fix_problem(ctx, PR_1_BB_CONFLICT, &pctx)) { 2600 ctx->invalid_block_bitmap_flag[i]++; 2601 ctx->invalid_bitmaps++; 2602 } 2603 } else { 2604 ext2fs_mark_block_bitmap(ctx->block_found_map, 2605 fs->group_desc[i].bg_block_bitmap); 2606 } 2607 2608 } 2609 /* 2610 * Mark block used for the inode bitmap 2611 */ 2612 if (fs->group_desc[i].bg_inode_bitmap) { 2613 if (ext2fs_test_block_bitmap(ctx->block_found_map, 2614 fs->group_desc[i].bg_inode_bitmap)) { 2615 pctx.blk = fs->group_desc[i].bg_inode_bitmap; 2616 if (fix_problem(ctx, PR_1_IB_CONFLICT, &pctx)) { 2617 ctx->invalid_inode_bitmap_flag[i]++; 2618 ctx->invalid_bitmaps++; 2619 } 2620 } else { 2621 ext2fs_mark_block_bitmap(ctx->block_found_map, 2622 fs->group_desc[i].bg_inode_bitmap); 2623 } 2624 } 2625 } 2626 } 2627 2628 /* 2629 * Thes subroutines short circuits ext2fs_get_blocks and 2630 * ext2fs_check_directory; we use them since we already have the inode 2631 * structure, so there's no point in letting the ext2fs library read 2632 * the inode again. 2633 */ 2634 static errcode_t pass1_get_blocks(ext2_filsys fs, ext2_ino_t ino, 2635 blk_t *blocks) 2636 { 2637 e2fsck_t ctx = (e2fsck_t) fs->priv_data; 2638 int i; 2639 2640 if ((ino != ctx->stashed_ino) || !ctx->stashed_inode) 2641 return EXT2_ET_CALLBACK_NOTHANDLED; 2642 2643 for (i=0; i < EXT2_N_BLOCKS; i++) 2644 blocks[i] = ctx->stashed_inode->i_block[i]; 2645 return 0; 2646 } 2647 2648 static errcode_t pass1_read_inode(ext2_filsys fs, ext2_ino_t ino, 2649 struct ext2_inode *inode) 2650 { 2651 e2fsck_t ctx = (e2fsck_t) fs->priv_data; 2652 2653 if ((ino != ctx->stashed_ino) || !ctx->stashed_inode) 2654 return EXT2_ET_CALLBACK_NOTHANDLED; 2655 *inode = *ctx->stashed_inode; 2656 return 0; 2657 } 2658 2659 static errcode_t pass1_write_inode(ext2_filsys fs, ext2_ino_t ino, 2660 struct ext2_inode *inode) 2661 { 2662 e2fsck_t ctx = (e2fsck_t) fs->priv_data; 2663 2664 if ((ino == ctx->stashed_ino) && ctx->stashed_inode && 2665 (inode != ctx->stashed_inode)) 2666 *ctx->stashed_inode = *inode; 2667 return EXT2_ET_CALLBACK_NOTHANDLED; 2668 } 2669 2670 static errcode_t pass1_check_directory(ext2_filsys fs, ext2_ino_t ino) 2671 { 2672 e2fsck_t ctx = (e2fsck_t) fs->priv_data; 2673 2674 if ((ino != ctx->stashed_ino) || !ctx->stashed_inode) 2675 return EXT2_ET_CALLBACK_NOTHANDLED; 2676 2677 if (!LINUX_S_ISDIR(ctx->stashed_inode->i_mode)) 2678 return EXT2_ET_NO_DIRECTORY; 2679 return 0; 2680 } 2681 2682 static errcode_t e2fsck_get_alloc_block(ext2_filsys fs, blk64_t goal, 2683 blk64_t *ret) 2684 { 2685 e2fsck_t ctx = (e2fsck_t) fs->priv_data; 2686 errcode_t retval; 2687 blk_t new_block; 2688 2689 if (ctx->block_found_map) { 2690 retval = ext2fs_new_block(fs, (blk_t) goal, 2691 ctx->block_found_map, &new_block); 2692 if (retval) 2693 return retval; 2694 if (fs->block_map) { 2695 ext2fs_mark_block_bitmap(fs->block_map, new_block); 2696 ext2fs_mark_bb_dirty(fs); 2697 } 2698 } else { 2699 if (!fs->block_map) { 2700 retval = ext2fs_read_block_bitmap(fs); 2701 if (retval) 2702 return retval; 2703 } 2704 2705 retval = ext2fs_new_block(fs, (blk_t) goal, 0, &new_block); 2706 if (retval) 2707 return retval; 2708 } 2709 2710 *ret = new_block; 2711 return (0); 2712 } 2713 2714 static void e2fsck_block_alloc_stats(ext2_filsys fs, blk64_t blk, int inuse) 2715 { 2716 e2fsck_t ctx = (e2fsck_t) fs->priv_data; 2717 2718 if (ctx->block_found_map) { 2719 if (inuse > 0) 2720 ext2fs_mark_block_bitmap(ctx->block_found_map, 2721 (blk_t) blk); 2722 else 2723 ext2fs_unmark_block_bitmap(ctx->block_found_map, 2724 (blk_t) blk); 2725 } 2726 } 2727 2728 void e2fsck_use_inode_shortcuts(e2fsck_t ctx, int bool) 2729 { 2730 ext2_filsys fs = ctx->fs; 2731 2732 if (bool) { 2733 fs->get_blocks = pass1_get_blocks; 2734 fs->check_directory = pass1_check_directory; 2735 fs->read_inode = pass1_read_inode; 2736 fs->write_inode = pass1_write_inode; 2737 ctx->stashed_ino = 0; 2738 ext2fs_set_alloc_block_callback(fs, e2fsck_get_alloc_block, 2739 0); 2740 ext2fs_set_block_alloc_stats_callback(fs, 2741 e2fsck_block_alloc_stats, 2742 0); 2743 } else { 2744 fs->get_blocks = 0; 2745 fs->check_directory = 0; 2746 fs->read_inode = 0; 2747 fs->write_inode = 0; 2748 } 2749 } 2750