aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/core/netprio_cgroup.c56
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,
176static int write_priomap(struct cgroup *cgrp, struct cftype *cft, 176static 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 202out_unlock:
233out_put_dev:
234 rtnl_unlock(); 203 rtnl_unlock();
235 dev_put(dev); 204 dev_put(dev);
236
237out_free_devname:
238 kfree(devname);
239 return ret; 205 return ret;
240} 206}
241 207