dm crypt: fix async inc_pending
authorMilan Broz <mbroz@redhat.com>
Fri, 10 Oct 2008 12:37:07 +0000 (13:37 +0100)
committerAlasdair G Kergon <agk@redhat.com>
Fri, 10 Oct 2008 12:37:07 +0000 (13:37 +0100)
The pending reference count must be incremented *before* the async work is
queued to another thread, not after.  Otherwise there's a race if the
work completes and decrements the reference count before it gets incremented.

Signed-off-by: Milan Broz <mbroz@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
drivers/md/dm-crypt.c

index d8126ac829604e131cfea1119467c6f08c433f64..262ed181669505678f7fd708eabebabedd4ee40f 100644 (file)
@@ -719,16 +719,15 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io)
 
                remaining -= clone->bi_size;
 
+               crypt_inc_pending(io);
                r = crypt_convert(cc, &io->ctx);
 
                if (atomic_dec_and_test(&io->ctx.pending)) {
                        /* processed, no running async crypto  */
-                       crypt_inc_pending(io);
                        kcryptd_crypt_write_io_submit(io, r, 0);
                        if (unlikely(r < 0))
                                break;
-               } else
-                       crypt_inc_pending(io);
+               }
 
                /* out of memory -> run queues */
                if (unlikely(remaining)) {