powerpc/pseries/dlpar: Use kasprintf
authorJulia Lawall <julia@diku.dk>
Wed, 10 Mar 2010 11:15:01 +0000 (11:15 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 7 Apr 2010 08:00:42 +0000 (18:00 +1000)
kasprintf combines kmalloc and sprintf, and takes care of the size
calculation itself.

The semantic patch that makes this change is as follows:
(http://coccinelle.lip6.fr/)

// <smpl>
@@
expression a,flag;
expression list args;
statement S;
@@

  a =
-  \(kmalloc\|kzalloc\)(...,flag)
+  kasprintf(flag,args)
  <... when != a
  if (a == NULL || ...) S
  ...>
- sprintf(a,args);
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>
Acked-by: Nathan Fontenot <nfont@austin.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/platforms/pseries/dlpar.c

index 1540a41d1a8534ef33719c46ae71dba5ce095d43..d71e5858408645889d0f6b13772f5daa9bb009d2 100644 (file)
@@ -79,13 +79,12 @@ static struct device_node *dlpar_parse_cc_node(struct cc_workarea *ccwa)
         * prepend this to the full_name.
         */
        name = (char *)ccwa + ccwa->name_offset;
-       dn->full_name = kmalloc(strlen(name) + 2, GFP_KERNEL);
+       dn->full_name = kasprintf(GFP_KERNEL, "/%s", name);
        if (!dn->full_name) {
                kfree(dn);
                return NULL;
        }
 
-       sprintf(dn->full_name, "/%s", name);
        return dn;
 }
 
@@ -410,15 +409,13 @@ static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
         * directory of the device tree.  CPUs actually live in the
         * cpus directory so we need to fixup the full_name.
         */
-       cpu_name = kzalloc(strlen(dn->full_name) + strlen("/cpus") + 1,
-                          GFP_KERNEL);
+       cpu_name = kasprintf(GFP_KERNEL, "/cpus%s", dn->full_name);
        if (!cpu_name) {
                dlpar_free_cc_nodes(dn);
                rc = -ENOMEM;
                goto out;
        }
 
-       sprintf(cpu_name, "/cpus%s", dn->full_name);
        kfree(dn->full_name);
        dn->full_name = cpu_name;