+++ /dev/null
-From: Tao Ma <tao.ma@oracle.com>
-Date: Thu, 12 Mar 2009 08:37:34 +0800
-Subject: [PATCH] ocfs2: Use xs->bucket to set xattr value outside
-Patch-mainline: 2.6.29
-
-A long time ago, xs->base is allocated a 4K size and all the contents
-in the bucket are copied to the it. Now we use ocfs2_xattr_bucket to
-abstract xattr bucket and xs->base is initialized to the start of the
-bu_bhs[0]. So xs->base + offset will overflow when the value root is
-stored outside the first block.
-
-Then why we can survive the xattr test by now? It is because we always
-read the bucket contiguously now and kernel mm allocate continguous
-memory for us. We are lucky, but we should fix it. So just get the
-right value root as other callers do.
-
-Signed-off-by: Tao Ma <tao.ma@oracle.com>
-Acked-by: Joel Becker <joel.becker@oracle.com>
-Signed-off-by: Mark Fasheh <mfasheh@suse.com>
----
- fs/ocfs2/xattr.c | 26 ++++++++++++++++++++------
- 1 files changed, 20 insertions(+), 6 deletions(-)
-
-Index: linux-2.6.27-sle11_ocfs2_update2/fs/ocfs2/xattr.c
-===================================================================
---- linux-2.6.27-sle11_ocfs2_update2.orig/fs/ocfs2/xattr.c
-+++ linux-2.6.27-sle11_ocfs2_update2/fs/ocfs2/xattr.c
-@@ -4649,19 +4649,33 @@ static int ocfs2_xattr_bucket_set_value_
- char *val,
- int value_len)
- {
-- int offset;
-+ int ret, offset, block_off;
- struct ocfs2_xattr_value_root *xv;
- struct ocfs2_xattr_entry *xe = xs->here;
-+ struct ocfs2_xattr_header *xh = bucket_xh(xs->bucket);
-+ void *base;
-
- BUG_ON(!xs->base || !xe || ocfs2_xattr_is_local(xe));
-
-- offset = le16_to_cpu(xe->xe_name_offset) +
-- OCFS2_XATTR_SIZE(xe->xe_name_len);
-+ ret = ocfs2_xattr_bucket_get_name_value(inode, xh,
-+ xe - xh->xh_entries,
-+ &block_off,
-+ &offset);
-+ if (ret) {
-+ mlog_errno(ret);
-+ goto out;
-+ }
-
-- xv = (struct ocfs2_xattr_value_root *)(xs->base + offset);
-+ base = bucket_block(xs->bucket, block_off);
-+ xv = (struct ocfs2_xattr_value_root *)(base + offset +
-+ OCFS2_XATTR_SIZE(xe->xe_name_len));
-
-- return __ocfs2_xattr_set_value_outside(inode, handle,
-- xv, val, value_len);
-+ ret = __ocfs2_xattr_set_value_outside(inode, handle,
-+ xv, val, value_len);
-+ if (ret)
-+ mlog_errno(ret);
-+out:
-+ return ret;
- }
-
- static int ocfs2_rm_xattr_cluster(struct inode *inode,