• Eric Biggers's avatar
    ext4: fix deadlock allocating bio_post_read_ctx from mempool · 68e45330
    Eric Biggers authored
    Without any form of coordination, any case where multiple allocations
    from the same mempool are needed at a time to make forward progress can
    deadlock under memory pressure.
    
    This is the case for struct bio_post_read_ctx, as one can be allocated
    to decrypt a Merkle tree page during fsverity_verify_bio(), which itself
    is running from a post-read callback for a data bio which has its own
    struct bio_post_read_ctx.
    
    Fix this by freeing the first bio_post_read_ctx before calling
    fsverity_verify_bio().  This works because verity (if enabled) is always
    the last post-read step.
    
    This deadlock can be reproduced by trying to read from an encrypted
    verity file after reducing NUM_PREALLOC_POST_READ_CTXS to 1 and patching
    mempool_alloc() to pretend that pool->alloc() always fails.
    
    Note that since NUM_PREALLOC_POST_READ_CTXS is actually 128, to actually
    hit this bug in practice would require reading from lots of encrypted
    verity files at the same time.  But it's theoretically possible, as N
    available objects isn't enough to guarantee forward progress when > N/2
    threads each need 2 objects at a time.
    
    Fixes: 22cfe4b4 ("ext4: add fs-verity read support")
    Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
    Link: https://lore.kernel.org/r/20191231181222.47684-1-ebiggers@kernel.orgSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    68e45330
readpage.c 11.5 KB