Whamcloud - gitweb
debugfs, e2fsck: fix s_desc_size handling
authorAndreas Dilger <adilger@dilger.ca>
Mon, 23 Dec 2013 21:04:46 +0000 (16:04 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 25 Dec 2013 03:50:19 +0000 (22:50 -0500)
commit2bc30417541deffca795db8ec4e7f7ccb616dc3f
tree70a09a5ab89dfe7e92f5383e4832ef78f8c908d2
parent11d1116a7c0b833af317249d12025413fecbcd70
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>
16 files changed:
debugfs/set_fields.c
e2fsck/iscan.c
lib/ext2fs/blknum.c
lib/ext2fs/csum.c
lib/ext2fs/initialize.c
lib/ext2fs/swapfs.c
misc/mke2fs.c
tests/f_desc_size_128/expect.1 [new file with mode: 0644]
tests/f_desc_size_128/expect.2 [new file with mode: 0644]
tests/f_desc_size_128/image.gz [new file with mode: 0644]
tests/f_desc_size_128/name [new file with mode: 0644]
tests/f_desc_size_bad/expect.1 [new file with mode: 0644]
tests/f_desc_size_bad/expect.2 [new file with mode: 0644]
tests/f_desc_size_bad/script [new file with mode: 0644]
tests/m_desc_size_128/expect.1 [new file with mode: 0644]
tests/m_desc_size_128/script [new file with mode: 0644]