From 3cd5f73682b399b432864cb4c6a86a3e756b5a5f Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Fri, 8 Feb 2008 02:10:57 +0000 Subject: [PATCH] --- yaml --- r: 84581 b: refs/heads/master c: dec1cedf9d4eabe43f3c7d6af095eff40c139a89 h: refs/heads/master i: 84579: d43041ff27c770dc70202f7f2f41d7b1b4547a95 v: v3 --- [refs] | 2 +- trunk/drivers/md/dm-crypt.c | 41 ++++++++++++++++++++++--------------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index 835eff3892e9..947ce505bdf1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0c395b0f8dd7aee394df95b46963fc0f3401cf90 +refs/heads/master: dec1cedf9d4eabe43f3c7d6af095eff40c139a89 diff --git a/trunk/drivers/md/dm-crypt.c b/trunk/drivers/md/dm-crypt.c index d3c48ad580d9..4df7d2f782d8 100644 --- a/trunk/drivers/md/dm-crypt.c +++ b/trunk/drivers/md/dm-crypt.c @@ -577,18 +577,34 @@ static void kcryptd_queue_io(struct dm_crypt_io *io) static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int error) { + struct bio *clone = io->ctx.bio_out; + struct crypt_config *cc = io->target->private; + + if (unlikely(error < 0)) { + crypt_free_buffer_pages(cc, clone); + bio_put(clone); + io->error = -EIO; + crypt_dec_pending(io); + return; + } + + /* crypt_convert should have filled the clone bio */ + BUG_ON(io->ctx.idx_out < clone->bi_vcnt); + + clone->bi_sector = cc->start + io->sector; + io->sector += bio_sectors(clone); } static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) { struct crypt_config *cc = io->target->private; - struct bio *base_bio = io->base_bio; struct bio *clone; - unsigned remaining = base_bio->bi_size; + unsigned remaining = io->base_bio->bi_size; + int r; atomic_inc(&io->pending); - crypt_convert_init(cc, &io->ctx, NULL, base_bio, io->sector); + crypt_convert_init(cc, &io->ctx, NULL, io->base_bio, io->sector); /* * The allocated buffers can be smaller than the whole bio, @@ -605,20 +621,13 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) io->ctx.bio_out = clone; io->ctx.idx_out = 0; - if (unlikely(crypt_convert(cc, &io->ctx) < 0)) { - crypt_free_buffer_pages(cc, clone); - bio_put(clone); - io->error = -EIO; - crypt_dec_pending(io); - return; - } + remaining -= clone->bi_size; - /* crypt_convert should have filled the clone bio */ - BUG_ON(io->ctx.idx_out < clone->bi_vcnt); + r = crypt_convert(cc, &io->ctx); - clone->bi_sector = cc->start + io->sector; - remaining -= clone->bi_size; - io->sector += bio_sectors(clone); + kcryptd_crypt_write_io_submit(io, r); + if (unlikely(r < 0)) + return; /* Grab another reference to the io struct * before we kick off the request */ @@ -631,7 +640,7 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) * may be gone already. */ /* out of memory -> run queues */ - if (remaining) + if (unlikely(remaining)) congestion_wait(WRITE, HZ/100); } }