This is a note to let you know that I've just added the patch titled

    Staging: usbip: vhci-hcd: Do not kill already dead RX/TX kthread

to my staging git tree which can be found at
    git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git
in the staging-next branch.

The patch will show up in the next release of the linux-next tree
(usually sometime within the next 24 hours during the week.)

The patch will also will be merged in the next major kernel release
during the merge window.

If you have any questions about this process, please let me know.


>From 8547d4cc2b616e4f1dafebe2c673fc986422b506 Mon Sep 17 00:00:00 2001
From: Tobias Klauser <tklau...@distanz.ch>
Date: Fri, 24 Jun 2011 15:48:47 +0200
Subject: Staging: usbip: vhci-hcd: Do not kill already dead RX/TX kthread

When unbinding a device on the host which was still attached on the
client, I got a NULL pointer dereference on the client. This turned out
to be due to kthread_stop() being called on an already dead kthread.

Here is how I was able to reproduce the problem:

 server:# usbip bind -b 1-2
                                client:# usbip attach -h server -b 1-2
 server:# usbip unbind -b 1-2

This patch fixes the problem by checking the kthread before attempting
to kill it, as it is done on the opposite side in
stub_shutdown_connection().

Signed-off-by: Tobias Klauser <tklau...@distanz.ch>
Cc: stable <sta...@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gre...@suse.de>
---
 drivers/staging/usbip/vhci_hcd.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c
index 878b5bf..2ee97e2 100644
--- a/drivers/staging/usbip/vhci_hcd.c
+++ b/drivers/staging/usbip/vhci_hcd.c
@@ -860,9 +860,9 @@ static void vhci_shutdown_connection(struct usbip_device 
*ud)
        }
 
        /* kill threads related to this sdev, if v.c. exists */
-       if (vdev->ud.tcp_rx)
+       if (vdev->ud.tcp_rx && !task_is_dead(vdev->ud.tcp_rx))
                kthread_stop(vdev->ud.tcp_rx);
-       if (vdev->ud.tcp_tx)
+       if (vdev->ud.tcp_tx && !task_is_dead(vdev->ud.tcp_tx))
                kthread_stop(vdev->ud.tcp_tx);
 
        pr_info("stop threads\n");
-- 
1.7.6


_______________________________________________
stable mailing list
stable@linux.kernel.org
http://linux.kernel.org/mailman/listinfo/stable

Reply via email to