linux/drivers/s390/block
Stefan Haberland 0ede91f83a s390/dasd: fix list corruption of pavgroup group list
dasd_alias_add_device() moves devices to the active_devices list in case
of a scheduled LCU update regardless if they have previously been in a
pavgroup or not.

Example: device A and B are in the same pavgroup.

Device A has already been in a pavgroup and the private->pavgroup pointer
is set and points to a valid pavgroup. While going through dasd_add_device
it is moved from the pavgroup to the active_devices list.

In parallel device B might be removed from the same pavgroup in
remove_device_from_lcu() which in turn checks if the group is empty
and deletes it accordingly because device A has already been removed from
there.

When now device A enters remove_device_from_lcu() it is tried to remove it
from the pavgroup again because the pavgroup pointer is still set and again
the empty group will be cleaned up which leads to a list corruption.

Fix by setting private->pavgroup to NULL in dasd_add_device.

If the device has been the last device on the pavgroup an empty pavgroup
remains but this will be cleaned up by the scheduled lcu_update which
iterates over all existing pavgroups.

Fixes: 8e09f21574 ("[S390] dasd: add hyper PAV support to DASD device driver, part 1")
Cc: stable@vger.kernel.org
Signed-off-by: Stefan Haberland <sth@linux.ibm.com>
Reviewed-by: Jan Hoeppner <hoeppner@linux.ibm.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2020-12-17 13:41:30 -07:00
..
dasd_3990_erp.c s390/dasd: Fix comment spelling 2020-03-17 20:50:19 +01:00
dasd_alias.c s390/dasd: fix list corruption of pavgroup group list 2020-12-17 13:41:30 -07:00
dasd_devmap.c s390/dasd: Display FC Endpoint Security information via sysfs 2020-11-16 08:14:38 -07:00
dasd_diag.c s390/dasd: Use struct_size() helper 2020-07-15 08:47:11 -06:00
dasd_diag.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
dasd_eckd.c for-5.11/drivers-2020-12-14 2020-12-16 13:09:32 -08:00
dasd_eckd.h s390: Replace zero-length array with flexible-array member 2020-02-27 16:02:21 +01:00
dasd_eer.c s390/dasd: Handle out-of-space constraint 2019-07-11 20:39:54 +02:00
dasd_erp.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
dasd_fba.c for-5.11/drivers-2020-12-14 2020-12-16 13:09:32 -08:00
dasd_fba.h s390/dasd: fix typo in copyright statement 2019-12-20 11:52:01 -07:00
dasd_genhd.c dasd: cleanup dasd_scan_partitions 2020-09-23 10:43:19 -06:00
dasd_int.h for-5.11/drivers-2020-12-14 2020-12-16 13:09:32 -08:00
dasd_ioctl.c block: stop using bdget_disk for partition 0 2020-12-01 14:53:40 -07:00
dasd_proc.c proc: convert everything to "struct proc_ops" 2020-02-04 03:05:26 +00:00
dasd.c for-5.11/drivers-2020-12-14 2020-12-16 13:09:32 -08:00
dcssblk.c dcssblk: don't set bd_block_size in ->open 2020-07-01 08:08:15 -06:00
Kconfig s390/dasd: remove IOSCHED_DEADLINE from DASD Kconfig 2020-04-17 08:05:27 -06:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
scm_blk.c blk-mq: move failure injection out of blk_mq_complete_request 2020-06-24 09:15:57 -06:00
scm_blk.h Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux 2017-11-13 11:47:01 -08:00
scm_drv.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xpram.c block: move ->make_request_fn to struct block_device_operations 2020-07-01 07:27:24 -06:00