diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2006-09-20 09:59:05 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2006-09-20 09:59:05 -0400 |
commit | a00bfd7147c0c5c04a59f7adcb0e6d8948b90a6e (patch) | |
tree | ffe3eb5ede49bf5a14fe31f3270d917fc4bc9c7a /drivers/s390/block/dasd_int.h | |
parent | 47addc84b450fd5e391ab118e178645cb0bbd89d (diff) |
[S390] dasd deadlock after state change pending interrupt.
The dasd_device_from_cdev function is called from interrupt context
to get the struct dasd_device associated with a ccw device. The
driver_data of the ccw device points to the dasd_devmap structure
which contains the pointer to the dasd_device structure. The lock
that protects the dasd_devmap structure is acquire with out irqsave.
To prevent the deadlock in dasd_device_from_cdev if it is called
from interrupt context the dependency to the dasd_devmap structure
needs to be removed. Let the driver_data of the ccw device point
to the dasd_device structure directly and use the ccw device lock
to protect the access.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers/s390/block/dasd_int.h')
-rw-r--r-- | drivers/s390/block/dasd_int.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index 3ccf06d28ba1..9f52004f6fc2 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h | |||
@@ -534,6 +534,7 @@ int dasd_add_sysfs_files(struct ccw_device *); | |||
534 | void dasd_remove_sysfs_files(struct ccw_device *); | 534 | void dasd_remove_sysfs_files(struct ccw_device *); |
535 | 535 | ||
536 | struct dasd_device *dasd_device_from_cdev(struct ccw_device *); | 536 | struct dasd_device *dasd_device_from_cdev(struct ccw_device *); |
537 | struct dasd_device *dasd_device_from_cdev_locked(struct ccw_device *); | ||
537 | struct dasd_device *dasd_device_from_devindex(int); | 538 | struct dasd_device *dasd_device_from_devindex(int); |
538 | 539 | ||
539 | int dasd_parse(void); | 540 | int dasd_parse(void); |