* [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind
@ 2018-04-30 22:17 Shuah Khan (Samsung OSG)
2018-04-30 22:17 ` [REBASED PATCH 2/2] usbip: usbip_host: run rebind from exit when module is removed Shuah Khan (Samsung OSG)
2018-04-30 22:48 ` [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind Greg KH
0 siblings, 2 replies; 4+ messages in thread
From: Shuah Khan (Samsung OSG) @ 2018-04-30 22:17 UTC (permalink / raw)
To: valentina.manea.m, shuah, gregkh; +Cc: linux-usb, linux-kernel
Device is left in the busid_table after unbind and rebind. Rebind
initiates usb bus scan and the original driver claims the device.
After rescan the device should be deleted from the busid_table as
it no longer belongs to usbip_host.
Fix it to delete the device after device_attach() succeeds.
Signed-off-by: Shuah Khan (Samsung OSG) <shuah@kernel.org>
---
drivers/usb/usbip/stub_main.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/usb/usbip/stub_main.c b/drivers/usb/usbip/stub_main.c
index d41d0cdeec0f..fb46bd62d538 100644
--- a/drivers/usb/usbip/stub_main.c
+++ b/drivers/usb/usbip/stub_main.c
@@ -186,6 +186,9 @@ static ssize_t rebind_store(struct device_driver *dev, const char *buf,
if (!bid)
return -ENODEV;
+ /* mark the device for deletion so probe ignores it during rescan */
+ bid->status = STUB_BUSID_OTHER;
+
/* device_attach() callers should hold parent lock for USB */
if (bid->udev->dev.parent)
device_lock(bid->udev->dev.parent);
@@ -197,6 +200,9 @@ static ssize_t rebind_store(struct device_driver *dev, const char *buf,
return ret;
}
+ /* delete device from busid_table */
+ del_match_busid((char *) buf);
+
return count;
}
--
2.14.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [REBASED PATCH 2/2] usbip: usbip_host: run rebind from exit when module is removed
2018-04-30 22:17 [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind Shuah Khan (Samsung OSG)
@ 2018-04-30 22:17 ` Shuah Khan (Samsung OSG)
2018-04-30 22:48 ` [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind Greg KH
1 sibling, 0 replies; 4+ messages in thread
From: Shuah Khan (Samsung OSG) @ 2018-04-30 22:17 UTC (permalink / raw)
To: valentina.manea.m, shuah, gregkh; +Cc: linux-usb, linux-kernel
After removing usbip_host module, devices it releases are left without
a driver. For example, when a keyboard or a mass storage device are
bound to usbip_host when it is removed, these devices are no longer
bound to any driver.
Fix it to run device_attach() from the module exit routine to restore
the devices to their original drivers. This includes cleanup changes
and moving device_attach() code to a common routine to be called from
rebind_store() and usbip_host_exit().
Signed-off-by: Shuah Khan (Samsung OSG) <shuah@kernel.org>
---
drivers/usb/usbip/stub_dev.c | 6 +----
drivers/usb/usbip/stub_main.c | 60 ++++++++++++++++++++++++++++++++++++-------
2 files changed, 52 insertions(+), 14 deletions(-)
diff --git a/drivers/usb/usbip/stub_dev.c b/drivers/usb/usbip/stub_dev.c
index 7813c1862941..9d0425113c4b 100644
--- a/drivers/usb/usbip/stub_dev.c
+++ b/drivers/usb/usbip/stub_dev.c
@@ -448,12 +448,8 @@ static void stub_disconnect(struct usb_device *udev)
busid_priv->sdev = NULL;
stub_device_free(sdev);
- if (busid_priv->status == STUB_BUSID_ALLOC) {
+ if (busid_priv->status == STUB_BUSID_ALLOC)
busid_priv->status = STUB_BUSID_ADDED;
- } else {
- busid_priv->status = STUB_BUSID_OTHER;
- del_match_busid((char *)udev_busid);
- }
}
#ifdef CONFIG_PM
diff --git a/drivers/usb/usbip/stub_main.c b/drivers/usb/usbip/stub_main.c
index fb46bd62d538..587b9bc10042 100644
--- a/drivers/usb/usbip/stub_main.c
+++ b/drivers/usb/usbip/stub_main.c
@@ -14,6 +14,7 @@
#define DRIVER_DESC "USB/IP Host Driver"
struct kmem_cache *stub_priv_cache;
+
/*
* busid_tables defines matching busids that usbip can grab. A user can change
* dynamically what device is locally used and what device is exported to a
@@ -169,6 +170,51 @@ static ssize_t match_busid_store(struct device_driver *dev, const char *buf,
}
static DRIVER_ATTR_RW(match_busid);
+static int do_rebind(char *busid, struct bus_id_priv *busid_priv)
+{
+ int ret;
+
+ /* device_attach() callers should hold parent lock for USB */
+ if (busid_priv->udev->dev.parent)
+ device_lock(busid_priv->udev->dev.parent);
+ ret = device_attach(&busid_priv->udev->dev);
+ if (busid_priv->udev->dev.parent)
+ device_unlock(busid_priv->udev->dev.parent);
+ if (ret < 0) {
+ dev_err(&busid_priv->udev->dev, "rebind failed\n");
+ return ret;
+ }
+ return 0;
+}
+
+static void stub_device_rebind(void)
+{
+#if IS_MODULE(CONFIG_USBIP_HOST)
+ struct bus_id_priv *busid_priv;
+ int i;
+
+ /* update status to STUB_BUSID_OTHER so probe ignores the device */
+ spin_lock(&busid_table_lock);
+ for (i = 0; i < MAX_BUSID; i++) {
+ if (busid_table[i].name[0] &&
+ busid_table[i].shutdown_busid) {
+ busid_priv = &(busid_table[i]);
+ busid_priv->status = STUB_BUSID_OTHER;
+ }
+ }
+ spin_unlock(&busid_table_lock);
+
+ /* now run rebind */
+ for (i = 0; i < MAX_BUSID; i++) {
+ if (busid_table[i].name[0] &&
+ busid_table[i].shutdown_busid) {
+ busid_priv = &(busid_table[i]);
+ do_rebind(busid_table[i].name, busid_priv);
+ }
+ }
+#endif
+}
+
static ssize_t rebind_store(struct device_driver *dev, const char *buf,
size_t count)
{
@@ -189,16 +235,9 @@ static ssize_t rebind_store(struct device_driver *dev, const char *buf,
/* mark the device for deletion so probe ignores it during rescan */
bid->status = STUB_BUSID_OTHER;
- /* device_attach() callers should hold parent lock for USB */
- if (bid->udev->dev.parent)
- device_lock(bid->udev->dev.parent);
- ret = device_attach(&bid->udev->dev);
- if (bid->udev->dev.parent)
- device_unlock(bid->udev->dev.parent);
- if (ret < 0) {
- dev_err(&bid->udev->dev, "rebind failed\n");
+ ret = do_rebind((char *) buf, bid);
+ if (ret < 0)
return ret;
- }
/* delete device from busid_table */
del_match_busid((char *) buf);
@@ -323,6 +362,9 @@ static void __exit usbip_host_exit(void)
*/
usb_deregister_device_driver(&stub_driver);
+ /* initiate scan to attach devices */
+ stub_device_rebind();
+
kmem_cache_destroy(stub_priv_cache);
}
--
2.14.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind
2018-04-30 22:17 [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind Shuah Khan (Samsung OSG)
2018-04-30 22:17 ` [REBASED PATCH 2/2] usbip: usbip_host: run rebind from exit when module is removed Shuah Khan (Samsung OSG)
@ 2018-04-30 22:48 ` Greg KH
2018-04-30 23:12 ` Shuah Khan
1 sibling, 1 reply; 4+ messages in thread
From: Greg KH @ 2018-04-30 22:48 UTC (permalink / raw)
To: Shuah Khan (Samsung OSG); +Cc: valentina.manea.m, linux-usb, linux-kernel
On Mon, Apr 30, 2018 at 04:17:19PM -0600, Shuah Khan (Samsung OSG) wrote:
> Device is left in the busid_table after unbind and rebind. Rebind
> initiates usb bus scan and the original driver claims the device.
> After rescan the device should be deleted from the busid_table as
> it no longer belongs to usbip_host.
>
> Fix it to delete the device after device_attach() succeeds.
>
> Signed-off-by: Shuah Khan (Samsung OSG) <shuah@kernel.org>
> ---
> drivers/usb/usbip/stub_main.c | 6 ++++++
> 1 file changed, 6 insertions(+)
Why are these REBASED? I can't remember the first version of these
patches, what are these for?
confused,
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind
2018-04-30 22:48 ` [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind Greg KH
@ 2018-04-30 23:12 ` Shuah Khan
0 siblings, 0 replies; 4+ messages in thread
From: Shuah Khan @ 2018-04-30 23:12 UTC (permalink / raw)
To: Greg KH; +Cc: valentina.manea.m, linux-usb, linux-kernel, Shuah Khan
On 04/30/2018 04:48 PM, Greg KH wrote:
> On Mon, Apr 30, 2018 at 04:17:19PM -0600, Shuah Khan (Samsung OSG) wrote:
>> Device is left in the busid_table after unbind and rebind. Rebind
>> initiates usb bus scan and the original driver claims the device.
>> After rescan the device should be deleted from the busid_table as
>> it no longer belongs to usbip_host.
>>
>> Fix it to delete the device after device_attach() succeeds.
>>
>> Signed-off-by: Shuah Khan (Samsung OSG) <shuah@kernel.org>
>> ---
>> drivers/usb/usbip/stub_main.c | 6 ++++++
>> 1 file changed, 6 insertions(+)
>
> Why are these REBASED? I can't remember the first version of these
> patches, what are these for?
>
> confused,
>
> greg k-h
>
>
Here is the original patches
https://patchwork.kernel.org/patch/10337657/
https://patchwork.kernel.org/patch/10337661/
I sent a 3 patch series and the last two didn't apply to usb-next. You asked me to
rebase them. I realized the reason they didn't apply is because these two depend on
the fixes that went into 4.17-rc3 and now with usb-next at 4.17-rc3, they apply.
I ended up generating patches on usb-next latest and resend the rebased patches.
Hope this makes sense.
thanks,
-- Shuah
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-04-30 23:12 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-04-30 22:17 [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind Shuah Khan (Samsung OSG)
2018-04-30 22:17 ` [REBASED PATCH 2/2] usbip: usbip_host: run rebind from exit when module is removed Shuah Khan (Samsung OSG)
2018-04-30 22:48 ` [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind Greg KH
2018-04-30 23:12 ` Shuah Khan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox