summaryrefslogtreecommitdiff
path: root/debugfs
diff options
context:
space:
mode:
authorAndreas Dilger <adilger@dilger.ca>2013-12-23 16:04:46 -0500
committerTheodore Ts'o <tytso@mit.edu>2013-12-24 22:50:19 -0500
commit2bc30417541deffca795db8ec4e7f7ccb616dc3f (patch)
tree70a09a5ab89dfe7e92f5383e4832ef78f8c908d2 /debugfs
parent11d1116a7c0b833af317249d12025413fecbcd70 (diff)
downloade2fsprogs-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.c11
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);