]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-incompatible-flag-for-exten.patch
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.suse / ocfs2-Add-incompatible-flag-for-exten.patch
diff --git a/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-incompatible-flag-for-exten.patch b/src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-incompatible-flag-for-exten.patch
new file mode 100644 (file)
index 0000000..9099278
--- /dev/null
@@ -0,0 +1,148 @@
+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
+