More mmp fixes

This commit is contained in:
Eric Sandeen 2011-11-10 17:05:12 -06:00
parent c8c716f425
commit ef8f64dfa8
2 changed files with 289 additions and 13 deletions

View File

@ -1,8 +1,3 @@
Date: Tue, 08 Nov 2011 16:26:35 -0600
From: Eric Sandeen <sandeen@redhat.com>
To: ext4 development <linux-ext4@vger.kernel.org>
Subject: [PATCH] libext2: advance group in ext2fs_open2 during swapping
Without this change, we go back to getting group descriptor Without this change, we go back to getting group descriptor
"0" each time we go around the "for i" loop. It must properly "0" each time we go around the "for i" loop. It must properly
advance through the filesystem. advance through the filesystem.
@ -37,10 +32,288 @@ index 0cefe3f..40a52c5 100644
ext2fs_swap_group_desc2(fs, gdp); ext2fs_swap_group_desc2(fs, gdp);
} }
#endif #endif
diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
-- index eba3b69..1fb8f44 100644
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in --- a/debugfs/debugfs.c
the body of a message to majordomo@vger.kernel.org +++ b/debugfs/debugfs.c
More majordomo info at http://vger.kernel.org/majordomo-info.html @@ -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: <none>
Last mounted on: <not available>
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

View File

@ -4,7 +4,7 @@
Summary: Utilities for managing ext2, ext3, and ext4 filesystems Summary: Utilities for managing ext2, ext3, and ext4 filesystems
Name: e2fsprogs Name: e2fsprogs
Version: 1.42 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 tags based on COPYING file distinctions for various components
License: GPLv2 License: GPLv2
@ -322,6 +322,9 @@ exit 0
%{_libdir}/pkgconfig/ss.pc %{_libdir}/pkgconfig/ss.pc
%changelog %changelog
* Thu Nov 10 2011 Eric Sandeen <sandeen@redhat.com> 1.42-0.7.WIP.1016
- Several mmp-related fixes
* Tue Nov 08 2011 Eric Sandeen <sandeen@redhat.com> 1.42-0.6.WIP.1016 * Tue Nov 08 2011 Eric Sandeen <sandeen@redhat.com> 1.42-0.6.WIP.1016
- Fix e2fsck / make check on big endian arch - Fix e2fsck / make check on big endian arch