From: Theodore Ts'o Date: Mon, 14 May 2001 12:47:41 +0000 (+0000) Subject: ChangeLog, pass1.c, problem.c, problem.h, problemP.h: X-Git-Tag: E2FSPROGS-1_20~25 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=21afac096df642708ebf63dc4354575883f11174;p=thirdparty%2Fe2fsprogs.git ChangeLog, pass1.c, problem.c, problem.h, problemP.h: pass1.c: Treat inodes with a low dtime (that were from a corrupted orphan list) specially. problem.c, problem.h: Add new problem codes PR_1_LOW_DTIME and PR_1_ORPHAN_LIST_REFUGEES, and a new latch group, PR_LATCH_LOW_DTIME. problemP.h: Expand the size of the problem flag to be an int instead of a short. Expand space in the flag word which is reserved for problem latch flags from 3 bits to 8 bits. ChangeLog, expect.1, expect.2, image.gz, name: f_badorphan: New test which verifies corrupted orphan list handling. --- diff --git a/e2fsck/ChangeLog b/e2fsck/ChangeLog index bcc6405dd..12fc444f3 100644 --- a/e2fsck/ChangeLog +++ b/e2fsck/ChangeLog @@ -1,5 +1,16 @@ 2001-05-14 Theodore Tso + * pass1.c: Treat inodes with a low dtime (that were from a + corrupted orphan list) specially. + + * problem.c, problem.h: Add new problem codes PR_1_LOW_DTIME and + PR_1_ORPHAN_LIST_REFUGEES, and a new latch group, + PR_LATCH_LOW_DTIME. + + * problemP.h: Expand the size of the problem flag to be an int + instead of a short. Expand space in the flag word which + is reserved for problem latch flags from 3 bits to 8 bits. + * e2fsck.h, scantest.c: Change location of ext2_fs.h to be ext2fs/ext2_fs.h diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c index 99a88b091..e0c08b5dd 100644 --- a/e2fsck/pass1.c +++ b/e2fsck/pass1.c @@ -441,6 +441,33 @@ void e2fsck_pass1(e2fsck_t ctx) check_blocks(ctx, &pctx, block_buf); goto next; } + /* + * Check for inodes who might have been part of the + * orphaned list linked list. They should have gotten + * dealt with by now, unless the list had somehow been + * corrupted. + * + * FIXME: In the future, inodes which are still in use + * (and which are therefore) pending truncation should + * be handled specially. Right now we just clear the + * dtime field, and the normal e2fsck handling of + * inodes where i_size and the inode blocks are + * inconsistent is to fix i_size, instead of releasing + * the extra blocks. This won't catch the inodes that + * was at the end of the orphan list, but it's better + * than nothing. The right answer is that there + * shouldn't be any bugs in the orphan list handling. :-) + */ + if (inode.i_dtime && + inode.i_dtime < ctx->fs->super->s_inodes_count) { + if (fix_problem(ctx, PR_1_LOW_DTIME, &pctx)) { + inode.i_dtime = inode.i_links_count ? + 0 : time(0); + e2fsck_write_inode(ctx, ino, &inode, + "pass1"); + } + } + /* * This code assumes that deleted inodes have * i_links_count set to 0. diff --git a/e2fsck/problem.c b/e2fsck/problem.c index 2ac545c64..947c99802 100644 --- a/e2fsck/problem.c +++ b/e2fsck/problem.c @@ -556,6 +556,17 @@ static const struct e2fsck_problem problem_table[] = { N_("@j is not regular file. "), PROMPT_FIX, PR_PREEN_OK }, + /* Deal with inodes that were part of orphan linked list */ + { PR_1_LOW_DTIME, + N_("@i %i was part of the orphaned @i list. "), + PROMPT_FIX, PR_LATCH_LOW_DTIME, 0 }, + + /* Deal with inodes that were part of corrupted orphan linked + list (latch question) */ + { PR_1_ORPHAN_LIST_REFUGEES, + N_("@is that were part of a corrupted orphan linked list found. "), + PROMPT_FIX, 0 }, + /* Pass 1b errors */ /* Pass 1B: Rescan for duplicate/bad blocks */ @@ -1130,6 +1141,7 @@ static struct latch_descr pr_latch_info[] = { { PR_LATCH_BBITMAP, PR_5_BLOCK_BITMAP_HEADER, PR_5_BLOCK_BITMAP_END }, { PR_LATCH_RELOC, PR_0_RELOCATE_HINT, 0 }, { PR_LATCH_DBLOCK, PR_1B_DUP_BLOCK_HEADER, PR_1B_DUP_BLOCK_END }, + { PR_LATCH_LOW_DTIME, PR_1_ORPHAN_LIST_REFUGEES, 0 }, { -1, 0, 0 }, }; diff --git a/e2fsck/problem.h b/e2fsck/problem.h index 1c4ffe381..f92745d71 100644 --- a/e2fsck/problem.h +++ b/e2fsck/problem.h @@ -28,13 +28,14 @@ struct problem_context { * handled as a set. The user answers once for a particular latch * group. */ -#define PR_LATCH_MASK 0x0070 /* Latch mask */ +#define PR_LATCH_MASK 0x0ff0 /* Latch mask */ #define PR_LATCH_BLOCK 0x0010 /* Latch for illegal blocks (pass 1) */ #define PR_LATCH_BBLOCK 0x0020 /* Latch for bad block inode blocks (pass 1) */ #define PR_LATCH_IBITMAP 0x0030 /* Latch for pass 5 inode bitmap proc. */ #define PR_LATCH_BBITMAP 0x0040 /* Latch for pass 5 inode bitmap proc. */ #define PR_LATCH_RELOC 0x0050 /* Latch for superblock relocate hint */ #define PR_LATCH_DBLOCK 0x0060 /* Latch for pass 1b dup block headers */ +#define PR_LATCH_LOW_DTIME 0x0070 /* Latch for pass1 orphaned list refugees */ #define PR_LATCH(x) ((((x) & PR_LATCH_MASK) >> 4) - 1) @@ -319,6 +320,12 @@ struct problem_context { /* Journal inode has wrong mode */ #define PR_1_JOURNAL_BAD_MODE 0x010035 + +/* Inode that was part of orphan linked list */ +#define PR_1_LOW_DTIME 0x010036 + +/* Latch question which asks how to deal with low dtime inodes */ +#define PR_1_ORPHAN_LIST_REFUGEES 0x010037 /* * Pass 1b errors diff --git a/e2fsck/problemP.h b/e2fsck/problemP.h index 5738610af..cce5511a2 100644 --- a/e2fsck/problemP.h +++ b/e2fsck/problemP.h @@ -13,7 +13,7 @@ struct e2fsck_problem { problem_t e2p_code; const char * e2p_description; char prompt; - short flags; + int flags; problem_t second_code; }; @@ -24,15 +24,18 @@ struct latch_descr { int flags; }; -#define PR_PREEN_OK 0x0001 /* Don't need to do preenhalt */ -#define PR_NO_OK 0x0002 /* If user answers no, don't make fs invalid */ -#define PR_NO_DEFAULT 0x0004 /* Default to no */ -#define PR_MSG_ONLY 0x0008 /* Print message only */ -#define PR_FATAL 0x0080 /* Fatal error */ -#define PR_AFTER_CODE 0x0100 /* After asking the first question, */ - /* ask another */ -#define PR_PREEN_NOMSG 0x0200 /* Don't print a message if we're preening */ -#define PR_NOCOLLATE 0x0400 /* Don't collate answers for this latch */ -#define PR_NO_NOMSG 0x0800 /* Don't print a message if e2fsck -n */ -#define PR_PREEN_NO 0x1000 /* Use No as an answer if preening */ +#define PR_PREEN_OK 0x000001 /* Don't need to do preenhalt */ +#define PR_NO_OK 0x000002 /* If user answers no, don't make fs invalid */ +#define PR_NO_DEFAULT 0x000004 /* Default to no */ +#define PR_MSG_ONLY 0x000008 /* Print message only */ + +/* Bit positions 0x000ff0 are reserved for the PR_LATCH flags */ + +#define PR_FATAL 0x001000 /* Fatal error */ +#define PR_AFTER_CODE 0x002000 /* After asking the first question, */ + /* ask another */ +#define PR_PREEN_NOMSG 0x004000 /* Don't print a message if we're preening */ +#define PR_NOCOLLATE 0x008000 /* Don't collate answers for this latch */ +#define PR_NO_NOMSG 0x010000 /* Don't print a message if e2fsck -n */ +#define PR_PREEN_NO 0x020000 /* Use No as an answer if preening */ diff --git a/tests/ChangeLog b/tests/ChangeLog index b657b9f04..5894b4b0e 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2001-05-14 Theodore Tso + + * f_badorphan: New test which verifies corrupted orphan list + handling. + 2001-05-05 Theodore Tso * d_loaddump: New test which verifies debugfs's dump and load diff --git a/tests/f_badorphan/expect.1 b/tests/f_badorphan/expect.1 new file mode 100644 index 000000000..a58967a49 --- /dev/null +++ b/tests/f_badorphan/expect.1 @@ -0,0 +1,75 @@ +Clearing orphaned inode 54 (uid=0, gid=0, mode=0100600, size=44610) +Clearing orphaned inode 32 (uid=0, gid=0, mode=040700, size=1024) +Clearing orphaned inode 67 (uid=0, gid=0, mode=040700, size=1024) +Clearing orphaned inode 55 (uid=0, gid=0, mode=040700, size=1024) +Pass 1: Checking inodes, blocks, and sizes +Inodes that were part of a corrupted orphan linked list found. Fix? yes + +Inode 13 was part of the orphaned inode list. FIXED. +Inode 17 was part of the orphaned inode list. FIXED. +Deleted inode 18 has zero dtime. Fix? yes + +Inode 19 was part of the orphaned inode list. FIXED. +Inode 22 was part of the orphaned inode list. FIXED. +Inode 23 was part of the orphaned inode list. FIXED. +Inode 24 was part of the orphaned inode list. FIXED. +Inode 25 was part of the orphaned inode list. FIXED. +Inode 26 was part of the orphaned inode list. FIXED. +Inode 27 was part of the orphaned inode list. FIXED. +Inode 28 was part of the orphaned inode list. FIXED. +Inode 30 was part of the orphaned inode list. FIXED. +Inode 33 was part of the orphaned inode list. FIXED. +Inode 36 was part of the orphaned inode list. FIXED. +Inode 38 was part of the orphaned inode list. FIXED. +Inode 43 was part of the orphaned inode list. FIXED. +Inode 44 was part of the orphaned inode list. FIXED. +Inode 46 was part of the orphaned inode list. FIXED. +Inode 47 was part of the orphaned inode list. FIXED. +Inode 51 was part of the orphaned inode list. FIXED. +Inode 53 was part of the orphaned inode list. FIXED. +Inode 56 was part of the orphaned inode list. FIXED. +Inode 61 was part of the orphaned inode list. FIXED. +Inode 65 was part of the orphaned inode list. FIXED. +Inode 70 was part of the orphaned inode list. FIXED. +Inode 71 was part of the orphaned inode list. FIXED. +Inode 75 was part of the orphaned inode list. FIXED. +Inode 77 was part of the orphaned inode list. FIXED. +Inode 83 was part of the orphaned inode list. FIXED. +Inode 84 was part of the orphaned inode list. FIXED. +Inode 85 was part of the orphaned inode list. FIXED. +Inode 87 was part of the orphaned inode list. FIXED. +Inode 91 was part of the orphaned inode list. FIXED. +Inode 93 was part of the orphaned inode list. FIXED. +Inode 96 was part of the orphaned inode list. FIXED. +Inode 97 was part of the orphaned inode list. FIXED. +Inode 99 was part of the orphaned inode list. FIXED. +Inode 109 was part of the orphaned inode list. FIXED. +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +Block bitmap differences: -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1401 -1402 -1403 -1404 -1405 -1461 -1505 -1506 -1507 -1508 -1509 -1510 -1511 -1512 -1513 -1514 -1515 -1516 -1517 -1518 -1519 -1520 -1521 -1522 -1523 -1524 -1525 -1526 -1527 -1528 -1529 -1530 -1531 -1532 -1533 -1538 -1539 -1540 -1566 -1567 -1568 -1569 -1570 -1571 -1572 -1573 -1574 -1593 -1594 -1595 -1596 -1597 -1598 -1599 -1600 -1604 -1605 -1654 -1656 -1657 -1658 -1659 -1660 -1661 -1662 -1663 -1664 -1665 -1666 -1667 -1668 -1669 -1670 -1671 -1672 -1673 -1674 -1675 -1676 -1677 -1678 -1679 -1680 -1681 -1682 -1683 -1684 -1685 -1686 -1687 -1688 -1689 -1690 -1691 -1692 -1693 -1694 -1695 -1696 -1697 -1698 -1699 -1700 -1701 -1702 -1703 -1706 -1707 -1708 -1709 -1710 -1711 -1712 -1713 -1714 -1715 -1716 -1717 -1718 -1719 -1720 -1721 -1722 -1723 -1724 -1725 -1726 -1728 -1803 -1804 -1913 -2286 -2287 -2288 -2289 -2290 -2291 -2292 -2293 -2294 -2295 -2392 -2960 -2961 -2962 -2963 -2964 -2965 -2966 -2967 -2968 -2969 -2970 -2971 -2972 -2973 -3118 -3119 -3120 -3121 -3122 -3123 -3124 -3125 -3126 -3127 -3128 -3129 -3130 -3131 -3132 -3133 -3134 -3135 -3136 -3137 -3138 -3139 -3140 -3141 -3142 -3143 -3144 -3145 -3146 -3147 -3148 -3149 -3150 -3151 -3152 -3153 -3154 -3345 -3451 -3452 -3569 -3748 -3749 -4409 -4411 -4412 -4413 -4414 -4435 -4436 -4437 -4438 -4439 -4440 -4441 -4442 -4443 -4444 -4445 -4446 -4447 -4448 -4449 -4450 -4451 -4452 -4453 -4454 -4455 -4456 -4720 -4721 -4722 -4723 -4724 -4725 -4929 -4967 -4968 -4969 -4970 -4971 -4972 -4973 -4974 -4975 -4976 -4977 -4978 -4979 -4980 -4981 -4982 -4983 -4984 -5258 -5259 -5260 -5261 -5262 -5263 -5264 -5265 -5266 -5267 -5268 -5269 -5270 -5271 -5272 -5273 -5274 -5275 -5352 -5353 -5354 -5412 -5413 -5414 -5415 -5416 -5417 -5418 -5419 -5420 -5421 -5422 -5423 -5424 -5425 -5493 -5620 -5621 -5622 -5623 -5624 -5625 -5626 -5627 -5628 -5629 -5630 -5631 -5632 -5633 -5634 -5635 -5636 -5637 -5638 -5639 -5640 -5641 -5642 -5643 -5644 -5645 -5646 -5647 -5676 -5677 -5720 -5721 -5722 -5723 -5724 -5725 -5726 -5727 -5728 -5729 -5730 -5731 -5732 -5733 -5734 -5735 -5736 -5737 -5738 -5739 -5740 -5741 -5742 -5743 -5744 -5760 -5761 -5762 -5763 -5764 -5765 -5766 -5767 -5768 -5769 -5770 -5771 -5772 -5773 -5774 -5775 -5776 -5777 -5778 -5779 -5780 -5781 -5782 -5783 -5784 -5785 -5786 -5787 -5788 -6013 +Fix? yes + +Free blocks count wrong for group #0 (5801, counted=6210). +Fix? yes + +Free blocks count wrong (5801, counted=6210). +Fix? yes + +Inode bitmap differences: -13 -17 -18 -19 -22 -23 -24 -25 -26 -27 -28 -30 -33 -36 -38 -43 -44 -46 -47 -51 -53 -56 -61 -65 -70 -71 -75 -77 -83 -84 -85 -87 -91 -93 -96 -97 -99 -109 +Fix? yes + +Free inodes count wrong for group #0 (1951, counted=1989). +Fix? yes + +Directories count wrong for group #0 (41, counted=22). +Fix? yes + +Free inodes count wrong (1951, counted=1989). +Fix? yes + + +test_filesys: ***** FILE SYSTEM WAS MODIFIED ***** +test_filesys: 59/2048 files (22.0% non-contiguous), 1982/8192 blocks +Exit status is 1 diff --git a/tests/f_badorphan/expect.2 b/tests/f_badorphan/expect.2 new file mode 100644 index 000000000..3d928eb1b --- /dev/null +++ b/tests/f_badorphan/expect.2 @@ -0,0 +1,7 @@ +Pass 1: Checking inodes, blocks, and sizes +Pass 2: Checking directory structure +Pass 3: Checking directory connectivity +Pass 4: Checking reference counts +Pass 5: Checking group summary information +test_filesys: 59/2048 files (22.0% non-contiguous), 1982/8192 blocks +Exit status is 0 diff --git a/tests/f_badorphan/image.gz b/tests/f_badorphan/image.gz new file mode 100644 index 000000000..94e3a3819 Binary files /dev/null and b/tests/f_badorphan/image.gz differ diff --git a/tests/f_badorphan/name b/tests/f_badorphan/name new file mode 100644 index 000000000..7c1475b88 --- /dev/null +++ b/tests/f_badorphan/name @@ -0,0 +1 @@ +corrupted orphan list