--- /dev/null
+From: Tiger Yang <tiger.yang@oracle.com>
+Subject: [PATCH 16/16] ocfs2: Add incompatible flag for extended attribute
+Patch-mainline: 2.6.28?
+References: FATE302067
+
+This patch adds the s_incompat flag for extended attribute support. This
+helps us ensure that older versions of Ocfs2 or ocfs2-tools will not be able
+to mount a volume with xattr support.
+
+Signed-off-by: Tiger Yang <tiger.yang@oracle.com>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+---
+ fs/ocfs2/ocfs2.h | 7 +++++++
+ fs/ocfs2/ocfs2_fs.h | 19 +++++++++++++------
+ fs/ocfs2/super.c | 3 ++-
+ fs/ocfs2/xattr.c | 12 ++++++++++++
+ 4 files changed, 34 insertions(+), 7 deletions(-)
+
+diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
+index 35ed7eb..487487a 100644
+--- a/fs/ocfs2/ocfs2.h
++++ b/fs/ocfs2/ocfs2.h
+@@ -343,6 +343,13 @@ static inline int ocfs2_supports_inline_data(struct ocfs2_super *osb)
+ return 0;
+ }
+
++static inline int ocfs2_supports_xattr(struct ocfs2_super *osb)
++{
++ if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_XATTR)
++ return 1;
++ return 0;
++}
++
+ /* set / clear functions because cluster events can make these happen
+ * in parallel so we want the transitions to be atomic. this also
+ * means that any future flags osb_flags must be protected by spinlock
+diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h
+index 8d5e72f..f24ce3d 100644
+--- a/fs/ocfs2/ocfs2_fs.h
++++ b/fs/ocfs2/ocfs2_fs.h
+@@ -91,7 +91,8 @@
+ | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC \
+ | OCFS2_FEATURE_INCOMPAT_INLINE_DATA \
+ | OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP \
+- | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK)
++ | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \
++ | OCFS2_FEATURE_INCOMPAT_XATTR)
+ #define OCFS2_FEATURE_RO_COMPAT_SUPP OCFS2_FEATURE_RO_COMPAT_UNWRITTEN
+
+ /*
+@@ -128,10 +129,6 @@
+ /* Support for data packed into inode blocks */
+ #define OCFS2_FEATURE_INCOMPAT_INLINE_DATA 0x0040
+
+-/* Support for the extended slot map */
+-#define OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP 0x100
+-
+-
+ /*
+ * Support for alternate, userspace cluster stacks. If set, the superblock
+ * field s_cluster_info contains a tag for the alternate stack in use as
+@@ -143,6 +140,12 @@
+ */
+ #define OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK 0x0080
+
++/* Support for the extended slot map */
++#define OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP 0x100
++
++/* Support for extended attributes */
++#define OCFS2_FEATURE_INCOMPAT_XATTR 0x0200
++
+ /*
+ * backup superblock flag is used to indicate that this volume
+ * has backup superblocks.
+@@ -578,7 +581,11 @@ struct ocfs2_super_block {
+ /*A0*/ struct ocfs2_cluster_info s_cluster_info; /* Selected userspace
+ stack. Only valid
+ with INCOMPAT flag. */
+-/*B8*/ __le64 s_reserved2[17]; /* Fill out superblock */
++/*B8*/ __le16 s_xattr_inline_size; /* extended attribute inline size
++ for this fs*/
++ __le16 s_reserved0;
++ __le32 s_reserved1;
++/*C0*/ __le64 s_reserved2[16]; /* Fill out superblock */
+ /*140*/
+
+ /*
+diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
+index 03a25c4..2173169 100644
+--- a/fs/ocfs2/super.c
++++ b/fs/ocfs2/super.c
+@@ -1434,7 +1434,8 @@ static int ocfs2_initialize_super(struct super_block *sb,
+
+ osb->slot_num = OCFS2_INVALID_SLOT;
+
+- osb->s_xattr_inline_size = OCFS2_MIN_XATTR_INLINE_SIZE;
++ osb->s_xattr_inline_size = le16_to_cpu(
++ di->id2.i_super.s_xattr_inline_size);
+
+ osb->local_alloc_state = OCFS2_LA_UNUSED;
+ osb->local_alloc_bh = NULL;
+diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
+index e78ed7a..505fb40 100644
+--- a/fs/ocfs2/xattr.c
++++ b/fs/ocfs2/xattr.c
+@@ -580,6 +580,9 @@ ssize_t ocfs2_listxattr(struct dentry *dentry,
+ struct ocfs2_dinode *di = NULL;
+ struct ocfs2_inode_info *oi = OCFS2_I(dentry->d_inode);
+
++ if (!ocfs2_supports_xattr(OCFS2_SB(dentry->d_sb)))
++ return -EOPNOTSUPP;
++
+ if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
+ return ret;
+
+@@ -859,6 +862,9 @@ int ocfs2_xattr_get(struct inode *inode,
+ .not_found = -ENODATA,
+ };
+
++ if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb)))
++ return -EOPNOTSUPP;
++
+ if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
+ ret = -ENODATA;
+
+@@ -1557,6 +1563,9 @@ int ocfs2_xattr_remove(struct inode *inode, struct buffer_head *di_bh)
+ handle_t *handle;
+ int ret;
+
++ if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb)))
++ return 0;
++
+ if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
+ return 0;
+
+@@ -1993,6 +2002,9 @@ int ocfs2_xattr_set(struct inode *inode,
+ .not_found = -ENODATA,
+ };
+
++ if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb)))
++ return -EOPNOTSUPP;
++
+ ret = ocfs2_inode_lock(inode, &di_bh, 1);
+ if (ret < 0) {
+ mlog_errno(ret);
+--
+1.5.4.5
+