• Jan Höppner's avatar
    s390/dasd: Fix read for ESE with blksize < 4k · cd68c48e
    Jan Höppner authored
    When reading unformatted tracks on ESE devices, the corresponding memory
    areas are simply set to zero for each segment. This is done incorrectly
    for blocksizes < 4096.
    
    There are two problems. First, the increment of dst is done using the
    counter of the loop (off), which is increased by blksize every
    iteration. This leads to a much bigger increment for dst as actually
    intended. Second, the increment of dst is done before the memory area
    is set to 0, skipping a significant amount of bytes of memory.
    
    This leads to illegal overwriting of memory and ultimately to a kernel
    panic.
    
    This is not a problem with 4k blocksize because
    blk_queue_max_segment_size is set to PAGE_SIZE, always resulting in a
    single iteration for the inner segment loop (bv.bv_len == blksize). The
    incorrectly used 'off' value to increment dst is 0 and the correct
    memory area is used.
    
    In order to fix this for blksize < 4k, increment dst correctly using the
    blksize and only do it at the end of the loop.
    
    Fixes: 5e2b17e7 ("s390/dasd: Add dynamic formatting support for ESE volumes")
    Cc: stable@vger.kernel.org # v5.3+
    Signed-off-by: default avatarJan Höppner <hoeppner@linux.ibm.com>
    Reviewed-by: default avatarStefan Haberland <sth@linux.ibm.com>
    Link: https://lore.kernel.org/r/20220505141733.1989450-4-sth@linux.ibm.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    cd68c48e
dasd_eckd.c 183 KB