diff options
author | Milan Broz <mbroz@redhat.com> | 2008-02-08 02:11:02 +0000 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2008-02-08 02:11:02 +0000 |
commit | 899c95d36c896f9fb7bc5f4f03b4abd86bda292c (patch) | |
tree | 824017f25f4c0ed321077e068280c9bbd207ad47 /drivers | |
parent | 84131db689ab86409315c15a3ea5daf732cb04e1 (diff) |
dm crypt: tidy io ref counting
Make io reference counting more obvious.
Signed-off-by: Milan Broz <mbroz@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/md/dm-crypt.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index 986283c5332f..44e1aa30e3f6 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c @@ -584,7 +584,6 @@ static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int error) crypt_free_buffer_pages(cc, clone); bio_put(clone); io->error = -EIO; - crypt_dec_pending(io); return; } @@ -593,6 +592,9 @@ static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int error) clone->bi_sector = cc->start + io->sector; io->sector += bio_sectors(clone); + + atomic_inc(&io->pending); + generic_make_request(clone); } static void kcryptd_crypt_write_convert_loop(struct dm_crypt_io *io) @@ -610,7 +612,6 @@ static void kcryptd_crypt_write_convert_loop(struct dm_crypt_io *io) clone = crypt_alloc_buffer(io, remaining); if (unlikely(!clone)) { io->error = -ENOMEM; - crypt_dec_pending(io); return; } @@ -625,16 +626,6 @@ static void kcryptd_crypt_write_convert_loop(struct dm_crypt_io *io) if (unlikely(r < 0)) return; - /* Grab another reference to the io struct - * before we kick off the request */ - if (remaining) - atomic_inc(&io->pending); - - generic_make_request(clone); - - /* Do not reference clone after this - it - * may be gone already. */ - /* out of memory -> run queues */ if (unlikely(remaining)) congestion_wait(WRITE, HZ/100); @@ -645,10 +636,15 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) { struct crypt_config *cc = io->target->private; + /* + * Prevent io from disappearing until this function completes. + */ atomic_inc(&io->pending); crypt_convert_init(cc, &io->ctx, NULL, io->base_bio, io->sector); kcryptd_crypt_write_convert_loop(io); + + crypt_dec_pending(io); } static void kcryptd_crypt_read_done(struct dm_crypt_io *io, int error) |