From: Greg Kroah-Hartman Date: Fri, 20 Apr 2018 06:45:09 +0000 (+0200) Subject: 3.18-stable patches X-Git-Tag: v3.18.106~73 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b6c06ad6cd76cfe35d9987c144ab6f2c519a9f28;p=thirdparty%2Fkernel%2Fstable-queue.git 3.18-stable patches added patches: xen-netfront-fix-hang-on-device-removal.patch --- diff --git a/queue-3.18/series b/queue-3.18/series index 59aa888ffd2..9207a60082b 100644 --- a/queue-3.18/series +++ b/queue-3.18/series @@ -11,3 +11,4 @@ fs-reiserfs-journal.c-add-missing-resierfs_warning-arg.patch resource-fix-integer-overflow-at-reallocation.patch usb-musb-gadget-misplaced-out-of-bounds-check.patch arm-dts-at91-at91sam9g25-fix-mux-mask-pinctrl-property.patch +xen-netfront-fix-hang-on-device-removal.patch diff --git a/queue-3.18/xen-netfront-fix-hang-on-device-removal.patch b/queue-3.18/xen-netfront-fix-hang-on-device-removal.patch new file mode 100644 index 00000000000..56527cf0765 --- /dev/null +++ b/queue-3.18/xen-netfront-fix-hang-on-device-removal.patch @@ -0,0 +1,54 @@ +From c2d2e6738a209f0f9dffa2dc8e7292fc45360d61 Mon Sep 17 00:00:00 2001 +From: Jason Andryuk +Date: Wed, 28 Feb 2018 07:23:23 -0500 +Subject: xen-netfront: Fix hang on device removal + +From: Jason Andryuk + +commit c2d2e6738a209f0f9dffa2dc8e7292fc45360d61 upstream. + +A toolstack may delete the vif frontend and backend xenstore entries +while xen-netfront is in the removal code path. In that case, the +checks for xenbus_read_driver_state would return XenbusStateUnknown, and +xennet_remove would hang indefinitely. This hang prevents system +shutdown. + +xennet_remove must be able to handle XenbusStateUnknown, and +netback_changed must also wake up the wake_queue for that state as well. + +Fixes: 5b5971df3bc2 ("xen-netfront: remove warning when unloading module") + +Signed-off-by: Jason Andryuk +Cc: Eduardo Otubo +Reviewed-by: Boris Ostrovsky +Signed-off-by: Juergen Gross +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/xen-netfront.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +--- a/drivers/net/xen-netfront.c ++++ b/drivers/net/xen-netfront.c +@@ -2067,7 +2067,10 @@ static void netback_changed(struct xenbu + case XenbusStateInitialised: + case XenbusStateReconfiguring: + case XenbusStateReconfigured: ++ break; ++ + case XenbusStateUnknown: ++ wake_up_all(&module_unload_q); + break; + + case XenbusStateInitWait: +@@ -2314,7 +2317,9 @@ static int xennet_remove(struct xenbus_d + xenbus_switch_state(dev, XenbusStateClosing); + wait_event(module_unload_q, + xenbus_read_driver_state(dev->otherend) == +- XenbusStateClosing); ++ XenbusStateClosing || ++ xenbus_read_driver_state(dev->otherend) == ++ XenbusStateUnknown); + + xenbus_switch_state(dev, XenbusStateClosed); + wait_event(module_unload_q,