Index: sys/sys/sysctl.h =========================================================================== --- sys/sys/sysctl.h 2007/11/30 20:40:10 #55 +++ sys/sys/sysctl.h 2007/11/30 20:40:10 @@ -647,6 +647,7 @@ int kind, void *arg1, int arg2, int (*handler) (SYSCTL_HANDLER_ARGS), const char *fmt, const char *descr); +void sysctl_rename_oid(struct sysctl_oid *oidp, const char *name); int sysctl_move_oid(struct sysctl_oid *oidp, struct sysctl_oid_list *parent); int sysctl_remove_oid(struct sysctl_oid *oidp, int del, int recurse); Index: sys/kern/kern_sysctl.c =========================================================================== --- sys/kern/kern_sysctl.c 2007/11/30 20:40:10 #68 +++ sys/kern/kern_sysctl.c 2007/11/30 20:40:10 @@ -415,6 +415,25 @@ } /* + * Rename an existing oid. + */ +void +sysctl_rename_oid(struct sysctl_oid *oidp, const char *name) +{ + ssize_t len; + char *newname; + void *oldname; + + oldname = (void *)(uintptr_t)(const void *)oidp->oid_name; + len = strlen(name); + newname = malloc(len + 1, M_SYSCTLOID, M_WAITOK); + bcopy(name, newname, len + 1); + newname[len] = '\0'; + oidp->oid_name = newname; + free(oldname, M_SYSCTLOID); +} + +/* * Reparent an existing oid. */ int Index: sys/kern/subr_bus.c =========================================================================== --- sys/kern/subr_bus.c 2007/11/30 20:40:10 #109 +++ sys/kern/subr_bus.c 2007/11/30 20:40:10 @@ -307,6 +307,16 @@ } static void +device_sysctl_update(device_t dev) +{ + devclass_t dc = dev->devclass; + + if (dev->sysctl_tree == NULL) + return; + sysctl_rename_oid(dev->sysctl_tree, dev->nameunit + strlen(dc->name)); +} + +static void device_sysctl_fini(device_t dev) { if (dev->sysctl_tree == NULL) @@ -2387,6 +2397,7 @@ dev->state = DS_NOTPRESENT; return (error); } + device_sysctl_update(dev); dev->state = DS_ATTACHED; devadded(dev); return (0);