diff options
Diffstat (limited to 'drivers/md/dm-crypt.c')
-rw-r--r-- | drivers/md/dm-crypt.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index ebab49f8cc1d..bfefd079a955 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -568,19 +568,22 @@ static void crypt_inc_pending(struct dm_crypt_io *io) | |||
568 | static void crypt_dec_pending(struct dm_crypt_io *io) | 568 | static void crypt_dec_pending(struct dm_crypt_io *io) |
569 | { | 569 | { |
570 | struct crypt_config *cc = io->target->private; | 570 | struct crypt_config *cc = io->target->private; |
571 | struct bio *base_bio = io->base_bio; | ||
572 | struct dm_crypt_io *base_io = io->base_io; | ||
573 | int error = io->error; | ||
571 | 574 | ||
572 | if (!atomic_dec_and_test(&io->pending)) | 575 | if (!atomic_dec_and_test(&io->pending)) |
573 | return; | 576 | return; |
574 | 577 | ||
575 | if (likely(!io->base_io)) | 578 | mempool_free(io, cc->io_pool); |
576 | bio_endio(io->base_bio, io->error); | 579 | |
580 | if (likely(!base_io)) | ||
581 | bio_endio(base_bio, error); | ||
577 | else { | 582 | else { |
578 | if (io->error && !io->base_io->error) | 583 | if (error && !base_io->error) |
579 | io->base_io->error = io->error; | 584 | base_io->error = error; |
580 | crypt_dec_pending(io->base_io); | 585 | crypt_dec_pending(base_io); |
581 | } | 586 | } |
582 | |||
583 | mempool_free(io, cc->io_pool); | ||
584 | } | 587 | } |
585 | 588 | ||
586 | /* | 589 | /* |