• Eric Biggers's avatar
    blk-crypto: use dynamic lock class for blk_crypto_profile::lock · 2fb48d88
    Eric Biggers authored
    When a device-mapper device is passing through the inline encryption
    support of an underlying device, calls to blk_crypto_evict_key() take
    the blk_crypto_profile::lock of the device-mapper device, then take the
    blk_crypto_profile::lock of the underlying device (nested).  This isn't
    a real deadlock, but it causes a lockdep report because there is only
    one lock class for all instances of this lock.
    
    Lockdep subclasses don't really work here because the hierarchy of block
    devices is dynamic and could have more than 2 levels.
    
    Instead, register a dynamic lock class for each blk_crypto_profile, and
    associate that with the lock.
    
    This avoids false-positive lockdep reports like the following:
    
        ============================================
        WARNING: possible recursive locking detected
        6.4.0-rc5 #2 Not tainted
        --------------------------------------------
        fscryptctl/1421 is trying to acquire lock:
        ffffff80829ca418 (&profile->lock){++++}-{3:3}, at: __blk_crypto_evict_key+0x44/0x1c0
    
                       but task is already holding lock:
        ffffff8086b68ca8 (&profile->lock){++++}-{3:3}, at: __blk_crypto_evict_key+0xc8/0x1c0
    
                       other info that might help us debug this:
         Possible unsafe locking scenario:
    
               CPU0
               ----
          lock(&profile->lock);
          lock(&profile->lock);
    
                        *** DEADLOCK ***
    
         May be due to missing lock nesting notation
    
    Fixes: 1b262839 ("block: Keyslot Manager for Inline Encryption")
    Reported-by: default avatarBart Van Assche <bvanassche@acm.org>
    Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
    Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
    Link: https://lore.kernel.org/r/20230610061139.212085-1-ebiggers@kernel.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    2fb48d88
blk-crypto-profile.h 5.3 KB