From 5b7147c32ee4651fdacd1bb41b039e76645a1d42 Mon Sep 17 00:00:00 2001
From: kalpak <kalpak>
Date: Wed, 5 Nov 2008 09:13:07 +0000
Subject: [PATCH] b=16438 i=adilger i=girish

Mounting a filesystem with extents feature will fail on big-endian systems since ext3-based ldiskfs is not supported on big-endian systems. This can be over-riden with "bigendian_extents" mount option.
---
 .../ext3-big-endian-check-2.6-rhel4.patch     | 57 +++++++++++++++++++
 .../ext3-big-endian-check-2.6-rhel5.patch     | 56 ++++++++++++++++++
 .../ext3-big-endian-check-2.6-sles10.patch    | 57 +++++++++++++++++++
 .../ext3-big-endian-check-2.6-suse.patch      | 57 +++++++++++++++++++
 ...ext3-big-endian-check-2.6.22-vanilla.patch | 56 ++++++++++++++++++
 .../series/ldiskfs-2.6-rhel4.series           |  1 +
 .../series/ldiskfs-2.6-rhel5.series           |  1 +
 .../series/ldiskfs-2.6-sles10.series          |  1 +
 .../series/ldiskfs-2.6-suse.series            |  1 +
 .../series/ldiskfs-2.6.22-vanilla.series      |  1 +
 10 files changed, 288 insertions(+)
 create mode 100644 ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-rhel4.patch
 create mode 100644 ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-rhel5.patch
 create mode 100644 ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-sles10.patch
 create mode 100644 ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-suse.patch
 create mode 100644 ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6.22-vanilla.patch

diff --git a/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-rhel4.patch b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-rhel4.patch
new file mode 100644
index 0000000000..10959fcf88
--- /dev/null
+++ b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-rhel4.patch
@@ -0,0 +1,57 @@
+Index: linux-2.6.9-67.0.22/fs/ext3/super.c
+===================================================================
+--- linux-2.6.9-67.0.22.orig/fs/ext3/super.c
++++ linux-2.6.9-67.0.22/fs/ext3/super.c
+@@ -89,6 +89,8 @@ handle_t *ext3_journal_start_sb(struct s
+ 	return journal_start(journal, nblocks);
+ }
+ 
++static int bigendian_extents;
++
+ /* 
+  * The only special thing we need to do here is to make sure that all
+  * journal_stop calls result in the superblock being marked dirty, so
+@@ -657,7 +659,7 @@ enum {
+ 	Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0,
+ 	Opt_ignore, Opt_barrier, Opt_err, Opt_resize,
+ 	Opt_iopen, Opt_noiopen, Opt_iopen_nopriv,
+-	Opt_extents, Opt_noextents, Opt_extdebug,
++	Opt_extents, Opt_noextents, Opt_bigendian_extents, Opt_extdebug,
+ 	Opt_mballoc, Opt_nomballoc, Opt_stripe,
+ };
+ 
+@@ -711,6 +713,7 @@ static match_table_t tokens = {
+ 	{Opt_iopen_nopriv, "iopen_nopriv"},
+ 	{Opt_extents, "extents"},
+ 	{Opt_noextents, "noextents"},
++	{Opt_bigendian_extents, "bigendian_extents"},
+ 	{Opt_extdebug, "extdebug"},
+ 	{Opt_barrier, "barrier=%u"},
+ 	{Opt_mballoc, "mballoc"},
+@@ -1036,6 +1039,9 @@ clear_qf_name:
+ 		case Opt_noextents:
+ 			clear_opt (sbi->s_mount_opt, EXTENTS);
+ 			break;
++		case Opt_bigendian_extents:
++			bigendian_extents = 1;
++			break;
+ 		case Opt_extdebug:
+ 			set_opt (sbi->s_mount_opt, EXTDEBUG);
+ 			break;
+@@ -1952,6 +1958,16 @@ static int ext3_fill_super (struct super
+ 			    NULL, 0))
+ 		goto failed_mount;
+ 
++#ifdef __BIG_ENDIAN
++	if (bigendian_extents == 0) {
++		printk(KERN_ERR "EXT3-fs: e2fsck is not guaranteed to work "
++		       "correctly on the filesystem if EXTENTS feature is "
++		       "used on big-endian systems. Use \"bigendian_extents\" "
++		       "mount option to override.\n");
++		goto failed_mount;
++	}
++#endif
++
+ 	set_sb_time_gran(sb, 1000000000U);
+ 	sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
+ 		((sbi->s_mount_opt & EXT3_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0);
diff --git a/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-rhel5.patch b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-rhel5.patch
new file mode 100644
index 0000000000..30c5ce0da2
--- /dev/null
+++ b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-rhel5.patch
@@ -0,0 +1,56 @@
+Index: linux-2.6.18-92.1.6/fs/ext3/super.c
+===================================================================
+--- linux-2.6.18-92.1.6.orig/fs/ext3/super.c
++++ linux-2.6.18-92.1.6/fs/ext3/super.c
+@@ -71,6 +71,8 @@ static void ext3_unlockfs(struct super_b
+ static void ext3_write_super (struct super_block * sb);
+ static void ext3_write_super_lockfs(struct super_block *sb);
+ 
++static int bigendian_extents;
++
+ /* 
+  * Wrappers for journal_start/end.
+  *
+@@ -706,7 +708,7 @@ enum {
+ 	Opt_ignore, Opt_barrier, Opt_err, Opt_resize, Opt_usrquota,
+ 	Opt_iopen, Opt_noiopen, Opt_iopen_nopriv,
+ 	Opt_grpquota,
+-	Opt_extents, Opt_noextents, Opt_extdebug,
++	Opt_extents, Opt_noextents, Opt_bigendian_extents, Opt_extdebug,
+ 	Opt_mballoc, Opt_nomballoc, Opt_stripe,
+ };
+ 
+@@ -766,6 +768,7 @@ static match_table_t tokens = {
+ 	{Opt_barrier, "barrier=%u"},
+ 	{Opt_extents, "extents"},
+ 	{Opt_noextents, "noextents"},
++	{Opt_bigendian_extents, "bigendian_extents"},
+ 	{Opt_extdebug, "extdebug"},
+ 	{Opt_mballoc, "mballoc"},
+ 	{Opt_nomballoc, "nomballoc"},
+@@ -1129,6 +1132,9 @@ clear_qf_name:
+ 		case Opt_noextents:
+ 			clear_opt (sbi->s_mount_opt, EXTENTS);
+ 			break;
++		case Opt_bigendian_extents:
++			bigendian_extents = 1;
++			break;
+ 		case Opt_extdebug:
+ 			set_opt (sbi->s_mount_opt, EXTDEBUG);
+ 			break;
+@@ -2224,6 +2230,15 @@ static int ext3_fill_super (struct super
+ 		goto failed_mount;
+ 	}
+ 
++#ifdef __BIG_ENDIAN
++	if (bigendian_extents == 0) {
++		printk(KERN_ERR "EXT3-fs: extents feature is not guaranteed to "
++		       "work on big-endian systems. Use \"bigendian_extents\" "
++		       "mount option to override.\n");
++		goto failed_mount;
++	}
++#endif
++
+ 	bgl_lock_init(&sbi->s_blockgroup_lock);
+ 
+ 	sbi->s_last_alloc_group = -1;
diff --git a/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-sles10.patch b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-sles10.patch
new file mode 100644
index 0000000000..2ac0aee3b7
--- /dev/null
+++ b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-sles10.patch
@@ -0,0 +1,57 @@
+Index: linux-2.6.16.60-0.27/fs/ext3/super.c
+===================================================================
+--- linux-2.6.16.60-0.27.orig/fs/ext3/super.c
++++ linux-2.6.16.60-0.27/fs/ext3/super.c
+@@ -100,6 +100,8 @@ handle_t *ext3_journal_start_sb(struct s
+ 	return journal_start(journal, nblocks);
+ }
+ 
++static int bigendian_extents;
++
+ /* 
+  * The only special thing we need to do here is to make sure that all
+  * journal_stop calls result in the superblock being marked dirty, so
+@@ -703,7 +705,7 @@ enum {
+ 	Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_quota, Opt_noquota,
+ 	Opt_ignore, Opt_barrier, Opt_err, Opt_resize, Opt_usrquota,
+ 	Opt_iopen, Opt_noiopen, Opt_iopen_nopriv,
+-	Opt_extents, Opt_noextents, Opt_extdebug,
++	Opt_extents, Opt_noextents, Opt_bigendian_extents, Opt_extdebug,
+ 	Opt_mballoc, Opt_nomballoc, Opt_stripe,
+ 	Opt_grpquota
+ };
+@@ -762,6 +764,7 @@ static match_table_t tokens = {
+ 	{Opt_iopen_nopriv, "iopen_nopriv"},
+ 	{Opt_extents, "extents"},
+ 	{Opt_noextents, "noextents"},
++	{Opt_bigendian_extents, "bigendian_extents"},
+ 	{Opt_extdebug, "extdebug"},
+ 	{Opt_barrier, "barrier=%u"},
+ 	{Opt_mballoc, "mballoc"},
+@@ -1122,6 +1125,9 @@ clear_qf_name:
+ 		case Opt_noextents:
+ 			clear_opt (sbi->s_mount_opt, EXTENTS);
+ 			break;
++		case Opt_bigendian_extents:
++			bigendian_extents = 1;
++			break;
+ 		case Opt_extdebug:
+ 			set_opt (sbi->s_mount_opt, EXTDEBUG);
+ 			break;
+@@ -2052,6 +2058,16 @@ static int ext3_fill_super (struct super
+ 			    NULL, 0))
+ 		goto failed_mount;
+ 
++#ifdef __BIG_ENDIAN
++	if (bigendian_extents == 0) {
++		printk(KERN_ERR "EXT3-fs: e2fsck is not guaranteed to work "
++		       "correctly on the filesystem if EXTENTS feature is "
++		       "used on big-endian systems. Use \"bigendian_extents\" "
++		       "mount option to override.\n");
++		goto failed_mount;
++	}
++#endif
++
+ 	sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
+ 		((sbi->s_mount_opt & EXT3_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0);
+ 
diff --git a/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-suse.patch b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-suse.patch
new file mode 100644
index 0000000000..a35ec6c1a2
--- /dev/null
+++ b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6-suse.patch
@@ -0,0 +1,57 @@
+Index: linux-2.6.5-7.312/fs/ext3/super.c
+===================================================================
+--- linux-2.6.5-7.312.orig/fs/ext3/super.c
++++ linux-2.6.5-7.312/fs/ext3/super.c
+@@ -84,6 +84,8 @@ handle_t *ext3_journal_start(struct inod
+ 	return journal_start(journal, nblocks);
+ }
+ 
++static int bigendian_extents;
++
+ /* 
+  * The only special thing we need to do here is to make sure that all
+  * journal_stop calls result in the superblock being marked dirty, so
+@@ -601,7 +603,7 @@ enum {
+ 	Opt_ignore, Opt_barrier,
+ 	Opt_err,
+ 	Opt_iopen, Opt_noiopen, Opt_iopen_nopriv,
+-	Opt_extents, Opt_noextents, Opt_extdebug,
++	Opt_extents, Opt_noextents, Opt_bigendian_extents, Opt_extdebug,
+ 	Opt_mballoc, Opt_nomballoc, Opt_stripe,
+ };
+ 
+@@ -649,6 +651,7 @@ static match_table_t tokens = {
+ 	{Opt_iopen_nopriv, "iopen_nopriv"},
+ 	{Opt_extents, "extents"},
+ 	{Opt_noextents, "noextents"},
++	{Opt_bigendian_extents, "bigendian_extents"},
+ 	{Opt_extdebug, "extdebug"},
+ 	{Opt_barrier, "barrier=%u"},
+ 	{Opt_mballoc, "mballoc"},
+@@ -886,6 +889,9 @@ static int parse_options (char * options
+ 		case Opt_noextents:
+ 			clear_opt (sbi->s_mount_opt, EXTENTS);
+ 			break;
++		case Opt_bigendian_extents:
++			bigendian_extents = 1;
++			break;
+ 		case Opt_extdebug:
+ 			set_opt (sbi->s_mount_opt, EXTDEBUG);
+ 			break;
+@@ -1450,6 +1456,16 @@ static int ext3_fill_super (struct super
+ 			    0))
+ 		goto failed_mount;
+ 
++#ifdef __BIG_ENDIAN
++	if (bigendian_extents == 0) {
++		printk(KERN_ERR "EXT3-fs: e2fsck is not guaranteed to work "
++		       "correctly on the filesystem if EXTENTS feature is "
++		       "used on big-endian systems. Use \"bigendian_extents\" "
++		       "mount option to override.\n");
++		goto failed_mount;
++	}
++#endif
++
+ 	sb->s_flags |= MS_ONE_SECOND;
+ 	sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
+ 		((sbi->s_mount_opt & EXT3_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0);
diff --git a/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6.22-vanilla.patch b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6.22-vanilla.patch
new file mode 100644
index 0000000000..20c8d1d8f5
--- /dev/null
+++ b/ldiskfs/kernel_patches/patches/ext3-big-endian-check-2.6.22-vanilla.patch
@@ -0,0 +1,56 @@
+Index: linux-2.6.22.14/fs/ext3/super.c
+===================================================================
+--- linux-2.6.22.14.orig/fs/ext3/super.c
++++ linux-2.6.22.14/fs/ext3/super.c
+@@ -71,6 +71,8 @@ static void ext3_unlockfs(struct super_b
+ static void ext3_write_super (struct super_block * sb);
+ static void ext3_write_super_lockfs(struct super_block *sb);
+ 
++static int bigendian_extents;
++
+ /*
+  * Wrappers for journal_start/end.
+  *
+@@ -700,7 +702,7 @@ enum {
+ 	Opt_ignore, Opt_barrier, Opt_err, Opt_resize, Opt_usrquota,
+ 	Opt_iopen, Opt_noiopen, Opt_iopen_nopriv,
+ 	Opt_grpquota,
+-	Opt_extents, Opt_noextents, Opt_extdebug,
++	Opt_extents, Opt_noextents, Opt_bigendian_extents, Opt_extdebug,
+ 	Opt_mballoc, Opt_nomballoc, Opt_stripe,
+ };
+ 
+@@ -756,6 +758,7 @@ static match_table_t tokens = {
+ 	{Opt_barrier, "barrier=%u"},
+ 	{Opt_extents, "extents"},
+ 	{Opt_noextents, "noextents"},
++	{Opt_bigendian_extents, "bigendian_extents"},
+ 	{Opt_extdebug, "extdebug"},
+ 	{Opt_mballoc, "mballoc"},
+ 	{Opt_nomballoc, "nomballoc"},
+@@ -1110,6 +1113,9 @@ clear_qf_name:
+ 		case Opt_noextents:
+ 			clear_opt (sbi->s_mount_opt, EXTENTS);
+ 			break;
++		case Opt_bigendian_extents:
++			bigendian_extents = 1;
++			break;
+ 		case Opt_extdebug:
+ 			set_opt (sbi->s_mount_opt, EXTDEBUG);
+ 			break;
+@@ -2208,6 +2214,15 @@ static int ext3_fill_super (struct super
+ 		goto failed_mount;
+ 	}
+ 
++#ifdef __BIG_ENDIAN
++	if (bigendian_extents == 0) {
++		printk(KERN_ERR "EXT3-fs: extents feature is not guaranteed to "
++		       "work on big-endian systems. Use \"bigendian_extents\" "
++		       "mount option to override.\n");
++		goto failed_mount;
++	}
++#endif
++
+ 	bgl_lock_init(&sbi->s_blockgroup_lock);
+ 
+ 	sbi->s_last_alloc_group = -1;
diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series
index 6554da59e2..5cfd377000 100644
--- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series
+++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel4.series
@@ -28,3 +28,4 @@ ext3-xattr-no-update-ctime-rhel4.patch
 ext3-check-bad-inode.patch
 ext3-fiemap-2.6-rhel4.patch
 ext3-get-raid-stripe-from-sb.patch
+ext3-big-endian-check-2.6-rhel4.patch
diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5.series
index 534a7e8beb..bd414b6c7c 100644
--- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5.series
+++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-rhel5.series
@@ -25,3 +25,4 @@ ext3-block-bitmap-validation-2.6-rhel5.patch
 ext3-xattr-no-update-ctime-2.6.22-vanilla.patch
 ext3-journal-chksum-2.6.18-vanilla.patch
 ext3-get-raid-stripe-from-sb.patch
+ext3-big-endian-check-2.6-rhel5.patch
diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles10.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles10.series
index 96d3c32fe0..c6934bbd86 100644
--- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles10.series
+++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-sles10.series
@@ -30,3 +30,4 @@ ext3-xattr-no-update-ctime-2.6-sles10.patch
 ext3-check-bad-inode.patch
 ext3-journal-chksum-2.6.18-vanilla.patch
 ext3-get-raid-stripe-from-sb.patch
+ext3-big-endian-check-2.6-sles10.patch
diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series
index 86d27c4339..5e7c0f2691 100644
--- a/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series
+++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6-suse.series
@@ -27,3 +27,4 @@ ext3-print-inum-in-htree-warning.patch
 ext3-xattr-no-update-ctime-suse.patch
 ext3-check-bad-inode.patch
 ext3-get-raid-stripe-from-sb-2.6-suse.patch
+ext3-big-endian-check-2.6-suse.patch
diff --git a/ldiskfs/kernel_patches/series/ldiskfs-2.6.22-vanilla.series b/ldiskfs/kernel_patches/series/ldiskfs-2.6.22-vanilla.series
index a95833e594..05ea5a418a 100644
--- a/ldiskfs/kernel_patches/series/ldiskfs-2.6.22-vanilla.series
+++ b/ldiskfs/kernel_patches/series/ldiskfs-2.6.22-vanilla.series
@@ -25,3 +25,4 @@ ext3-print-inum-in-htree-warning.patch
 ext3-xattr-no-update-ctime-2.6.22-vanilla.patch
 ext3-check-bad-inode.patch
 ext3-get-raid-stripe-from-sb.patch
+ext3-big-endian-check-2.6.22-vanilla.patch
-- 
GitLab