jffs2: reduce stack usage in jffs2_build_xattr_subsystem()
[linux-2.6-microblaze.git] / fs / jffs2 / xattr.c
index aa4048a..3b6bdc9 100644 (file)
@@ -772,10 +772,10 @@ void jffs2_clear_xattr_subsystem(struct jffs2_sb_info *c)
 }
 
 #define XREF_TMPHASH_SIZE      (128)
-void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
+int jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
 {
        struct jffs2_xattr_ref *ref, *_ref;
-       struct jffs2_xattr_ref *xref_tmphash[XREF_TMPHASH_SIZE];
+       struct jffs2_xattr_ref **xref_tmphash;
        struct jffs2_xattr_datum *xd, *_xd;
        struct jffs2_inode_cache *ic;
        struct jffs2_raw_node_ref *raw;
@@ -784,9 +784,12 @@ void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
 
        BUG_ON(!(c->flags & JFFS2_SB_FLAG_BUILDING));
 
+       xref_tmphash = kcalloc(XREF_TMPHASH_SIZE,
+                              sizeof(struct jffs2_xattr_ref *), GFP_KERNEL);
+       if (!xref_tmphash)
+               return -ENOMEM;
+
        /* Phase.1 : Merge same xref */
-       for (i=0; i < XREF_TMPHASH_SIZE; i++)
-               xref_tmphash[i] = NULL;
        for (ref=c->xref_temp; ref; ref=_ref) {
                struct jffs2_xattr_ref *tmp;
 
@@ -884,6 +887,8 @@ void jffs2_build_xattr_subsystem(struct jffs2_sb_info *c)
                     "%u of xref (%u dead, %u orphan) found.\n",
                     xdatum_count, xdatum_unchecked_count, xdatum_orphan_count,
                     xref_count, xref_dead_count, xref_orphan_count);
+       kfree(xref_tmphash);
+       return 0;
 }
 
 struct jffs2_xattr_datum *jffs2_setup_xattr_datum(struct jffs2_sb_info *c,