From 601ccd855a4079a978b52650356cac16a44de255 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Thu, 2 May 2024 07:43:57 +0000 Subject: [PATCH] Revert "usb: roles: fix NULL pointer issue when put module's reference" This reverts commit 0158216805ca7e498d07de38840d2732166ae5fa which is commit 1c9be13846c0b2abc2480602f8ef421360e1ad9e upstream. It breaks the Android kernel abi and can be brought back in the future in an abi-safe way if it is really needed. Bug: 161946584 Change-Id: I092d81a7ad00ebe0d0c16509b5789ea0b7de29e4 Signed-off-by: Greg Kroah-Hartman --- drivers/usb/roles/class.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/usb/roles/class.c b/drivers/usb/roles/class.c index d90d16423809..32e6d19f7011 100644 --- a/drivers/usb/roles/class.c +++ b/drivers/usb/roles/class.c @@ -19,7 +19,6 @@ static struct class *role_class; struct usb_role_switch { struct device dev; struct mutex lock; /* device lock*/ - struct module *module; /* the module this device depends on */ enum usb_role role; /* From descriptor */ @@ -134,7 +133,7 @@ struct usb_role_switch *usb_role_switch_get(struct device *dev) usb_role_switch_match); if (!IS_ERR_OR_NULL(sw)) - WARN_ON(!try_module_get(sw->module)); + WARN_ON(!try_module_get(sw->dev.parent->driver->owner)); return sw; } @@ -156,7 +155,7 @@ struct usb_role_switch *fwnode_usb_role_switch_get(struct fwnode_handle *fwnode) sw = fwnode_connection_find_match(fwnode, "usb-role-switch", NULL, usb_role_switch_match); if (!IS_ERR_OR_NULL(sw)) - WARN_ON(!try_module_get(sw->module)); + WARN_ON(!try_module_get(sw->dev.parent->driver->owner)); return sw; } @@ -171,7 +170,7 @@ EXPORT_SYMBOL_GPL(fwnode_usb_role_switch_get); void usb_role_switch_put(struct usb_role_switch *sw) { if (!IS_ERR_OR_NULL(sw)) { - module_put(sw->module); + module_put(sw->dev.parent->driver->owner); put_device(&sw->dev); } } @@ -188,18 +187,15 @@ struct usb_role_switch * usb_role_switch_find_by_fwnode(const struct fwnode_handle *fwnode) { struct device *dev; - struct usb_role_switch *sw = NULL; if (!fwnode) return NULL; dev = class_find_device_by_fwnode(role_class, fwnode); - if (dev) { - sw = to_role_switch(dev); - WARN_ON(!try_module_get(sw->module)); - } + if (dev) + WARN_ON(!try_module_get(dev->parent->driver->owner)); - return sw; + return dev ? to_role_switch(dev) : NULL; } EXPORT_SYMBOL_GPL(usb_role_switch_find_by_fwnode); @@ -341,7 +337,6 @@ usb_role_switch_register(struct device *parent, sw->set = desc->set; sw->get = desc->get; - sw->module = parent->driver->owner; sw->dev.parent = parent; sw->dev.fwnode = desc->fwnode; sw->dev.class = role_class;