diff options
author | Andreas Dilger <adilger@dilger.ca> | 2013-12-23 16:04:46 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2013-12-24 22:50:19 -0500 |
commit | 2bc30417541deffca795db8ec4e7f7ccb616dc3f (patch) | |
tree | 70a09a5ab89dfe7e92f5383e4832ef78f8c908d2 /debugfs | |
parent | 11d1116a7c0b833af317249d12025413fecbcd70 (diff) | |
download | e2fsprogs-2bc30417541deffca795db8ec4e7f7ccb616dc3f.tar.gz |
debugfs, e2fsck: fix s_desc_size handling
The s_desc_size in the superblock specifies the group descriptor
size in bytes, but in various places the EXT4_FEATURE_INCOMPAT_64BIT
flag implies that the descriptor size is EXT2_MIN_DESC_SIZE_64BIT
(64 bytes) instead of checking the actual size. In other places,
the s_desc_size field is used without checking for INCOMPAT_64BIT.
In the case of ext2fs_group_desc() the s_desc_size was being ignored,
and assumed to be sizeof(struct ext4_group_desc), which would result
in garbage for any but the first group descriptor. Similarly, in
ext2fs_group_desc_csum() and print_csum() they assumed that the
maximum group descriptor size was sizeof(struct ext4_group_desc).
Fix these functions to use the actual superblock s_desc_size if
INCOMPAT_64BIT.
Conversely, in ext2fs_swap_group_desc2() s_desc_size was used
without checking for INCOMPAT_64BIT being set.
The e2fsprogs behaviour is different than that of the kernel,
which always checks INCOMPAT_64BIT, and only uses s_desc_size to
determine the offset of group descriptors and what range of bytes
to checksum.
Allow specifying the s_desc_size field at mke2fs time with the
"-E desc_size=NNN" option. Allow a power-of-two s_desc_size
value up to s_blocksize if INCOMPAT_64BIT is specified. This
is not expected to be used by regular users at this time, so it
is not currently documented in the mke2fs usage or man page.
Add m_desc_size_128, f_desc_size_128, and f_desc_bad test cases to
verify mke2fs and e2fsck handling of larger group descriptor sizes.
Signed-off-by: Andreas Dilger <adilger@dilger.ca>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'debugfs')
-rw-r--r-- | debugfs/set_fields.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/debugfs/set_fields.c b/debugfs/set_fields.c index 064de395..9c3b0001 100644 --- a/debugfs/set_fields.c +++ b/debugfs/set_fields.c @@ -702,11 +702,14 @@ void do_set_block_group_descriptor(int argc, char *argv[]) int size; /* - *Determine whether we are editing an ext2 or ext4 block - * group descriptor + * Determine whether we are editing an ext2 or ext4 block group + * descriptor. Descriptors larger than ext4_group_desc cannot + * have their fields edited yet, because they do not have any + * names assigned. When that happens, this function needs to + * be updated for the new descriptor struct and fields. */ - if (current_fs && current_fs->super->s_feature_incompat & - EXT4_FEATURE_INCOMPAT_64BIT) { + if (current_fs && + EXT2_DESC_SIZE(current_fs->super) >= EXT2_MIN_DESC_SIZE_64BIT) { table = ext4_bg_fields; edit = &set_gd4; size = sizeof(set_gd4); |