From ef8f64dfa875add3e1c428a4be3701e021062171 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Thu, 10 Nov 2011 17:05:12 -0600 Subject: [PATCH] More mmp fixes --- e2fsprogs-1.42-bigendian-fix.patch | 297 +++++++++++++++++++++++++++-- e2fsprogs.spec | 5 +- 2 files changed, 289 insertions(+), 13 deletions(-) diff --git a/e2fsprogs-1.42-bigendian-fix.patch b/e2fsprogs-1.42-bigendian-fix.patch index b938a0b..b873d09 100644 --- a/e2fsprogs-1.42-bigendian-fix.patch +++ b/e2fsprogs-1.42-bigendian-fix.patch @@ -1,8 +1,3 @@ -Date: Tue, 08 Nov 2011 16:26:35 -0600 -From: Eric Sandeen -To: ext4 development -Subject: [PATCH] libext2: advance group in ext2fs_open2 during swapping - Without this change, we go back to getting group descriptor "0" each time we go around the "for i" loop. It must properly advance through the filesystem. @@ -37,10 +32,288 @@ index 0cefe3f..40a52c5 100644 ext2fs_swap_group_desc2(fs, gdp); } #endif - --- -To unsubscribe from this list: send the line "unsubscribe linux-ext4" in -the body of a message to majordomo@vger.kernel.org -More majordomo info at http://vger.kernel.org/majordomo-info.html - - +diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c +index eba3b69..1fb8f44 100644 +--- a/debugfs/debugfs.c ++++ b/debugfs/debugfs.c +@@ -2165,11 +2165,15 @@ void do_punch(int argc, char *argv[]) + + void do_dump_mmp(int argc, char *argv[]) + { +- struct ext2_super_block *sb = current_fs->super; ++ struct ext2_super_block *sb; + struct mmp_struct *mmp_s; + time_t t; + errcode_t retval = 0; + ++ if (check_fs_open(argv[0])) ++ return; ++ ++ sb = current_fs->super; + if (sb->s_mmp_block <= sb->s_first_data_block || + sb->s_mmp_block >= ext2fs_blocks_count(sb)) { + com_err(argv[0], EXT2_ET_MMP_BAD_BLOCK, "while dumping it.\n"); +@@ -2203,6 +2207,7 @@ void do_dump_mmp(int argc, char *argv[]) + fprintf(stdout, "time: %lld -- %s", mmp_s->mmp_time, ctime(&t)); + fprintf(stdout, "node_name: %s\n", mmp_s->mmp_nodename); + fprintf(stdout, "device_name: %s\n", mmp_s->mmp_bdevname); ++ fprintf(stdout, "magic: 0x%x\n", mmp_s->mmp_magic); + } + + static int source_file(const char *cmd_file, int sci_idx) +diff --git a/debugfs/set_fields.c b/debugfs/set_fields.c +index d461275..0041160 100644 +--- a/debugfs/set_fields.c ++++ b/debugfs/set_fields.c +@@ -242,6 +242,9 @@ static struct field_set_info ext4_bg_fields[] = { + { 0, 0, 0, 0 } + }; + ++/* forward declaration */ ++static struct field_set_info mmp_fields[]; ++ + static int check_suffix(const char *field) + { + int len = strlen(field); +@@ -561,6 +564,9 @@ static void print_possible_fields(struct field_set_info *fields) + } else if (fields == inode_fields) { + type = "Inode"; + cmd = "set_inode"; ++ } else if (fields == mmp_fields) { ++ type = "MMP"; ++ cmd = "set_mmp_value"; + } else { + type = "Block group descriptor"; + cmd = "set_block_group"; +@@ -768,6 +774,9 @@ void do_set_mmp_value(int argc, char *argv[]) + return; + } + ++ if (check_fs_open(argv[0])) ++ return; ++ + if (current_fs->super->s_mmp_block == 0) { + com_err(argv[0], 0, "no MMP block allocated\n"); + return; +diff --git a/lib/ext2fs/mmp.c b/lib/ext2fs/mmp.c +index 91f4fb2..b27d9a4 100644 +--- a/lib/ext2fs/mmp.c ++++ b/lib/ext2fs/mmp.c +@@ -127,7 +127,7 @@ errcode_t ext2fs_mmp_write(ext2_filsys fs, blk64_t mmp_blk, void *buf) + + /* I was tempted to make this use O_DIRECT and the mmp_fd, but + * this caused no end of grief, while leaving it as-is works. */ +- retval = io_channel_write_blk64(fs->io, mmp_blk, -fs->blocksize, buf); ++ retval = io_channel_write_blk64(fs->io, mmp_blk, -(int)sizeof(struct mmp_struct), buf); + + #ifdef WORDS_BIGENDIAN + ext2fs_swap_mmp(mmp_s); +diff --git a/tests/f_mmp/script b/tests/f_mmp/script +index 548734a..4aca447 100644 +--- a/tests/f_mmp/script ++++ b/tests/f_mmp/script +@@ -12,7 +12,7 @@ if [ $? == 0 ]; then + fi + + echo "make the test image ..." > $test_name.log +-$MKE2FS -q -F -o Linux -b 1024 -O mmp -E mmp_update_interval=1 $TMPFILE 100 >> $test_name.log 2>&1 ++$MKE2FS -q -F -o Linux -b 4096 -O mmp -E mmp_update_interval=1 $TMPFILE 100 >> $test_name.log 2>&1 + status=$? + if [ "$status" != 0 ] ; then + echo "mke2fs -O mmp failed" > $test_name.failed +diff --git a/tests/f_mmp_garbage/expect.1 b/tests/f_mmp_garbage/expect.1 +index 4ee5cfb..a8add10 100644 +--- a/tests/f_mmp_garbage/expect.1 ++++ b/tests/f_mmp_garbage/expect.1 +@@ -5,5 +5,5 @@ Pass 2: Checking directory structure + Pass 3: Checking directory connectivity + Pass 4: Checking reference counts + Pass 5: Checking group summary information +-test_filesys: 11/16 files (0.0% non-contiguous), 22/100 blocks ++test_filesys: 11/64 files (0.0% non-contiguous), 13/100 blocks + Exit status is 0 +diff --git a/tests/f_mmp_garbage/expect.2 b/tests/f_mmp_garbage/expect.2 +index 3bf3869..6630002 100644 +--- a/tests/f_mmp_garbage/expect.2 ++++ b/tests/f_mmp_garbage/expect.2 +@@ -3,5 +3,5 @@ Pass 2: Checking directory structure + Pass 3: Checking directory connectivity + Pass 4: Checking reference counts + Pass 5: Checking group summary information +-test_filesys: 11/16 files (0.0% non-contiguous), 22/100 blocks ++test_filesys: 11/64 files (0.0% non-contiguous), 13/100 blocks + Exit status is 0 +diff --git a/tests/f_mmp_garbage/script b/tests/f_mmp_garbage/script +index 3c80032..8b5a22a 100644 +--- a/tests/f_mmp_garbage/script ++++ b/tests/f_mmp_garbage/script +@@ -12,7 +12,7 @@ if [ $? == 0 ] ; then + fi + + echo "make the test image ..." > $test_name.log +-$MKE2FS -q -F -o Linux -b 1024 -O mmp -E mmp_update_interval=1 $TMPFILE 100 >> $test_name.log 2>&1 ++$MKE2FS -q -F -o Linux -b 4096 -O mmp -E mmp_update_interval=1 $TMPFILE 100 >> $test_name.log 2>&1 + status=$? + if [ "$status" != 0 ] ; then + echo "mke2fs -O mmp failed" > $test_name.failed +diff --git a/tests/m_mmp/expect.1 b/tests/m_mmp/expect.1 +index 3a00815..d3319b3 100644 +--- a/tests/m_mmp/expect.1 ++++ b/tests/m_mmp/expect.1 +@@ -1,55 +1,55 @@ + Filesystem label= + OS type: Linux +-Block size=2048 (log=1) +-Fragment size=2048 (log=1) ++Block size=4096 (log=2) ++Fragment size=4096 (log=2) + Stride=0 blocks, Stripe width=0 blocks +-16384 inodes, 32768 blocks +-1638 blocks (5.00%) reserved for the super user ++65536 inodes, 65536 blocks ++3276 blocks (5.00%) reserved for the super user + First data block=0 +-Maximum filesystem blocks=33554432 ++Maximum filesystem blocks=67108864 + 2 block groups +-16384 blocks per group, 16384 fragments per group +-8192 inodes per group ++32768 blocks per group, 32768 fragments per group ++32768 inodes per group + Superblock backups stored on blocks: +- 16384 ++ 32768 + + Allocating group tables: 0/21/2 done + Writing inode tables: 0/21/2 done + Multiple mount protection is enabled with update interval 5 seconds. + Writing superblocks and filesystem accounting information: 0/21/2 done + +-Filesystem features: ext_attr resize_inode dir_index filetype mmp sparse_super ++Filesystem features: ext_attr resize_inode dir_index filetype mmp sparse_super large_file + + Pass 1: Checking inodes, blocks, and sizes + Pass 2: Checking directory structure + Pass 3: Checking directory connectivity + Pass 4: Checking reference counts + Pass 5: Checking group summary information +-test_filesys: 11/16384 files (0.0% non-contiguous), 1105/32768 blocks ++test_filesys: 11/65536 files (0.0% non-contiguous), 2093/65536 blocks + Exit status is 0 + + Filesystem volume name: + Last mounted on: + Filesystem magic number: 0xEF53 + Filesystem revision #: 1 (dynamic) +-Filesystem features: ext_attr resize_inode dir_index filetype mmp sparse_super ++Filesystem features: ext_attr resize_inode dir_index filetype mmp sparse_super large_file + Default mount options: (none) + Filesystem state: clean + Errors behavior: Continue + Filesystem OS type: Linux +-Inode count: 16384 +-Block count: 32768 +-Reserved block count: 1638 +-Free blocks: 31663 +-Free inodes: 16373 ++Inode count: 65536 ++Block count: 65536 ++Reserved block count: 3276 ++Free blocks: 63443 ++Free inodes: 65525 + First block: 0 +-Block size: 2048 +-Fragment size: 2048 +-Reserved GDT blocks: 31 +-Blocks per group: 16384 +-Fragments per group: 16384 +-Inodes per group: 8192 +-Inode blocks per group: 512 ++Block size: 4096 ++Fragment size: 4096 ++Reserved GDT blocks: 15 ++Blocks per group: 32768 ++Fragments per group: 32768 ++Inodes per group: 32768 ++Inode blocks per group: 1024 + Mount count: 0 + Check interval: 15552000 (6 months) + Reserved blocks uid: 0 +@@ -57,23 +57,23 @@ Reserved blocks gid: 0 + First inode: 11 + Inode size: 128 + Default directory hash: half_md4 +-MMP block number: 557 ++MMP block number: 1049 + MMP update interval: 5 + + +-Group 0: (Blocks 0-16383) ++Group 0: (Blocks 0-32767) + Primary superblock at 0, Group descriptors at 1-1 +- Reserved GDT blocks at 2-32 +- Block bitmap at 33 (+33), Inode bitmap at 34 (+34) +- Inode table at 35-546 (+35) +- 15826 free blocks, 8181 free inodes, 2 directories +- Free blocks: 558-16383 +- Free inodes: 12-8192 +-Group 1: (Blocks 16384-32767) +- Backup superblock at 16384, Group descriptors at 16385-16385 +- Reserved GDT blocks at 16386-16416 +- Block bitmap at 16417 (+33), Inode bitmap at 16418 (+34) +- Inode table at 16419-16930 (+35) +- 15837 free blocks, 8192 free inodes, 0 directories +- Free blocks: 16931-32767 +- Free inodes: 8193-16384 ++ Reserved GDT blocks at 2-16 ++ Block bitmap at 17 (+17), Inode bitmap at 18 (+18) ++ Inode table at 19-1042 (+19) ++ 31718 free blocks, 32757 free inodes, 2 directories ++ Free blocks: 1050-32767 ++ Free inodes: 12-32768 ++Group 1: (Blocks 32768-65535) ++ Backup superblock at 32768, Group descriptors at 32769-32769 ++ Reserved GDT blocks at 32770-32784 ++ Block bitmap at 32785 (+17), Inode bitmap at 32786 (+18) ++ Inode table at 32787-33810 (+19) ++ 31725 free blocks, 32768 free inodes, 0 directories ++ Free blocks: 33811-65535 ++ Free inodes: 32769-65536 +diff --git a/tests/m_mmp/script b/tests/m_mmp/script +index 1547463..b3e206a 100644 +--- a/tests/m_mmp/script ++++ b/tests/m_mmp/script +@@ -10,6 +10,6 @@ if [ $? == 0 ]; then + echo "skipped for tmpfs (no O_DIRECT support)" + return 0 + fi +-MKE2FS_OPTS="-O mmp" ++MKE2FS_OPTS="-b 4096 -O mmp" + . $cmd_dir/run_mke2fs + unset MKE2FS_DEVICE_SECTSIZE +diff --git a/tests/t_mmp_1on/script b/tests/t_mmp_1on/script +index ee9884f..3b0a376 100644 +--- a/tests/t_mmp_1on/script ++++ b/tests/t_mmp_1on/script +@@ -11,7 +11,7 @@ if [ $? == 0 ] ; then + return 0 + fi + +-$MKE2FS -q -F -o Linux -b 1024 $TMPFILE 100 > $test_name.log 2>&1 ++$MKE2FS -q -F -o Linux -b 4096 $TMPFILE 100 > $test_name.log 2>&1 + status=$? + if [ "$status" != 0 ] ; then + echo "mke2fs failed" > $test_name.failed +diff --git a/tests/t_mmp_2off/script b/tests/t_mmp_2off/script +index ec9f71e..56c6bed 100644 +--- a/tests/t_mmp_2off/script ++++ b/tests/t_mmp_2off/script +@@ -11,7 +11,7 @@ if [ $? == 0 ]; then + return 0 + fi + +-$MKE2FS -q -F -o Linux -b 1024 -O mmp $TMPFILE 100 > $test_name.log 2>&1 ++$MKE2FS -q -F -o Linux -b 4096 -O mmp $TMPFILE 100 > $test_name.log 2>&1 + status=$? + if [ "$status" != 0 ] ; then + echo "mke2fs -O mmp failed" > $test_name.failed diff --git a/e2fsprogs.spec b/e2fsprogs.spec index cc88478..10d8deb 100644 --- a/e2fsprogs.spec +++ b/e2fsprogs.spec @@ -4,7 +4,7 @@ Summary: Utilities for managing ext2, ext3, and ext4 filesystems Name: e2fsprogs Version: 1.42 -Release: 0.6.WIP.1016%{?dist} +Release: 0.7.WIP.1016%{?dist} # License tags based on COPYING file distinctions for various components License: GPLv2 @@ -322,6 +322,9 @@ exit 0 %{_libdir}/pkgconfig/ss.pc %changelog +* Thu Nov 10 2011 Eric Sandeen 1.42-0.7.WIP.1016 +- Several mmp-related fixes + * Tue Nov 08 2011 Eric Sandeen 1.42-0.6.WIP.1016 - Fix e2fsck / make check on big endian arch