|
@@ -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;
|
|
|
}
|
|
|
|