summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKasoju Mallikarjun <mkasoju@nvidia.com>2011-12-27 18:57:13 +0530
committerVarun Wadekar <vwadekar@nvidia.com>2012-01-06 18:05:06 +0530
commit51ef8c15c4fb5eb1eb510a2f4dacf9f98da2bc34 (patch)
treecd9f40a27176daa6485bccf5770212b766b5da14
parent9ae7d2174f250445884817ca86aca2bea1e5c723 (diff)
Revert "dm crypt: use io thread for reads only if mempool exhausted"
This reverts commit 20c82538e4f5ede51bc2b4795bc6e5cae772796d. Conflicts: drivers/md/dm-crypt.c Change-Id: Id6c1f774c735836652c07ee279fb81093e732372 Reviewed-on: http://git-master/r/72236 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Mallikarjun Kasoju <mkasoju@nvidia.com> Tested-by: Mallikarjun Kasoju <mkasoju@nvidia.com> Tested-by: Ahung Cheng <ahcheng@nvidia.com> Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
-rw-r--r--drivers/md/dm-crypt.c32
1 files changed, 15 insertions, 17 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index ff5c952a1884..2cd7e42f764b 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -786,22 +786,25 @@ static void clone_init(struct dm_crypt_io *io, struct bio *clone)
clone->bi_destructor = dm_crypt_bio_destructor;
}
-static int kcryptd_io_read(struct dm_crypt_io *io, gfp_t gfp)
+static void kcryptd_io_read(struct dm_crypt_io *io)
{
struct crypt_config *cc = io->target->private;
struct bio *base_bio = io->base_bio;
struct bio *clone;
+ crypt_inc_pending(io);
+
/*
* The block layer might modify the bvec array, so always
* copy the required bvecs because we need the original
* one in order to decrypt the whole bio data *afterwards*.
*/
- clone = bio_alloc_bioset(gfp, bio_segments(base_bio), cc->bs);
- if (!clone)
- return 1;
-
- crypt_inc_pending(io);
+ clone = bio_alloc_bioset(GFP_NOIO, bio_segments(base_bio), cc->bs);
+ if (unlikely(!clone)) {
+ io->error = -ENOMEM;
+ crypt_dec_pending(io);
+ return;
+ }
clone_init(io, clone);
clone->bi_idx = 0;
@@ -812,7 +815,6 @@ static int kcryptd_io_read(struct dm_crypt_io *io, gfp_t gfp)
sizeof(struct bio_vec) * clone->bi_vcnt);
generic_make_request(clone);
- return 0;
}
static void kcryptd_io_write(struct dm_crypt_io *io)
@@ -825,12 +827,9 @@ static void kcryptd_io(struct work_struct *work)
{
struct dm_crypt_io *io = container_of(work, struct dm_crypt_io, work);
- if (bio_data_dir(io->base_bio) == READ) {
- crypt_inc_pending(io);
- if (kcryptd_io_read(io, GFP_NOIO))
- io->error = -ENOMEM;
- crypt_dec_pending(io);
- } else
+ if (bio_data_dir(io->base_bio) == READ)
+ kcryptd_io_read(io);
+ else
kcryptd_io_write(io);
}
@@ -1463,10 +1462,9 @@ static int crypt_map(struct dm_target *ti, struct bio *bio,
io = crypt_io_alloc(ti, bio, dm_target_offset(ti, bio->bi_sector));
- if (bio_data_dir(io->base_bio) == READ) {
- if (kcryptd_io_read(io, GFP_NOWAIT))
- kcryptd_queue_io(io);
- } else
+ if (bio_data_dir(io->base_bio) == READ)
+ kcryptd_queue_io(io);
+ else
kcryptd_queue_crypt(io);
return DM_MAPIO_SUBMITTED;