• Eric Biggers's avatar
    f2fs: fix deadlock allocating bio_post_read_ctx from mempool · 644c8c92
    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 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 doesn't guarantee forward progress when > N/2 threads
    each need 2 objects at a time.
    
    Fixes: 95ae251f ("f2fs: add fs-verity support")
    Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
    Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    644c8c92
data.c 91.7 KB