• Mikulas Patocka's avatar
    dm-bufio: fix no-sleep mode · 2a695062
    Mikulas Patocka authored
    dm-bufio has a no-sleep mode. When activated (with the
    DM_BUFIO_CLIENT_NO_SLEEP flag), the bufio client is read-only and we
    could call dm_bufio_get from tasklets. This is used by dm-verity.
    
    Unfortunately, commit 450e8dee ("dm bufio: improve concurrent IO
    performance") broke this and the kernel would warn that cache_get()
    was calling down_read() from no-sleeping context. The bug can be
    reproduced by using "veritysetup open" with the "--use-tasklets"
    flag.
    
    This commit fixes dm-bufio, so that the tasklet mode works again, by
    expanding use of the 'no_sleep_enabled' static_key to conditionally
    use either a rw_semaphore or rwlock_t (which are colocated in the
    buffer_tree structure using a union).
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Cc: stable@vger.kernel.org	# v6.4
    Fixes: 450e8dee ("dm bufio: improve concurrent IO performance")
    Signed-off-by: default avatarMike Snitzer <snitzer@kernel.org>
    2a695062
dm-bufio.c 70 KB