Whamcloud - gitweb
Merge branch 'maint' into next
[tools/e2fsprogs.git] / e2fsck / pass1b.c
index 9b38977..8d42d10 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);
 
@@ -315,6 +317,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))
@@ -330,6 +334,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)
@@ -352,6 +361,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;
@@ -364,13 +374,22 @@ 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);
 
-       if (lc != p->cur_cluster)
+       if (blockcnt < 0 || lc != p->cur_cluster)
                add_dupe(ctx, p->ino, EXT2FS_B2C(fs, *block_nr), p->inode);
 
 finish:
@@ -654,9 +673,9 @@ static void delete_file(e2fsck_t ctx, ext2_ino_t ino,
        if (ext2fs_file_acl_block(fs, &dp->inode) &&
            (fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_EXT_ATTR)) {
                count = 1;
-               pctx.errcode = ext2fs_adjust_ea_refcount2(fs,
+               pctx.errcode = ext2fs_adjust_ea_refcount3(fs,
                                        ext2fs_file_acl_block(fs, &dp->inode),
-                                                  block_buf, -1, &count);
+                                       block_buf, -1, &count, ino);
                if (pctx.errcode == EXT2_ET_BAD_EA_BLOCK_NUM) {
                        pctx.errcode = 0;
                        count = 1;