ocfs2/xattr: Restore not_found in xis
authorTao Ma <tao.ma@oracle.com>
Wed, 19 Nov 2008 08:48:42 +0000 (16:48 +0800)
committerMark Fasheh <mfasheh@suse.com>
Mon, 5 Jan 2009 16:36:55 +0000 (08:36 -0800)
During an xattr set, when we move a xattr which was stored in inode to the
outside bucket, we have to delete it and it will use the old value of
xis->not_found. xis->not_found is removed by ocfs2_calc_xattr_set_need
though, so we must restore it.

Signed-off-by: Tao Ma <tao.ma@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
fs/ocfs2/xattr.c

index d0b94edb9662684529141afa2bf8455f590a56bd..9cb71e1c7c60fcd8fb6a4a4bd6e7b4aba2ebb93f 100644 (file)
@@ -2414,7 +2414,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
                                    struct ocfs2_xattr_search *xbs,
                                    struct ocfs2_xattr_set_ctxt *ctxt)
 {
-       int ret = 0, credits;
+       int ret = 0, credits, old_found;
 
        if (!xi->value) {
                /* Remove existing extended attribute */
@@ -2433,6 +2433,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
                        xi->value = NULL;
                        xi->value_len = 0;
 
+                       old_found = xis->not_found;
                        xis->not_found = -ENODATA;
                        ret = ocfs2_calc_xattr_set_need(inode,
                                                        di,
@@ -2442,6 +2443,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
                                                        NULL,
                                                        NULL,
                                                        &credits);
+                       xis->not_found = old_found;
                        if (ret) {
                                mlog_errno(ret);
                                goto out;
@@ -2462,6 +2464,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
                                if (ret)
                                        goto out;
 
+                               old_found = xis->not_found;
                                xis->not_found = -ENODATA;
                                ret = ocfs2_calc_xattr_set_need(inode,
                                                                di,
@@ -2471,6 +2474,7 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
                                                                NULL,
                                                                NULL,
                                                                &credits);
+                               xis->not_found = old_found;
                                if (ret) {
                                        mlog_errno(ret);
                                        goto out;