• Mikulas Patocka's avatar
    dm verity: avoid deadlock · 3b6b7813
    Mikulas Patocka authored
    A deadlock was found in the prefetch code in the dm verity map
    function.  This patch fixes this by transferring the prefetch
    to a worker thread and skipping it completely if kmalloc fails.
    
    If generic_make_request is called recursively, it queues the I/O
    request on the current->bio_list without making the I/O request
    and returns. The routine making the recursive call cannot wait
    for the I/O to complete.
    
    The deadlock occurs when one thread grabs the bufio_client
    mutex and waits for an I/O to complete but the I/O is queued
    on another thread's current->bio_list and is waiting to get
    the mutex held by the first thread.
    
    The fix recognises that prefetching is not essential.  If memory
    can be allocated, it queues the prefetch request to the worker thread,
    but if not, it does nothing.
    Signed-off-by: default avatarPaul Taysom <taysom@chromium.org>
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
    Cc: stable@kernel.org
    3b6b7813
dm-verity.c 23 KB