diff options
author | Eric Biggers <ebiggers@google.com> | 2020-09-16 05:53:13 +0200 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-10-05 18:47:43 +0200 |
commit | 07560151db960d26b425410d6fd778e6757a5da2 (patch) | |
tree | 2d8582959d8765348d923e745a187983f6c01aaf /block/blk-crypto.c | |
parent | block: add a bdget_part helper (diff) | |
download | linux-07560151db960d26b425410d6fd778e6757a5da2.tar.xz linux-07560151db960d26b425410d6fd778e6757a5da2.zip |
block: make bio_crypt_clone() able to fail
bio_crypt_clone() assumes its gfp_mask argument always includes
__GFP_DIRECT_RECLAIM, so that the mempool_alloc() will always succeed.
However, bio_crypt_clone() might be called with GFP_ATOMIC via
setup_clone() in drivers/md/dm-rq.c, or with GFP_NOWAIT via
kcryptd_io_read() in drivers/md/dm-crypt.c.
Neither case is currently reachable with a bio that actually has an
encryption context. However, it's fragile to rely on this. Just make
bio_crypt_clone() able to fail, analogous to bio_integrity_clone().
Reported-by: Miaohe Lin <linmiaohe@huawei.com>
Signed-off-by: Eric Biggers <ebiggers@google.com>
Reviewed-by: Mike Snitzer <snitzer@redhat.com>
Reviewed-by: Satya Tangirala <satyat@google.com>
Cc: Satya Tangirala <satyat@google.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-crypto.c')
-rw-r--r-- | block/blk-crypto.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/block/blk-crypto.c b/block/blk-crypto.c index 2d5e60023b08..a3f27a19067c 100644 --- a/block/blk-crypto.c +++ b/block/blk-crypto.c @@ -95,10 +95,13 @@ void __bio_crypt_free_ctx(struct bio *bio) bio->bi_crypt_context = NULL; } -void __bio_crypt_clone(struct bio *dst, struct bio *src, gfp_t gfp_mask) +int __bio_crypt_clone(struct bio *dst, struct bio *src, gfp_t gfp_mask) { dst->bi_crypt_context = mempool_alloc(bio_crypt_ctx_pool, gfp_mask); + if (!dst->bi_crypt_context) + return -ENOMEM; *dst->bi_crypt_context = *src->bi_crypt_context; + return 0; } EXPORT_SYMBOL_GPL(__bio_crypt_clone); |