]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blobdiff - e2fsck/super.c
Merge branch 'maint' into next
[thirdparty/e2fsprogs.git] / e2fsck / super.c
index 8d468e63d5170248358be0054728dbfd6c11f1dc..00014e5b2818d2e9539f854e79b6b1bc6f0bbd8e 100644 (file)
@@ -201,9 +201,9 @@ static int release_inode_blocks(e2fsck_t ctx, ext2_ino_t ino,
                ext2fs_iblk_sub_blocks(fs, inode, pb.truncated_blocks);
 
        if (ext2fs_file_acl_block(fs, inode)) {
-               retval = ext2fs_adjust_ea_refcount2(fs,
-                                       ext2fs_file_acl_block(fs, inode),
-                                       block_buf, -1, &count);
+               retval = ext2fs_adjust_ea_refcount3(fs,
+                               ext2fs_file_acl_block(fs, inode),
+                               block_buf, -1, &count, ino);
                if (retval == EXT2_ET_BAD_EA_BLOCK_NUM) {
                        retval = 0;
                        count = 1;
@@ -570,7 +570,9 @@ void check_super_block(e2fsck_t ctx)
                return;
        }
 
-       should_be = sb->s_inodes_per_group * fs->group_desc_count;
+       should_be = (blk64_t)sb->s_inodes_per_group * fs->group_desc_count;
+       if (should_be > UINT_MAX)
+               should_be = UINT_MAX;
        if (sb->s_inodes_count != should_be) {
                pctx.ino = sb->s_inodes_count;
                pctx.ino2 = should_be;
@@ -580,6 +582,19 @@ void check_super_block(e2fsck_t ctx)
                }
        }
 
+       /* Are metadata_csum and uninit_bg both set? */
+       if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
+                                      EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) &&
+           EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
+                                      EXT4_FEATURE_RO_COMPAT_GDT_CSUM) &&
+           fix_problem(ctx, PR_0_META_AND_GDT_CSUM_SET, &pctx)) {
+               fs->super->s_feature_ro_compat &=
+                       ~EXT4_FEATURE_RO_COMPAT_GDT_CSUM;
+               ext2fs_mark_super_dirty(fs);
+               for (i = 0; i < fs->group_desc_count; i++)
+                       ext2fs_group_desc_csum_set(fs, i);
+       }
+
        /* Is 64bit set and extents unset? */
        if (EXT2_HAS_INCOMPAT_FEATURE(fs->super,
                                      EXT4_FEATURE_INCOMPAT_64BIT) &&
@@ -597,8 +612,7 @@ void check_super_block(e2fsck_t ctx)
        first_block = sb->s_first_data_block;
        last_block = ext2fs_blocks_count(sb)-1;
 
-       csum_flag = EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
-                                              EXT4_FEATURE_RO_COMPAT_GDT_CSUM);
+       csum_flag = ext2fs_has_group_desc_csum(fs);
        for (i = 0; i < fs->group_desc_count; i++) {
                pctx.group = i;
 
@@ -729,6 +743,7 @@ void check_super_block(e2fsck_t ctx)
            (!csum_flag || !(ctx->mount_flags & EXT2_MF_MOUNTED))) {
                if (fix_problem(ctx, PR_0_ADD_UUID, &pctx)) {
                        uuid_generate(sb->s_uuid);
+                       ext2fs_init_csum_seed(fs);
                        fs->flags |= EXT2_FLAG_DIRTY;
                        fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
                }