mirror of
https://github.com/torvalds/linux.git
synced 2024-11-16 09:02:00 +00:00
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: Ursula Braun <braunu@de.ibm.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
3052246c81
commit
d0a34f98d1
@ -561,7 +561,7 @@ qeth_set_offline(struct ccwgroup_device *cgdev)
|
||||
}
|
||||
|
||||
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
|
||||
@ -576,8 +576,7 @@ qeth_remove_device(struct ccwgroup_device *cgdev)
|
||||
if (!card)
|
||||
return;
|
||||
|
||||
if (qeth_wait_for_threads(card, 0xffffffff))
|
||||
return;
|
||||
wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
|
||||
|
||||
if (cgdev->state == CCWGROUP_ONLINE){
|
||||
card->use_hard_stop = 1;
|
||||
|
Loading…
Reference in New Issue
Block a user