--- drivers/md/dm-crypt.c | 37 +++++++------------------------------ 1 file changed, 7 insertions(+), 30 deletions(-) Index: linux-3.2-fast/drivers/md/dm-crypt.c =================================================================== --- linux-3.2-fast.orig/drivers/md/dm-crypt.c 2012-01-31 02:30:52.000000000 +0100 +++ linux-3.2-fast/drivers/md/dm-crypt.c 2012-01-31 02:30:53.000000000 +0100 @@ -51,7 +51,6 @@ struct dm_crypt_io { sector_t cc_sector; atomic_t cc_pending; - atomic_t io_pending; int error; sector_t sector; }; @@ -806,7 +805,7 @@ static void crypt_flush_batch(struct cry } -static void crypt_dec_pending(struct dm_crypt_io *io); +static void crypt_end_io(struct dm_crypt_io *io); static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int async); static void crypt_dec_cc_pending(struct dm_crypt_io *io) @@ -815,7 +814,7 @@ static void crypt_dec_cc_pending(struct return; if (bio_data_dir(io->base_bio) == READ) - crypt_dec_pending(io); + crypt_end_io(io); else kcryptd_crypt_write_io_submit(io, 1); } @@ -942,29 +941,20 @@ static struct dm_crypt_io *crypt_io_allo io->base_bio = bio; io->sector = sector; io->error = 0; - atomic_set(&io->io_pending, 0); return io; } -static void crypt_inc_pending(struct dm_crypt_io *io) -{ - atomic_inc(&io->io_pending); -} - /* * One of the bios was finished. Check for completion of * the whole request and correctly clean up the buffer. */ -static void crypt_dec_pending(struct dm_crypt_io *io) +static void crypt_end_io(struct dm_crypt_io *io) { struct crypt_config *cc = io->cc; struct bio *base_bio = io->base_bio; int error = io->error; - if (!atomic_dec_and_test(&io->io_pending)) - return; - mempool_free(io, cc->io_pool); bio_endio(base_bio, error); @@ -1012,7 +1002,7 @@ static void crypt_endio(struct bio *clon if (unlikely(error)) io->error = error; - crypt_dec_pending(io); + crypt_end_io(io); } static void clone_init(struct dm_crypt_io *io, struct bio *clone) @@ -1041,8 +1031,6 @@ static int kcryptd_io_read(struct dm_cry if (!clone) return 1; - crypt_inc_pending(io); - clone_init(io, clone); clone->bi_idx = 0; clone->bi_vcnt = bio_segments(base_bio); @@ -1084,7 +1072,7 @@ static void kcryptd_crypt_write_io_submi if (unlikely(io->error < 0)) { crypt_free_buffer_pages(cc, clone); bio_put(clone); - crypt_dec_pending(io); + crypt_end_io(io); return; } @@ -1106,16 +1094,13 @@ static void kcryptd_crypt_write_convert( unsigned remaining = io->base_bio->bi_size; sector_t sector = io->sector; - /* - * Prevent io from disappearing until this function completes. - */ - crypt_inc_pending(io); crypt_convert_init(cc, io, NULL, io->base_bio, sector); clone = crypt_alloc_buffer(io, remaining); if (unlikely(!clone)) { io->error = -ENOMEM; - goto dec; + crypt_end_io(io); + return; } io->bio_out = clone; @@ -1124,25 +1109,17 @@ static void kcryptd_crypt_write_convert( remaining -= clone->bi_size; sector += bio_sectors(clone); - crypt_inc_pending(io); crypt_convert(cc, io); - -dec: - crypt_dec_pending(io); } static void kcryptd_crypt_read_convert(struct dm_crypt_io *io) { struct crypt_config *cc = io->cc; - crypt_inc_pending(io); - crypt_convert_init(cc, io, io->base_bio, io->base_bio, io->sector); crypt_convert(cc, io); - - crypt_dec_pending(io); } static void kcryptd_async_done(struct crypto_async_request *async_req,