mirror of
https://github.com/torvalds/linux.git
synced 2026-09-11 20:13:02 +02:00
dm-crypt: fix a tiny race condition in crypt_dec_pending
crypt_dec_pending reads io->error before calling atomic_dec_and_test. Another context, for example crypt_endio called from an interrupt, may set io->error and drop its reference between the read and the decrement. crypt_dec_pending then drops the last reference and completes the bio with the stale status - so a read that failed and was never decrypted, or a write that failed, is reported as successful. The read was placed before the decrement by commitb35f8caa08("dm crypt: wait for endio to complete before destruction"), because that commit freed dm_crypt_io before calling bio_endio. This is no longer the case, dm_crypt_io lives in the per-bio data now. Read io->error after atomic_dec_and_test instead. atomic_dec_and_test is fully ordered, so no additional barrier is needed. Fixes:b35f8caa08("dm crypt: wait for endio to complete before destruction") Cc: stable@vger.kernel.org Reviewed-by: Jose Fernandez (Anthropic) <jose.fernandez@linux.dev> Signed-off-by: Ben Cressey <ben@cressey.dev> Assisted-by: Claude:unspecified Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
This commit is contained in:
parent
cee9395acd
commit
148845aa19
|
|
@ -1745,7 +1745,6 @@ static void crypt_dec_pending(struct dm_crypt_io *io)
|
|||
{
|
||||
struct crypt_config *cc = io->cc;
|
||||
struct bio *base_bio = io->base_bio;
|
||||
blk_status_t error = io->error;
|
||||
|
||||
if (!atomic_dec_and_test(&io->io_pending))
|
||||
return;
|
||||
|
|
@ -1767,7 +1766,7 @@ static void crypt_dec_pending(struct dm_crypt_io *io)
|
|||
else
|
||||
kfree(io->integrity_metadata);
|
||||
|
||||
base_bio->bi_status = error;
|
||||
base_bio->bi_status = io->error;
|
||||
|
||||
bio_endio(base_bio);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user