Commit d0a34f98 authored by Ursula Braun's avatar Ursula Braun Committed by Jeff Garzik

qeth: ungrouping a device must not be interruptible

Problem:
A recovery thread must not be active when device is removed.
In qeth_remove_device() an interruptible wait operation is used
to wait until a qeth recovery thread is finished. If a user really
interrupts the ungroup operation of a qeth device while a recovery
is running, cio and qeth are out of sync (device already removed
from cio, but kept in qeth). A following module unload of qeth
results in a kernel OOPS here.

Solution:
Do not allow interruption of ungroup operation to guarantee
finishing of a potentially running qeth recovery thread.
Signed-off-by: default avatarUrsula Braun <braunu@de.ibm.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 3052246c
...@@ -561,7 +561,7 @@ qeth_set_offline(struct ccwgroup_device *cgdev) ...@@ -561,7 +561,7 @@ qeth_set_offline(struct ccwgroup_device *cgdev)
} }
static int static int
qeth_wait_for_threads(struct qeth_card *card, unsigned long threads); qeth_threads_running(struct qeth_card *card, unsigned long threads);
static void static void
...@@ -576,8 +576,7 @@ qeth_remove_device(struct ccwgroup_device *cgdev) ...@@ -576,8 +576,7 @@ qeth_remove_device(struct ccwgroup_device *cgdev)
if (!card) if (!card)
return; return;
if (qeth_wait_for_threads(card, 0xffffffff)) wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
return;
if (cgdev->state == CCWGROUP_ONLINE){ if (cgdev->state == CCWGROUP_ONLINE){
card->use_hard_stop = 1; card->use_hard_stop = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment