Whamcloud - gitweb
e2fsck: fix corruption of Hurd filesystems
authorJustus Winter <4winter@informatik.uni-hamburg.de>
Fri, 23 Jan 2015 15:15:57 +0000 (10:15 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 23 Jan 2015 15:15:57 +0000 (10:15 -0500)
Previously, e2fsck accessed the field osd2.linux2.l_i_file_acl_high
field without checking that the filesystem is indeed created for
Linux.  This lead to e2fsck constantly complaining about certain
nodes:

i_file_acl_hi for inode XXX (/dev/console) is 32, should be zero.

By "correcting" this problem, e2fsck would clobber the field
osd2.hurd2.h_i_mode_high.

Properly guard access to the OS dependent fields.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
e2fsck/pass1.c
e2fsck/pass2.c

index 50a8b99..3bf481f 100644 (file)
@@ -1082,7 +1082,8 @@ void e2fsck_pass1(e2fsck_t ctx)
                if (inode->i_faddr || frag || fsize ||
                    (LINUX_S_ISDIR(inode->i_mode) && inode->i_dir_acl))
                        mark_inode_bad(ctx, ino);
-               if (!(fs->super->s_feature_incompat & 
+               if ((fs->super->s_creator_os == EXT2_OS_LINUX) &&
+                   !(fs->super->s_feature_incompat &
                      EXT4_FEATURE_INCOMPAT_64BIT) &&
                    inode->osd2.linux2.l_i_file_acl_high != 0)
                        mark_inode_bad(ctx, ino);
@@ -2354,11 +2355,12 @@ static void check_blocks(e2fsck_t ctx, struct problem_context *pctx,
        if (LINUX_S_ISREG(inode->i_mode) &&
            ext2fs_needs_large_file_feature(EXT2_I_SIZE(inode)))
                ctx->large_files++;
-       if ((pb.num_blocks != ext2fs_inode_i_blocks(fs, inode)) ||
-           ((fs->super->s_feature_ro_compat &
-             EXT4_FEATURE_RO_COMPAT_HUGE_FILE) &&
-            (inode->i_flags & EXT4_HUGE_FILE_FL) &&
-            (inode->osd2.linux2.l_i_blocks_hi != 0))) {
+       if ((fs->super->s_creator_os == EXT2_OS_LINUX) &&
+           ((pb.num_blocks != ext2fs_inode_i_blocks(fs, inode)) ||
+            ((fs->super->s_feature_ro_compat &
+              EXT4_FEATURE_RO_COMPAT_HUGE_FILE) &&
+             (inode->i_flags & EXT4_HUGE_FILE_FL) &&
+             (inode->osd2.linux2.l_i_blocks_hi != 0)))) {
                pctx->num = pb.num_blocks;
                if (fix_problem(ctx, PR_1_BAD_I_BLOCKS, pctx)) {
                        inode->i_blocks = pb.num_blocks;
index ddfe2eb..4acddae 100644 (file)
@@ -1365,7 +1365,8 @@ int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir,
                }
        }
 
-       if (!(fs->super->s_feature_incompat & 
+       if ((fs->super->s_creator_os == EXT2_OS_LINUX) &&
+           !(fs->super->s_feature_incompat &
             EXT4_FEATURE_INCOMPAT_64BIT) &&
            inode.osd2.linux2.l_i_file_acl_high != 0) {
                pctx.num = inode.osd2.linux2.l_i_file_acl_high;