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