diff options
Diffstat (limited to 'e2fsck/super.c')
-rw-r--r-- | e2fsck/super.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/e2fsck/super.c b/e2fsck/super.c index a4835f76..954783e0 100644 --- a/e2fsck/super.c +++ b/e2fsck/super.c @@ -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 - * 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) { ext2_filsys fs = ctx->fs; @@ -814,10 +832,18 @@ int check_backup_super_block(e2fsck_t ctx) 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) || - SUPER_DIFFERENT(s_feature_incompat) || - SUPER_DIFFERENT(s_feature_ro_compat) || + SUPER_INCOMPAT_DIFFERENT(s_feature_incompat) || + SUPER_RO_COMPAT_DIFFERENT(s_feature_ro_compat) || SUPER_DIFFERENT(s_blocks_count) || SUPER_DIFFERENT(s_inodes_count) || memcmp(fs->super->s_uuid, tfs->super->s_uuid, |