<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From: Milan Broz &lt;mbroz@redhat.com&gt;

Process write request in separate function.

Signed-off-by: Herbert Xu &lt;herbert@gondor.apana.org.au&gt;
Signed-off-by: Milan Broz &lt;mbroz@redhat.com&gt;
---
 drivers/md/dm-crypt.c |   32 +++++++++++++++++++++-----------
 1 files changed, 21 insertions(+), 11 deletions(-)

Index: linux-2.6.23/drivers/md/dm-crypt.c
===================================================================
--- linux-2.6.23.orig/drivers/md/dm-crypt.c	2007-10-10 17:20:56.000000000 +0100
+++ linux-2.6.23/drivers/md/dm-crypt.c	2007-10-10 17:20:57.000000000 +0100
@@ -611,28 +611,22 @@ static void process_read(struct dm_crypt
 	generic_make_request(clone);
 }
 
-static void process_write(struct dm_crypt_io *io)
+static void crypt_write_loop(struct dm_crypt_io *io)
 {
 	struct crypt_config *cc = io-&gt;target-&gt;private;
-	struct bio *base_bio = io-&gt;base_bio;
 	struct bio *clone;
 
-	io-&gt;remaining = base_bio-&gt;bi_size;
-	io-&gt;sector = base_bio-&gt;bi_sector - io-&gt;target-&gt;begin;
-
-	atomic_inc(&amp;io-&gt;pending);
-
-	crypt_convert_init(cc, &amp;io-&gt;ctx, NULL, base_bio, io-&gt;sector, 1);
-
 	/*
 	 * The allocated buffers can be smaller than the whole bio,
 	 * so repeat the whole process until all the data can be handled.
 	 */
+	atomic_inc(&amp;io-&gt;pending);
+
 	while (io-&gt;remaining) {
 		clone = crypt_alloc_buffer(io, io-&gt;remaining);
 		if (unlikely(!clone)) {
 			crypt_dec_pending(io, -ENOMEM);
-			return;
+			break;
 		}
 
 		io-&gt;ctx.bio_out = clone;
@@ -642,7 +636,7 @@ static void process_write(struct dm_cryp
 			crypt_free_buffer_pages(cc, clone, clone-&gt;bi_size);
 			bio_put(clone);
 			crypt_dec_pending(io, -EIO);
-			return;
+			break;
 		}
 
 		/* crypt_convert should have filled the clone bio */
@@ -666,6 +660,22 @@ static void process_write(struct dm_cryp
 		if (io-&gt;remaining)
 			congestion_wait(WRITE, HZ/100);
 	}
+
+	crypt_dec_pending(io, 0);
+}
+
+static void process_write(struct dm_crypt_io *io)
+{
+	struct crypt_config *cc = io-&gt;target-&gt;private;
+	struct bio *base_bio = io-&gt;base_bio;
+
+	io-&gt;remaining = base_bio-&gt;bi_size;
+	io-&gt;sector = base_bio-&gt;bi_sector - io-&gt;target-&gt;begin;
+
+	atomic_inc(&amp;io-&gt;pending);
+
+	crypt_convert_init(cc, &amp;io-&gt;ctx, NULL, base_bio, io-&gt;sector, 1);
+	crypt_write_loop(io);
 }
 
 static void process_read_endio(struct dm_crypt_io *io)
</pre></body></html>