netprio_cgroup: simplify write_priomap()
authorTejun Heo <tj@kernel.org>
Thu, 22 Nov 2012 15:32:46 +0000 (07:32 -0800)
committerTejun Heo <tj@kernel.org>
Thu, 22 Nov 2012 15:32:46 +0000 (07:32 -0800)
sscanf() doesn't bite.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Tested-and-Acked-by: Daniel Wagner <daniel.wagner@bmw-carit.de>
Acked-by: David S. Miller <davem@davemloft.net>
net/core/netprio_cgroup.c

index f0b6b0d572c1238aa1b669590b280bd66ff23d43..66d98daf8aef8de774bae9493b64a42eb2615c2f 100644 (file)
@@ -176,66 +176,32 @@ static int read_priomap(struct cgroup *cont, struct cftype *cft,
 static int write_priomap(struct cgroup *cgrp, struct cftype *cft,
                         const char *buffer)
 {
-       char *devname = kstrdup(buffer, GFP_KERNEL);
-       int ret = -EINVAL;
        u32 prioidx = cgrp_netprio_state(cgrp)->prioidx;
-       unsigned long priority;
-       char *priostr;
+       char devname[IFNAMSIZ + 1];
        struct net_device *dev;
        struct netprio_map *map;
+       u32 prio;
+       int ret;
 
-       if (!devname)
-               return -ENOMEM;
-
-       /*
-        * Minimally sized valid priomap string
-        */
-       if (strlen(devname) < 3)
-               goto out_free_devname;
-
-       priostr = strstr(devname, " ");
-       if (!priostr)
-               goto out_free_devname;
-
-       /*
-        *Separate the devname from the associated priority
-        *and advance the priostr pointer to the priority value
-        */
-       *priostr = '\0';
-       priostr++;
-
-       /*
-        * If the priostr points to NULL, we're at the end of the passed
-        * in string, and its not a valid write
-        */
-       if (*priostr == '\0')
-               goto out_free_devname;
-
-       ret = kstrtoul(priostr, 10, &priority);
-       if (ret < 0)
-               goto out_free_devname;
-
-       ret = -ENODEV;
+       if (sscanf(buffer, "%"__stringify(IFNAMSIZ)"s %u", devname, &prio) != 2)
+               return -EINVAL;
 
        dev = dev_get_by_name(&init_net, devname);
        if (!dev)
-               goto out_free_devname;
+               return -ENODEV;
 
        rtnl_lock();
+
        ret = write_update_netdev_table(dev);
-       if (ret < 0)
-               goto out_put_dev;
+       if (ret)
+               goto out_unlock;
 
        map = rtnl_dereference(dev->priomap);
        if (map)
-               map->priomap[prioidx] = priority;
-
-out_put_dev:
+               map->priomap[prioidx] = prio;
+out_unlock:
        rtnl_unlock();
        dev_put(dev);
-
-out_free_devname:
-       kfree(devname);
        return ret;
 }