diff options
-rw-r--r-- | net/core/netprio_cgroup.c | 56 |
1 files changed, 11 insertions, 45 deletions
diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c index f0b6b0d572c1..66d98daf8aef 100644 --- a/net/core/netprio_cgroup.c +++ b/net/core/netprio_cgroup.c | |||
@@ -176,66 +176,32 @@ static int read_priomap(struct cgroup *cont, struct cftype *cft, | |||
176 | static int write_priomap(struct cgroup *cgrp, struct cftype *cft, | 176 | static int write_priomap(struct cgroup *cgrp, struct cftype *cft, |
177 | const char *buffer) | 177 | const char *buffer) |
178 | { | 178 | { |
179 | char *devname = kstrdup(buffer, GFP_KERNEL); | ||
180 | int ret = -EINVAL; | ||
181 | u32 prioidx = cgrp_netprio_state(cgrp)->prioidx; | 179 | u32 prioidx = cgrp_netprio_state(cgrp)->prioidx; |
182 | unsigned long priority; | 180 | char devname[IFNAMSIZ + 1]; |
183 | char *priostr; | ||
184 | struct net_device *dev; | 181 | struct net_device *dev; |
185 | struct netprio_map *map; | 182 | struct netprio_map *map; |
183 | u32 prio; | ||
184 | int ret; | ||
186 | 185 | ||
187 | if (!devname) | 186 | if (sscanf(buffer, "%"__stringify(IFNAMSIZ)"s %u", devname, &prio) != 2) |
188 | return -ENOMEM; | 187 | return -EINVAL; |
189 | |||
190 | /* | ||
191 | * Minimally sized valid priomap string | ||
192 | */ | ||
193 | if (strlen(devname) < 3) | ||
194 | goto out_free_devname; | ||
195 | |||
196 | priostr = strstr(devname, " "); | ||
197 | if (!priostr) | ||
198 | goto out_free_devname; | ||
199 | |||
200 | /* | ||
201 | *Separate the devname from the associated priority | ||
202 | *and advance the priostr pointer to the priority value | ||
203 | */ | ||
204 | *priostr = '\0'; | ||
205 | priostr++; | ||
206 | |||
207 | /* | ||
208 | * If the priostr points to NULL, we're at the end of the passed | ||
209 | * in string, and its not a valid write | ||
210 | */ | ||
211 | if (*priostr == '\0') | ||
212 | goto out_free_devname; | ||
213 | |||
214 | ret = kstrtoul(priostr, 10, &priority); | ||
215 | if (ret < 0) | ||
216 | goto out_free_devname; | ||
217 | |||
218 | ret = -ENODEV; | ||
219 | 188 | ||
220 | dev = dev_get_by_name(&init_net, devname); | 189 | dev = dev_get_by_name(&init_net, devname); |
221 | if (!dev) | 190 | if (!dev) |
222 | goto out_free_devname; | 191 | return -ENODEV; |
223 | 192 | ||
224 | rtnl_lock(); | 193 | rtnl_lock(); |
194 | |||
225 | ret = write_update_netdev_table(dev); | 195 | ret = write_update_netdev_table(dev); |
226 | if (ret < 0) | 196 | if (ret) |
227 | goto out_put_dev; | 197 | goto out_unlock; |
228 | 198 | ||
229 | map = rtnl_dereference(dev->priomap); | 199 | map = rtnl_dereference(dev->priomap); |
230 | if (map) | 200 | if (map) |
231 | map->priomap[prioidx] = priority; | 201 | map->priomap[prioidx] = prio; |
232 | 202 | out_unlock: | |
233 | out_put_dev: | ||
234 | rtnl_unlock(); | 203 | rtnl_unlock(); |
235 | dev_put(dev); | 204 | dev_put(dev); |
236 | |||
237 | out_free_devname: | ||
238 | kfree(devname); | ||
239 | return ret; | 205 | return ret; |
240 | } | 206 | } |
241 | 207 | ||