From: Ivan Orlov <ivan.orlov0322@xxxxxxxxx> Now that the driver core allows for struct class to be in read-only memory, remove the class field of the usb_class structure and create the usbmisc_class static class structure declared at build time which places it into read-only memory, instead of having it to be dynamically allocated at load time. Suggested-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> Signed-off-by: Ivan Orlov <ivan.orlov0322@xxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/usb/core/file.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c index c4ed3310e069..0e16a9c048dd 100644 --- a/drivers/usb/core/file.c +++ b/drivers/usb/core/file.c @@ -59,7 +59,6 @@ static const struct file_operations usb_fops = { static struct usb_class { struct kref kref; - struct class *class; } *usb_class; static char *usb_devnode(const struct device *dev, umode_t *mode) @@ -72,6 +71,11 @@ static char *usb_devnode(const struct device *dev, umode_t *mode) return drv->devnode(dev, mode); } +static struct class usbmisc_class = { + .name = "usbmisc", + .devnode = usb_devnode, +}; + static int init_usb_class(void) { int result = 0; @@ -88,15 +92,12 @@ static int init_usb_class(void) } kref_init(&usb_class->kref); - usb_class->class = class_create("usbmisc"); - if (IS_ERR(usb_class->class)) { - result = PTR_ERR(usb_class->class); - printk(KERN_ERR "class_create failed for usb devices\n"); + result = class_register(&usbmisc_class); + if (result) { kfree(usb_class); usb_class = NULL; goto exit; } - usb_class->class->devnode = usb_devnode; exit: return result; @@ -105,7 +106,7 @@ static int init_usb_class(void) static void release_usb_class(struct kref *kref) { /* Ok, we cheat as we know we only have one usb_class */ - class_destroy(usb_class->class); + class_unregister(&usbmisc_class); kfree(usb_class); usb_class = NULL; } @@ -200,7 +201,7 @@ int usb_register_dev(struct usb_interface *intf, /* create a usb class device for this usb interface */ snprintf(name, sizeof(name), class_driver->name, minor - minor_base); - intf->usb_dev = device_create(usb_class->class, &intf->dev, + intf->usb_dev = device_create(&usbmisc_class, &intf->dev, MKDEV(USB_MAJOR, minor), class_driver, "%s", kbasename(name)); if (IS_ERR(intf->usb_dev)) { @@ -234,7 +235,7 @@ void usb_deregister_dev(struct usb_interface *intf, return; dev_dbg(&intf->dev, "removing %d minor\n", intf->minor); - device_destroy(usb_class->class, MKDEV(USB_MAJOR, intf->minor)); + device_destroy(&usbmisc_class, MKDEV(USB_MAJOR, intf->minor)); down_write(&minor_rwsem); usb_minors[intf->minor] = NULL; -- 2.41.0