Unionfs ODF: use krealloc() in create_parents()
authorErez Zadok <ezk@cs.sunysb.edu>
Fri, 7 Dec 2007 00:45:04 +0000 (19:45 -0500)
committerRachita Kothiyal <rachita@dewey.fsl.cs.sunysb.edu>
Thu, 1 May 2008 23:03:25 +0000 (19:03 -0400)
Prevents compile error with CONFIG_SLUB:

$ make
fs/unionfs/copyup.c: In function 'create_parents':
fs/unionfs/copyup.c:694: error: 'malloc_sizes' undeclared (first use in this
function)
fs/unionfs/copyup.c:694: error: (Each undeclared identifier is reported only
once

CC: Jesse I Pollard <pollard@ccs.nrl.navy.mil>
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/copyup.c

index 2ea88d9d79260639b8cd1fd9791a95698da5d74b..4b4dda4cfb647a7abdfe87dfe08be36dc864a023 100644 (file)
@@ -678,22 +678,15 @@ struct dentry *create_parents(struct inode *dir, struct dentry *dentry,
        struct dentry *lower_dentry = NULL;
        const char *childname;
        unsigned int childnamelen;
-       int old_kmalloc_size;
-       int kmalloc_size;
-       int num_dentry;
+       int nr_dentry;
        int count = 0;
        int old_bstart;
        int old_bend;
        struct dentry **path = NULL;
-       struct dentry **tmp_path;
        struct super_block *sb;
 
        verify_locked(dentry);
 
-       /* There is no sense allocating any less than the minimum. */
-       kmalloc_size = malloc_sizes[0].cs_size;
-       num_dentry = kmalloc_size / sizeof(struct dentry *);
-
        err = is_robranch_super(dir->i_sb, bindex);
        if (err) {
                lower_dentry = ERR_PTR(err);
@@ -704,7 +697,10 @@ struct dentry *create_parents(struct inode *dir, struct dentry *dentry,
        old_bend = dbend(dentry);
 
        lower_dentry = ERR_PTR(-ENOMEM);
-       path = kzalloc(kmalloc_size, GFP_KERNEL);
+
+       /* There is no sense allocating any less than the minimum. */
+       nr_dentry = 1;
+       path = kmalloc(nr_dentry * sizeof(struct dentry *), GFP_KERNEL);
        if (unlikely(!path))
                goto out;
 
@@ -731,26 +727,22 @@ struct dentry *create_parents(struct inode *dir, struct dentry *dentry,
                lower_parent_dentry =
                        unionfs_lower_dentry_idx(parent_dentry, bindex);
 
-               /* store the child dentry */
-               path[count++] = child_dentry;
-
                /* grow path table */
-               if (count == num_dentry) {
-                       old_kmalloc_size = kmalloc_size;
-                       kmalloc_size *= 2;
-                       num_dentry = kmalloc_size / sizeof(struct dentry *);
+               if (count == nr_dentry) {
+                       void *p;
 
-                       tmp_path = kzalloc(kmalloc_size, GFP_KERNEL);
-                       if (unlikely(!tmp_path)) {
+                       nr_dentry *= 2;
+                       p = krealloc(path, nr_dentry * sizeof(struct dentry *),
+                                    GFP_KERNEL);
+                       if (unlikely(!p)) {
                                lower_dentry = ERR_PTR(-ENOMEM);
                                goto out;
                        }
-                       memcpy(tmp_path, path, old_kmalloc_size);
-                       kfree(path);
-                       path = tmp_path;
-                       tmp_path = NULL;
+                       path = p;
                }
 
+               /* store the child dentry */
+               path[count++] = child_dentry;
        } while (!lower_parent_dentry);
        count--;