Some kernels will crash if EOFBLOCKS_FL is set when it is it not
needed, and this if it is left set when it isn't needed, it is a sign
of a kernel bug.
Addresses-Google-Bug: #
2604224
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
((1ULL << (32 + EXT2_BLOCK_SIZE_BITS(fs->super))) - 1))
/* too big for an extent-based file - 32bit ee_block */
bad_size = 6;
+
+ /*
+ * Check to see if the EOFBLOCKS flag is set where it
+ * doesn't need to be.
+ */
+ if ((inode->i_flags & EXT4_EOFBLOCKS_FL) &&
+ (size <= (((__u64)pb.last_block + 1) * fs->blocksize))) {
+ pctx->blkcount = pb.last_block;
+ if (fix_problem(ctx, PR_1_EOFBLOCKS_FL_SET, pctx)) {
+ inode->i_flags &= ~EXT4_EOFBLOCKS_FL;
+ dirty_inode++;
+ }
+ }
}
/* i_size for symlinks is checked elsewhere */
if (bad_size && !LINUX_S_ISLNK(inode->i_mode)) {
N_("@i %i has an invalid extent node (blk %b, lblk %c)\n"),
PROMPT_CLEAR, 0 },
+ { PR_1_EOFBLOCKS_FL_SET,
+ N_("@i %i should not have EOFBLOCKS_FL set "
+ "(size %Is, lblk %r)\n"),
+ PROMPT_CLEAR, PR_PREEN_OK },
+
/* Pass 1b errors */
/* Pass 1B: Rescan for duplicate/bad blocks */
/* Extent node header invalid */
#define PR_1_EXTENT_HEADER_INVALID 0x01005F
+/* EOFBLOCKS flag set when not necessary */
+#define PR_1_EOFBLOCKS_FL_SET 0x010060
+
/*
* Pass 1b errors
*/
Inode 1 has EXTENTS_FL flag set on filesystem without extents support.
Clear? yes
+Inode 9 should not have EOFBLOCKS_FL set (size 0, lblk -1)
+Clear? yes
+
+Inode 10 should not have EOFBLOCKS_FL set (size 0, lblk -1)
+Clear? yes
+
Inode 15 has EXTENTS_FL flag set on filesystem without extents support.
Clear? yes
Inode 16 has EXTENTS_FL flag set on filesystem without extents support.
Clear? yes
+Inode 13 should not have EOFBLOCKS_FL set (size 0, lblk -1)
+Clear? yes
+
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
/lost+found not found. Create? yes