summaryrefslogtreecommitdiff
path: root/drivers/s390/char/tape.h
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2008-05-30 12:03:33 +0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2008-05-30 12:03:36 +0400
commit4657fb8a98a4e02981a574492bbe470c147b6657 (patch)
tree9363e9452ce5b798cad43b83b0276bda6a7568c9 /drivers/s390/char/tape.h
parent54ad64129cc166b9eec7151f3f9fc83589e33555 (diff)
downloadlinux-4657fb8a98a4e02981a574492bbe470c147b6657.tar.xz
[S390] tape: fix race with stack local wait_queue_head_t.
A wait_event call with a stack local wait_queue_head_t structure that is used to do the wake up for the wait_event is inherently racy. After the wait_event finished the wake_up call might not have completed yet. Replace the stack local wait_queue_head_t in tape_do_io and tape_do_io_interruptible with a per device wait queue. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/char/tape.h')
-rw-r--r--drivers/s390/char/tape.h3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/s390/char/tape.h b/drivers/s390/char/tape.h
index dddf8d62c153..d0d565a05dfe 100644
--- a/drivers/s390/char/tape.h
+++ b/drivers/s390/char/tape.h
@@ -231,6 +231,9 @@ struct tape_device {
/* Request queue. */
struct list_head req_queue;
+ /* Request wait queue. */
+ wait_queue_head_t wait_queue;
+
/* Each tape device has (currently) two minor numbers. */
int first_minor;