提交 5742fd77 编写于 作者: M Milan Broz 提交者: Alasdair G Kergon

dm crypt: move error setting outside crypt_dec_pending

Move error code setting outside of crypt_dec_pending function.
Use -EIO if crypt_convert_scatterlist() fails.
Signed-off-by: NMilan Broz <mbroz@redhat.com>
Signed-off-by: NAlasdair G Kergon <agk@redhat.com>
上级 fcd369da
...@@ -456,18 +456,14 @@ static void crypt_free_buffer_pages(struct crypt_config *cc, struct bio *clone) ...@@ -456,18 +456,14 @@ static void crypt_free_buffer_pages(struct crypt_config *cc, struct bio *clone)
* One of the bios was finished. Check for completion of * One of the bios was finished. Check for completion of
* the whole request and correctly clean up the buffer. * the whole request and correctly clean up the buffer.
*/ */
static void crypt_dec_pending(struct dm_crypt_io *io, int error) static void crypt_dec_pending(struct dm_crypt_io *io)
{ {
struct crypt_config *cc = (struct crypt_config *) io->target->private; struct crypt_config *cc = io->target->private;
if (error < 0)
io->error = error;
if (!atomic_dec_and_test(&io->pending)) if (!atomic_dec_and_test(&io->pending))
return; return;
bio_endio(io->base_bio, io->error); bio_endio(io->base_bio, io->error);
mempool_free(io, cc->io_pool); mempool_free(io, cc->io_pool);
} }
...@@ -530,7 +526,11 @@ static void crypt_endio(struct bio *clone, int error) ...@@ -530,7 +526,11 @@ static void crypt_endio(struct bio *clone, int error)
out: out:
bio_put(clone); bio_put(clone);
crypt_dec_pending(io, error);
if (unlikely(error))
io->error = error;
crypt_dec_pending(io);
} }
static void clone_init(struct dm_crypt_io *io, struct bio *clone) static void clone_init(struct dm_crypt_io *io, struct bio *clone)
...@@ -560,7 +560,8 @@ static void process_read(struct dm_crypt_io *io) ...@@ -560,7 +560,8 @@ static void process_read(struct dm_crypt_io *io)
*/ */
clone = bio_alloc_bioset(GFP_NOIO, bio_segments(base_bio), cc->bs); clone = bio_alloc_bioset(GFP_NOIO, bio_segments(base_bio), cc->bs);
if (unlikely(!clone)) { if (unlikely(!clone)) {
crypt_dec_pending(io, -ENOMEM); io->error = -ENOMEM;
crypt_dec_pending(io);
return; return;
} }
...@@ -594,7 +595,8 @@ static void process_write(struct dm_crypt_io *io) ...@@ -594,7 +595,8 @@ static void process_write(struct dm_crypt_io *io)
while (remaining) { while (remaining) {
clone = crypt_alloc_buffer(io, remaining); clone = crypt_alloc_buffer(io, remaining);
if (unlikely(!clone)) { if (unlikely(!clone)) {
crypt_dec_pending(io, -ENOMEM); io->error = -ENOMEM;
crypt_dec_pending(io);
return; return;
} }
...@@ -604,7 +606,8 @@ static void process_write(struct dm_crypt_io *io) ...@@ -604,7 +606,8 @@ static void process_write(struct dm_crypt_io *io)
if (unlikely(crypt_convert(cc, &io->ctx) < 0)) { if (unlikely(crypt_convert(cc, &io->ctx) < 0)) {
crypt_free_buffer_pages(cc, clone); crypt_free_buffer_pages(cc, clone);
bio_put(clone); bio_put(clone);
crypt_dec_pending(io, -EIO); io->error = -EIO;
crypt_dec_pending(io);
return; return;
} }
...@@ -631,14 +634,25 @@ static void process_write(struct dm_crypt_io *io) ...@@ -631,14 +634,25 @@ static void process_write(struct dm_crypt_io *io)
} }
} }
static void crypt_read_done(struct dm_crypt_io *io, int error)
{
if (unlikely(error < 0))
io->error = -EIO;
crypt_dec_pending(io);
}
static void process_read_endio(struct dm_crypt_io *io) static void process_read_endio(struct dm_crypt_io *io)
{ {
struct crypt_config *cc = io->target->private; struct crypt_config *cc = io->target->private;
int r = 0;
crypt_convert_init(cc, &io->ctx, io->base_bio, io->base_bio, crypt_convert_init(cc, &io->ctx, io->base_bio, io->base_bio,
io->base_bio->bi_sector - io->target->begin); io->base_bio->bi_sector - io->target->begin);
crypt_dec_pending(io, crypt_convert(cc, &io->ctx)); r = crypt_convert(cc, &io->ctx);
crypt_read_done(io, r);
} }
static void kcryptd_do_work(struct work_struct *work) static void kcryptd_do_work(struct work_struct *work)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册