mirror of https://github.com/torvalds/linux.git
In dasd_alias_disconnect_device_from_lcu the device is removed from any
list on the LCU. Afterwards the LCU is removed from the lcu list if it
does not contain devices any longer.
The lcu->lock protects the lcu from parallel updates. But to cancel all
workers and wait for completion the lcu->lock has to be unlocked.
If two devices are removed in parallel and both are removed from the LCU
the first device that takes the lcu->lock again will delete the LCU because
it is already empty but the second device also tries to free the LCU which
leads to a list corruption of the lcu list.
Fix by removing the device right before the lcu is checked without
unlocking the lcu->lock in between.
Fixes:
|
||
|---|---|---|
| .. | ||
| Kconfig | ||
| Makefile | ||
| dasd.c | ||
| dasd_3990_erp.c | ||
| dasd_alias.c | ||
| dasd_devmap.c | ||
| dasd_diag.c | ||
| dasd_diag.h | ||
| dasd_eckd.c | ||
| dasd_eckd.h | ||
| dasd_eer.c | ||
| dasd_erp.c | ||
| dasd_fba.c | ||
| dasd_fba.h | ||
| dasd_genhd.c | ||
| dasd_int.h | ||
| dasd_ioctl.c | ||
| dasd_proc.c | ||
| dcssblk.c | ||
| scm_blk.c | ||
| scm_blk.h | ||
| scm_drv.c | ||
| xpram.c | ||