ocfs2: Reset xattr value size after xa_cleanup_value_truncate().
authorTao Ma <tao.ma@oracle.com>
Mon, 10 May 2010 10:09:47 +0000 (18:09 +0800)
committerJoel Becker <joel.becker@oracle.com>
Tue, 18 May 2010 23:41:21 +0000 (16:41 -0700)
In ocfs2_prepare_xattr_entry, if we fail to grow an existing value,
xa_cleanup_value_truncate() will leave the old entry in place.  Thus, we
reset its value size.  However, if we were allocating a new value, we
must not reset the value size or we will BUG().  This resolves
oss.oracle.com bug 1247.

Signed-off-by: Tao Ma <tao.ma@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
fs/ocfs2/xattr.c

index a1cf195..e87130f 100644 (file)
@@ -2135,15 +2135,18 @@ alloc_value:
                orig_clusters = ocfs2_xa_value_clusters(loc);
                rc = ocfs2_xa_value_truncate(loc, xi->xi_value_len, ctxt);
                if (rc < 0) {
-                       /*
-                        * If we tried to grow an existing external value,
-                        * ocfs2_xa_cleanuP-value_truncate() is going to
-                        * let it stand.  We have to restore its original
-                        * value size.
-                        */
-                       loc->xl_entry->xe_value_size = orig_value_size;
                        ocfs2_xa_cleanup_value_truncate(loc, "growing",
                                                        orig_clusters);
+                       /*
+                        * If we were growing an existing value,
+                        * ocfs2_xa_cleanup_value_truncate() won't remove
+                        * the entry. We need to restore the original value
+                        * size.
+                        */
+                       if (loc->xl_entry) {
+                               BUG_ON(!orig_value_size);
+                               loc->xl_entry->xe_value_size = orig_value_size;
+                       }
                        mlog_errno(rc);
                }
        }