mirror of https://github.com/vitalif/e2fsprogs
Ignore "safe" flag differences when e2fsck compares superblocks
Recent e2fsprogs (1.40.3 and higher) fsck compares primary superblock to backups, and if things differ, it forces a full check. However, the kernel has a penchant for updating flags the first time a feature is used - attributes, large files, etc. This is a bad idea, and we should break the kernel of this habit, especially for the ext4 feature flags. But for now, let's make e2fsck avoid forcing a full check and backup except when absolutely necessary. Signed-off-by: Eric Sandeen <sandeen@redhat.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>bitmap-optimize
parent
2921332fd8
commit
a8cde73acb
|
@ -773,8 +773,26 @@ void check_super_block(e2fsck_t ctx)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if we should backup the master sb to the backup super
|
* Check to see if we should backup the master sb to the backup super
|
||||||
* blocks.
|
* blocks. Returns non-zero if the sb should be backed up.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A few flags are set on the fly by the kernel, but only in the
|
||||||
|
* primary superblock. This is actually a bad thing, and we should
|
||||||
|
* try to discourage it in the future. In particular, for the newer
|
||||||
|
* ext4 files, especially EXT4_FEATURE_RO_COMPAT_DIR_NLINK and
|
||||||
|
* EXT3_FEATURE_INCOMPAT_EXTENTS. So some of these may go away in the
|
||||||
|
* future.
|
||||||
|
*
|
||||||
|
* The kernel will set EXT2_FEATURE_COMPAT_EXT_ATTR, but
|
||||||
|
* unfortunately, we shouldn't ignore it since if it's not set in the
|
||||||
|
* backup, the extended attributes in the filesystem will be stripped
|
||||||
|
* away.
|
||||||
|
*/
|
||||||
|
#define FEATURE_RO_COMPAT_IGNORE (EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
|
||||||
|
EXT4_FEATURE_RO_COMPAT_DIR_NLINK)
|
||||||
|
#define FEATURE_INCOMPAT_IGNORE (EXT3_FEATURE_INCOMPAT_EXTENTS)
|
||||||
|
|
||||||
int check_backup_super_block(e2fsck_t ctx)
|
int check_backup_super_block(e2fsck_t ctx)
|
||||||
{
|
{
|
||||||
ext2_filsys fs = ctx->fs;
|
ext2_filsys fs = ctx->fs;
|
||||||
|
@ -814,10 +832,18 @@ int check_backup_super_block(e2fsck_t ctx)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SUPER_DIFFERENT(x) (fs->super->x != tfs->super->x)
|
#define SUPER_INCOMPAT_DIFFERENT(x) \
|
||||||
|
(( fs->super->x & ~FEATURE_INCOMPAT_IGNORE) != \
|
||||||
|
(tfs->super->x & ~FEATURE_INCOMPAT_IGNORE))
|
||||||
|
#define SUPER_RO_COMPAT_DIFFERENT(x) \
|
||||||
|
(( fs->super->x & ~FEATURE_RO_COMPAT_IGNORE) != \
|
||||||
|
(tfs->super->x & ~FEATURE_RO_COMPAT_IGNORE))
|
||||||
|
#define SUPER_DIFFERENT(x) \
|
||||||
|
(fs->super->x != tfs->super->x)
|
||||||
|
|
||||||
if (SUPER_DIFFERENT(s_feature_compat) ||
|
if (SUPER_DIFFERENT(s_feature_compat) ||
|
||||||
SUPER_DIFFERENT(s_feature_incompat) ||
|
SUPER_INCOMPAT_DIFFERENT(s_feature_incompat) ||
|
||||||
SUPER_DIFFERENT(s_feature_ro_compat) ||
|
SUPER_RO_COMPAT_DIFFERENT(s_feature_ro_compat) ||
|
||||||
SUPER_DIFFERENT(s_blocks_count) ||
|
SUPER_DIFFERENT(s_blocks_count) ||
|
||||||
SUPER_DIFFERENT(s_inodes_count) ||
|
SUPER_DIFFERENT(s_inodes_count) ||
|
||||||
memcmp(fs->super->s_uuid, tfs->super->s_uuid,
|
memcmp(fs->super->s_uuid, tfs->super->s_uuid,
|
||||||
|
|
Loading…
Reference in New Issue