Problem creating external journal with ext3

Theodore Tso
Tue, 17 Mar 2009 02:20:19 -0000

On Sun, Mar 15, 2009 at 02:21:58PM -0500, Jeff Layton
wrote:
> Afternoon,
>
>
> mke2fs -O journal_dev /dev/sdb1
> mke2fs -t ext3 -O ^has_journal /dev/sdba1
> tune2fs -o journal_data -j -J device=/dev/sdb1 /dev/sda1

Ah, I see what is happening.  When we added some consistency checks to
prevent insane filesystems from causing e2fsprogs to core dump, we
accidentally broke the ability of e2fsprogs manipulate journal device
files.  Oops.  This is a regression in e2fsprogs 1.41.4, that we'll
fix in e2fsprogs 1.41.5.  I've included the patch below.

       		 	       		    	  - Ted

commit 341b52dfa8c2afc11d8410de9bd381b03e75c6af
Author: Theodore Ts'o <tytso at mit.edu>
Date:   Mon Mar 16 22:16:44 2009 -0400

    libext2fs: external journal devices should not cause ext2fs_open2 to fail

    This fixes a regression introduced in commit 79a9ab14 which caused
    attempts to open external journals to fail due to overly strict
    filesystem consistency checks.

    Signed-off-by: "Theodore Ts'o" <tytso at mit.edu>

diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c
index cdfeaec..f6fe3f0 100644
--- a/lib/ext2fs/openfs.c
+++ b/lib/ext2fs/openfs.c
@@ -243,10 +243,6 @@ errcode_t ext2fs_open2(const char *name, const char
*io_options,
 		goto cleanup;
 	}
 	fs->fragsize = EXT2_FRAG_SIZE(fs->super);
-       if (EXT2_INODES_PER_GROUP(fs->super) == 0) {
-		retval = EXT2_ET_CORRUPT_SUPERBLOCK;
-		goto cleanup;
-	}
 	fs->inode_blocks_per_group = ((EXT2_INODES_PER_GROUP(fs->super) *
 				       EXT2_INODE_SIZE(fs->super) +
 				       EXT2_BLOCK_SIZE(fs->super) - 1) /
@@ -273,6 +269,11 @@ errcode_t ext2fs_open2(const char *name, const char
*io_options,
 		return 0;
 	}

+	if (EXT2_INODES_PER_GROUP(fs->super) == 0) {
+		retval = EXT2_ET_CORRUPT_SUPERBLOCK;
+		goto cleanup;
+	}
+
 	/*
 	 * Read group descriptors
 	 */