* [REBASED,1/2] usbip: usbip_host: delete device from busid_table after rebind
@ 2018-04-30 22:17 ` Shuah Khan (Samsung OSG)
0 siblings, 0 replies; 8+ messages in thread
From: Shuah Khan @ 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;
}
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind
@ 2018-04-30 22:17 ` Shuah Khan (Samsung OSG)
0 siblings, 0 replies; 8+ 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] 8+ messages in thread
* [REBASED,2/2] usbip: usbip_host: run rebind from exit when module is removed
2018-04-30 22:17 ` [REBASED PATCH 1/2] " Shuah Khan (Samsung OSG)
@ 2018-04-30 22:17 ` Shuah Khan (Samsung OSG)
-1 siblings, 0 replies; 8+ messages in thread
From: Shuah Khan @ 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);
}
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [REBASED PATCH 2/2] usbip: usbip_host: run rebind from exit when module is removed
@ 2018-04-30 22:17 ` Shuah Khan (Samsung OSG)
0 siblings, 0 replies; 8+ 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] 8+ messages in thread
* [REBASED,1/2] usbip: usbip_host: delete device from busid_table after rebind
2018-04-30 22:17 ` [REBASED PATCH 1/2] " Shuah Khan (Samsung OSG)
@ 2018-04-30 22:48 ` Greg KH
-1 siblings, 0 replies; 8+ messages in thread
From: Greg Kroah-Hartman @ 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
---
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind
@ 2018-04-30 22:48 ` Greg KH
0 siblings, 0 replies; 8+ 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] 8+ messages in thread
* [REBASED,1/2] usbip: usbip_host: delete device from busid_table after rebind
2018-04-30 22:48 ` [REBASED PATCH 1/2] " Greg KH
@ 2018-04-30 23:12 ` Shuah Khan
-1 siblings, 0 replies; 8+ 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
---
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [REBASED PATCH 1/2] usbip: usbip_host: delete device from busid_table after rebind
@ 2018-04-30 23:12 ` Shuah Khan
0 siblings, 0 replies; 8+ 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] 8+ messages in thread
end of thread, other threads:[~2018-04-30 23:12 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-04-30 22:48 [REBASED,1/2] usbip: usbip_host: delete device from busid_table after rebind Greg Kroah-Hartman
2018-04-30 22:48 ` [REBASED PATCH 1/2] " Greg KH
-- strict thread matches above, loose matches on Subject: below --
2018-04-30 23:12 [REBASED,1/2] " Shuah Khan
2018-04-30 23:12 ` [REBASED PATCH 1/2] " Shuah Khan
2018-04-30 22:17 [REBASED,2/2] usbip: usbip_host: run rebind from exit when module is removed Shuah Khan
2018-04-30 22:17 ` [REBASED PATCH 2/2] " Shuah Khan (Samsung OSG)
2018-04-30 22:17 [REBASED,1/2] usbip: usbip_host: delete device from busid_table after rebind Shuah Khan
2018-04-30 22:17 ` [REBASED PATCH 1/2] " Shuah Khan (Samsung OSG)
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.