On 2010-08-23, at 19:34, Justin Maggard wrote: > Creating a 4TB file on a filesystem with the 64bit flag set results in e2fsck consistently complaining about i_blocks being wrong, with confusing messages like this: > > That appears to be caused by ext2fs_inode_i_blocks() checking for the EXT4_FEATURE_RO_COMPAT_HUGE_FILE in the wrong place. Fix it. > > - ((fs->super->s_feature_incompat & > + ((fs->super->s_feature_ro_compat & > EXT4_FEATURE_RO_COMPAT_HUGE_FILE) ? This isn't the first time that we've had problems like this, and it won't be the last time unless there is a better API for checking these flags. I've long thought about having something like: #define EXT4_CHECK_COMPAT(sb, flag) ((super)->s_feature_compat & \ EXT4_FEATURE_COMPAT_ ## flag) #define EXT4_CHECK_RO_COMPAT(sb, flag) ((super)->s_feature_ro_compat & \ EXT4_FEATURE_RO_COMPAT_ ## flag) #define EXT4_CHECK_INCOMPAT(sb, flag) ((super)->s_feature_incompat & \ EXT4_FEATURE_INCOMPAT_ ## flag) #define EXT4_SET_COMPAT(sb, flag) do { (super)->s_feature_compat |= \ EXT4_FEATURE_COMPAT_ ## flag; } while(0) #define EXT4_SET_RO_COMPAT(sb, flag) do { (super)->s_feature_ro_compat |= \ EXT4_FEATURE_RO_COMPAT_ ##flag;} while(0) #define EXT4_SET_INCOMPAT(sb, flag) do { (super)->s_feature_incompat |= \ EXT4_FEATURE_INCOMPAT_ ## flag;} while(0) This will produce a compile error if the flag name and the macro name don't match. Unfortunately, for e2fsprogs we will need 3 sets of such macros because the feature flags are named EXT2_*, EXT3_*, and EXT4_*, depending on when they were added. For the kernel code that wouldn't be needed. Cheers, Andreas -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html