netprio_cgroup: simplify write_priomap()
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>
This commit is contained in:
parent
0ba18f7a5e
commit
6d5759dd02
1 changed files with 11 additions and 45 deletions
|
@ -176,66 +176,32 @@ static int read_priomap(struct cgroup *cont, struct cftype *cft,
|
||||||
static int write_priomap(struct cgroup *cgrp, struct cftype *cft,
|
static int write_priomap(struct cgroup *cgrp, struct cftype *cft,
|
||||||
const char *buffer)
|
const char *buffer)
|
||||||
{
|
{
|
||||||
char *devname = kstrdup(buffer, GFP_KERNEL);
|
|
||||||
int ret = -EINVAL;
|
|
||||||
u32 prioidx = cgrp_netprio_state(cgrp)->prioidx;
|
u32 prioidx = cgrp_netprio_state(cgrp)->prioidx;
|
||||||
unsigned long priority;
|
char devname[IFNAMSIZ + 1];
|
||||||
char *priostr;
|
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
struct netprio_map *map;
|
struct netprio_map *map;
|
||||||
|
u32 prio;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (!devname)
|
if (sscanf(buffer, "%"__stringify(IFNAMSIZ)"s %u", devname, &prio) != 2)
|
||||||
return -ENOMEM;
|
return -EINVAL;
|
||||||
|
|
||||||
/*
|
|
||||||
* 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;
|
|
||||||
|
|
||||||
dev = dev_get_by_name(&init_net, devname);
|
dev = dev_get_by_name(&init_net, devname);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
goto out_free_devname;
|
return -ENODEV;
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
|
|
||||||
ret = write_update_netdev_table(dev);
|
ret = write_update_netdev_table(dev);
|
||||||
if (ret < 0)
|
if (ret)
|
||||||
goto out_put_dev;
|
goto out_unlock;
|
||||||
|
|
||||||
map = rtnl_dereference(dev->priomap);
|
map = rtnl_dereference(dev->priomap);
|
||||||
if (map)
|
if (map)
|
||||||
map->priomap[prioidx] = priority;
|
map->priomap[prioidx] = prio;
|
||||||
|
out_unlock:
|
||||||
out_put_dev:
|
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
dev_put(dev);
|
dev_put(dev);
|
||||||
|
|
||||||
out_free_devname:
|
|
||||||
kfree(devname);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue