• Stefan Haberland's avatar
    s390/dasd: fix list corruption of lcu list · 53a7f655
    Stefan Haberland authored
    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: 8e09f215 ("[S390] dasd: add hyper PAV support to DASD device driver, part 1")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarStefan Haberland <sth@linux.ibm.com>
    Reviewed-by: default avatarJan Hoeppner <hoeppner@linux.ibm.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    53a7f655
dasd_alias.c 27.7 KB