]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
e2fsck: print runs of duplicate blocks instead of all of them
authorDarrick J. Wong <darrick.wong@oracle.com>
Sat, 15 Mar 2014 16:12:35 +0000 (12:12 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 15 Mar 2014 16:12:37 +0000 (12:12 -0400)
When pass1 finds blocks that are mapped to multiple files, it will
print every duplicated block.  If there are long sequences of
duplicate blocks (e.g. the e_pblk field is wrong in an extent), this
can cause a gigantic flood of output when a range could convey the
same information.  Therefore, teach pass1b to print ranges when
possible.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
e2fsck/pass1b.c
e2fsck/problem.c
e2fsck/problem.h
tests/f_bbfile/expect.1
tests/f_dup/expect.1
tests/f_dup2/expect.1
tests/f_dup_ba/expect.1
tests/f_dup_resize/expect.1
tests/f_dupfsblks/expect.1
tests/f_dupsuper/expect.1

index 41a82cf42b63ea3291b3e862546fbe15ed9bbdd9..d7c5e551d18841c045a395ae660e3b248d14a83f 100644 (file)
@@ -262,6 +262,7 @@ struct process_block_struct {
        ext2_ino_t      ino;
        int             dup_blocks;
        blk64_t         cur_cluster;
+       blk64_t         last_blk;
        struct ext2_inode *inode;
        struct problem_context *pctx;
 };
@@ -274,6 +275,7 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
        ext2_inode_scan scan;
        struct process_block_struct pb;
        struct problem_context pctx;
+       problem_t op;
 
        clear_problem_context(&pctx);
 
@@ -314,6 +316,8 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
                pb.dup_blocks = 0;
                pb.inode = &inode;
                pb.cur_cluster = ~0;
+               pb.last_blk = 0;
+               pb.pctx->blk = pb.pctx->blk2 = 0;
 
                if (ext2fs_inode_has_valid_blocks2(fs, &inode) ||
                    (ino == EXT2_BAD_INO))
@@ -329,6 +333,11 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
                        ext2fs_file_acl_block_set(fs, &inode, blk);
                }
                if (pb.dup_blocks) {
+                       if (ino != EXT2_BAD_INO) {
+                               op = pctx.blk == pctx.blk2 ?
+                                       PR_1B_DUP_BLOCK : PR_1B_DUP_RANGE;
+                               fix_problem(ctx, op, pb.pctx);
+                       }
                        end_problem_latch(ctx, PR_LATCH_DBLOCK);
                        if (ino >= EXT2_FIRST_INODE(fs->super) ||
                            ino == EXT2_ROOT_INO)
@@ -351,6 +360,7 @@ static int process_pass1b_block(ext2_filsys fs EXT2FS_ATTR((unused)),
        struct process_block_struct *p;
        e2fsck_t ctx;
        blk64_t lc;
+       problem_t op;
 
        if (HOLE_BLKADDR(*block_nr))
                return 0;
@@ -363,8 +373,17 @@ static int process_pass1b_block(ext2_filsys fs EXT2FS_ATTR((unused)),
 
        /* OK, this is a duplicate block */
        if (p->ino != EXT2_BAD_INO) {
-               p->pctx->blk = *block_nr;
-               fix_problem(ctx, PR_1B_DUP_BLOCK, p->pctx);
+               if (p->last_blk + 1 != *block_nr) {
+                       if (p->last_blk) {
+                               op = p->pctx->blk == p->pctx->blk2 ?
+                                               PR_1B_DUP_BLOCK :
+                                               PR_1B_DUP_RANGE;
+                               fix_problem(ctx, op, p->pctx);
+                       }
+                       p->pctx->blk = *block_nr;
+               }
+               p->pctx->blk2 = *block_nr;
+               p->last_blk = *block_nr;
        }
        p->dup_blocks++;
        ext2fs_mark_inode_bitmap2(inode_dup_map, p->ino);
index 12828581d2bfbb7be702e36cae8a70800430ea08..7f0ad6c4e4c0ee3f52e56c5add3f3232d2a7972a 100644 (file)
@@ -1073,6 +1073,11 @@ static struct e2fsck_problem problem_table[] = {
          N_("Error adjusting refcount for @a @b %b (@i %i): %m\n"),
          PROMPT_NONE, 0 },
 
+       /* Duplicate/bad block range in inode */
+       { PR_1B_DUP_RANGE,
+         " %b--%c",
+         PROMPT_NONE, PR_LATCH_DBLOCK | PR_PREEN_NOHDR },
+
        /* Pass 1C: Scan directories for inodes with multiply-claimed blocks. */
        { PR_1C_PASS_HEADER,
          N_("Pass 1C: Scanning directories for @is with @m @bs\n"),
index 61cbbef88950a533f8046876305c1d6e806485e0..bc9fa9c8cd35edc9ef38a43945ab1fa22d884d6c 100644 (file)
@@ -628,6 +628,9 @@ struct problem_context {
 /* Error adjusting EA refcount */
 #define PR_1B_ADJ_EA_REFCOUNT  0x011007
 
+/* Duplicate/bad block range in inode */
+#define PR_1B_DUP_RANGE                0x011008
+
 /* Pass 1C: Scan directories for inodes with dup blocks. */
 #define PR_1C_PASS_HEADER      0x012000
 
index 1d639f6cc05c9164f19c807d144bd08338803ce9..ec1a36edb54d6ecbacdbefa0f80923961f15656f 100644 (file)
@@ -8,8 +8,8 @@ Relocating group 0's inode bitmap from 4 to 43...
 Running additional passes to resolve blocks claimed by more than one inode...
 Pass 1B: Rescanning for multiply-claimed blocks
 Multiply-claimed block(s) in inode 2: 21
-Multiply-claimed block(s) in inode 11: 9 10 11 12 13 14 15 16 17 18 19 20
-Multiply-claimed block(s) in inode 12: 25 26
+Multiply-claimed block(s) in inode 11: 9--20
+Multiply-claimed block(s) in inode 12: 25--26
 Pass 1C: Scanning directories for inodes with multiply-claimed blocks
 Pass 1D: Reconciling multiply-claimed blocks
 (There are 3 inodes containing multiply-claimed blocks.)
index e7128f34b8c9c06450e4eec2fbc81c91359ca3e9..075e62c13a21febddd640d1866103ad591485b3e 100644 (file)
@@ -4,8 +4,8 @@ Pass 1: Checking inodes, blocks, and sizes
 
 Running additional passes to resolve blocks claimed by more than one inode...
 Pass 1B: Rescanning for multiply-claimed blocks
-Multiply-claimed block(s) in inode 12: 25 26
-Multiply-claimed block(s) in inode 13: 25 26
+Multiply-claimed block(s) in inode 12: 25--26
+Multiply-claimed block(s) in inode 13: 25--26
 Pass 1C: Scanning directories for inodes with multiply-claimed blocks
 Pass 1D: Reconciling multiply-claimed blocks
 (There are 2 inodes containing multiply-claimed blocks.)
index 0476005da5b6ced132187df391b73b8b937d1f41..69aa21b4b743a41c872d2727f35936a101d381df 100644 (file)
@@ -4,9 +4,9 @@ Pass 1: Checking inodes, blocks, and sizes
 
 Running additional passes to resolve blocks claimed by more than one inode...
 Pass 1B: Rescanning for multiply-claimed blocks
-Multiply-claimed block(s) in inode 12: 25 26
-Multiply-claimed block(s) in inode 13: 25 26 57 58
-Multiply-claimed block(s) in inode 14: 57 58
+Multiply-claimed block(s) in inode 12: 25--26
+Multiply-claimed block(s) in inode 13: 25--26 57--58
+Multiply-claimed block(s) in inode 14: 57--58
 Pass 1C: Scanning directories for inodes with multiply-claimed blocks
 Pass 1D: Reconciling multiply-claimed blocks
 (There are 3 inodes containing multiply-claimed blocks.)
index f0ad4570827064b764451231565beced293a0738..f4581c4e7d87b228b925ef71a684c3da6d1064d3 100644 (file)
@@ -6,12 +6,12 @@ Inode 16, i_blocks is 128, should be 896.  Fix? yes
 
 Running additional passes to resolve blocks claimed by more than one inode...
 Pass 1B: Rescanning for multiply-claimed blocks
-Multiply-claimed block(s) in inode 16: 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
-Multiply-claimed block(s) in inode 17: 160 161
-Multiply-claimed block(s) in inode 18: 176 177
-Multiply-claimed block(s) in inode 19: 192 193
-Multiply-claimed block(s) in inode 20: 208 209
-Multiply-claimed block(s) in inode 21: 224 225
+Multiply-claimed block(s) in inode 16: 160--239
+Multiply-claimed block(s) in inode 17: 160--161
+Multiply-claimed block(s) in inode 18: 176--177
+Multiply-claimed block(s) in inode 19: 192--193
+Multiply-claimed block(s) in inode 20: 208--209
+Multiply-claimed block(s) in inode 21: 224--225
 Pass 1C: Scanning directories for inodes with multiply-claimed blocks
 Pass 1D: Reconciling multiply-claimed blocks
 (There are 6 inodes containing multiply-claimed blocks.)
index dd8fe05c9a251545d85d8f3839aa2bae85ea21f3..aaf7769cbcd7088bd9d22b8f38865b41d66ac9b8 100644 (file)
@@ -4,8 +4,8 @@ Pass 1: Checking inodes, blocks, and sizes
 
 Running additional passes to resolve blocks claimed by more than one inode...
 Pass 1B: Rescanning for multiply-claimed blocks
-Multiply-claimed block(s) in inode 7: 4 5 6 7
-Multiply-claimed block(s) in inode 12: 4 5 6 7
+Multiply-claimed block(s) in inode 7: 4--7
+Multiply-claimed block(s) in inode 12: 4--7
 Pass 1C: Scanning directories for inodes with multiply-claimed blocks
 Pass 1D: Reconciling multiply-claimed blocks
 (There are 1 inodes containing multiply-claimed blocks.)
index 3f70109128e6b847fad2a456c4a6d3184e30b984..675198679a3696e7f4e8440302f66e9d1b14fdf4 100644 (file)
@@ -8,8 +8,8 @@ Inode 13, i_size is 0, should be 2048.  Fix? yes
 
 Running additional passes to resolve blocks claimed by more than one inode...
 Pass 1B: Rescanning for multiply-claimed blocks
-Multiply-claimed block(s) in inode 12: 3 4 6 1
-Multiply-claimed block(s) in inode 13: 2 3
+Multiply-claimed block(s) in inode 12: 3--4 6 1
+Multiply-claimed block(s) in inode 13: 2--3
 Multiply-claimed block(s) in inode 14: 2
 Pass 1C: Scanning directories for inodes with multiply-claimed blocks
 Pass 1D: Reconciling multiply-claimed blocks
index 830370a67758353350242f517b893285599a514f..2107e2d3a5183c1ba11bfa0c530d22371833d5aa 100644 (file)
@@ -4,7 +4,7 @@ Pass 1: Checking inodes, blocks, and sizes
 
 Running additional passes to resolve blocks claimed by more than one inode...
 Pass 1B: Rescanning for multiply-claimed blocks
-Multiply-claimed block(s) in inode 12: 2 3 1
+Multiply-claimed block(s) in inode 12: 2--3 1
 Pass 1C: Scanning directories for inodes with multiply-claimed blocks
 Pass 1D: Reconciling multiply-claimed blocks
 (There are 1 inodes containing multiply-claimed blocks.)