aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/kobject.c30
-rw-r--r--net/core/net-sysfs.c11
2 files changed, 41 insertions, 0 deletions
diff --git a/lib/kobject.c b/lib/kobject.c
index bbbfab4145e6..db1d23707eb1 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -311,13 +311,43 @@ EXPORT_SYMBOL(kobject_set_name);
311int kobject_rename(struct kobject * kobj, const char *new_name) 311int kobject_rename(struct kobject * kobj, const char *new_name)
312{ 312{
313 int error = 0; 313 int error = 0;
314 const char *devpath = NULL;
315 char *devpath_string = NULL;
316 char *envp[2];
314 317
315 kobj = kobject_get(kobj); 318 kobj = kobject_get(kobj);
316 if (!kobj) 319 if (!kobj)
317 return -EINVAL; 320 return -EINVAL;
318 if (!kobj->parent) 321 if (!kobj->parent)
319 return -EINVAL; 322 return -EINVAL;
323
324 devpath = kobject_get_path(kobj, GFP_KERNEL);
325 if (!devpath) {
326 error = -ENOMEM;
327 goto out;
328 }
329 devpath_string = kmalloc(strlen(devpath) + 15, GFP_KERNEL);
330 if (!devpath_string) {
331 error = -ENOMEM;
332 goto out;
333 }
334 sprintf(devpath_string, "DEVPATH_OLD=%s", devpath);
335 envp[0] = devpath_string;
336 envp[1] = NULL;
337 /* Note : if we want to send the new name alone, not the full path,
338 * we could probably use kobject_name(kobj); */
339
320 error = sysfs_rename_dir(kobj, kobj->parent->dentry, new_name); 340 error = sysfs_rename_dir(kobj, kobj->parent->dentry, new_name);
341
342 /* This function is mostly/only used for network interface.
343 * Some hotplug package track interfaces by their name and
344 * therefore want to know when the name is changed by the user. */
345 if (!error)
346 kobject_uevent_env(kobj, KOBJ_MOVE, envp);
347
348out:
349 kfree(devpath_string);
350 kfree(devpath);
321 kobject_put(kobj); 351 kobject_put(kobj);
322 352
323 return error; 353 return error;
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 221a64ab64f7..e441ec7988c1 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -424,6 +424,17 @@ static int netdev_uevent(struct device *d, char **envp,
424 if ((size <= 0) || (i >= num_envp)) 424 if ((size <= 0) || (i >= num_envp))
425 return -ENOMEM; 425 return -ENOMEM;
426 426
427 /* pass ifindex to uevent.
428 * ifindex is useful as it won't change (interface name may change)
429 * and is what RtNetlink uses natively. */
430 envp[i++] = buf;
431 n = snprintf(buf, size, "IFINDEX=%d", dev->ifindex) + 1;
432 buf += n;
433 size -= n;
434
435 if ((size <= 0) || (i >= num_envp))
436 return -ENOMEM;
437
427 envp[i] = NULL; 438 envp[i] = NULL;
428 return 0; 439 return 0;
429} 440}