diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-28 15:55:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-28 15:55:04 -0400 |
commit | 89e5d6f0d979f6e7dc2bbb1ebd9e239217e2e952 (patch) | |
tree | 1126044004b73df905a6183430376f1d97c3b6c9 /drivers/md/dm-crypt.c | |
parent | 516e77977085c9c50703fabb5dc61bd57a8cc1d0 (diff) | |
parent | a4ffc152198efba2ed9e6eac0eb97f17bfebce85 (diff) |
Merge tag 'dm-3.4-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-dm
Pull device-mapper changes for 3.4 from Alasdair Kergon:
- Update thin provisioning to support read-only external snapshot
origins and discards.
- A new target, dm verity, for device content validation.
- Mark dm uevent and dm raid as no-longer-experimental.
- Miscellaneous other fixes and clean-ups.
* tag 'dm-3.4-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-dm: (27 commits)
dm: add verity target
dm bufio: prefetch
dm thin: add pool target flags to control discard
dm thin: support discards
dm thin: prepare to support discard
dm thin: use dm_target_offset
dm thin: support read only external snapshot origins
dm thin: relax hard limit on the maximum size of a metadata device
dm persistent data: remove space map ref_count entries if redundant
dm thin: commit outstanding data every second
dm: reject trailing characters in sccanf input
dm raid: handle failed devices during start up
dm thin metadata: pass correct space map to dm_sm_root_size
dm persistent data: remove redundant value_size arg from value_ptr
dm mpath: detect invalid map_context
dm: clear bi_end_io on remapping failure
dm table: simplify call to free_devices
dm thin: correct comments
dm raid: no longer experimental
dm uevent: no longer experimental
...
Diffstat (limited to 'drivers/md/dm-crypt.c')
-rw-r--r-- | drivers/md/dm-crypt.c | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index db6b51639cee..3f06df59fd82 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
@@ -176,7 +176,6 @@ struct crypt_config { | |||
176 | 176 | ||
177 | #define MIN_IOS 16 | 177 | #define MIN_IOS 16 |
178 | #define MIN_POOL_PAGES 32 | 178 | #define MIN_POOL_PAGES 32 |
179 | #define MIN_BIO_PAGES 8 | ||
180 | 179 | ||
181 | static struct kmem_cache *_crypt_io_pool; | 180 | static struct kmem_cache *_crypt_io_pool; |
182 | 181 | ||
@@ -848,12 +847,11 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size, | |||
848 | } | 847 | } |
849 | 848 | ||
850 | /* | 849 | /* |
851 | * if additional pages cannot be allocated without waiting, | 850 | * If additional pages cannot be allocated without waiting, |
852 | * return a partially allocated bio, the caller will then try | 851 | * return a partially-allocated bio. The caller will then try |
853 | * to allocate additional bios while submitting this partial bio | 852 | * to allocate more bios while submitting this partial bio. |
854 | */ | 853 | */ |
855 | if (i == (MIN_BIO_PAGES - 1)) | 854 | gfp_mask = (gfp_mask | __GFP_NOWARN) & ~__GFP_WAIT; |
856 | gfp_mask = (gfp_mask | __GFP_NOWARN) & ~__GFP_WAIT; | ||
857 | 855 | ||
858 | len = (size > PAGE_SIZE) ? PAGE_SIZE : size; | 856 | len = (size > PAGE_SIZE) ? PAGE_SIZE : size; |
859 | 857 | ||
@@ -1046,16 +1044,14 @@ static void kcryptd_queue_io(struct dm_crypt_io *io) | |||
1046 | queue_work(cc->io_queue, &io->work); | 1044 | queue_work(cc->io_queue, &io->work); |
1047 | } | 1045 | } |
1048 | 1046 | ||
1049 | static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, | 1047 | static void kcryptd_crypt_write_io_submit(struct dm_crypt_io *io, int async) |
1050 | int error, int async) | ||
1051 | { | 1048 | { |
1052 | struct bio *clone = io->ctx.bio_out; | 1049 | struct bio *clone = io->ctx.bio_out; |
1053 | struct crypt_config *cc = io->target->private; | 1050 | struct crypt_config *cc = io->target->private; |
1054 | 1051 | ||
1055 | if (unlikely(error < 0)) { | 1052 | if (unlikely(io->error < 0)) { |
1056 | crypt_free_buffer_pages(cc, clone); | 1053 | crypt_free_buffer_pages(cc, clone); |
1057 | bio_put(clone); | 1054 | bio_put(clone); |
1058 | io->error = -EIO; | ||
1059 | crypt_dec_pending(io); | 1055 | crypt_dec_pending(io); |
1060 | return; | 1056 | return; |
1061 | } | 1057 | } |
@@ -1106,12 +1102,16 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) | |||
1106 | sector += bio_sectors(clone); | 1102 | sector += bio_sectors(clone); |
1107 | 1103 | ||
1108 | crypt_inc_pending(io); | 1104 | crypt_inc_pending(io); |
1105 | |||
1109 | r = crypt_convert(cc, &io->ctx); | 1106 | r = crypt_convert(cc, &io->ctx); |
1107 | if (r < 0) | ||
1108 | io->error = -EIO; | ||
1109 | |||
1110 | crypt_finished = atomic_dec_and_test(&io->ctx.pending); | 1110 | crypt_finished = atomic_dec_and_test(&io->ctx.pending); |
1111 | 1111 | ||
1112 | /* Encryption was already finished, submit io now */ | 1112 | /* Encryption was already finished, submit io now */ |
1113 | if (crypt_finished) { | 1113 | if (crypt_finished) { |
1114 | kcryptd_crypt_write_io_submit(io, r, 0); | 1114 | kcryptd_crypt_write_io_submit(io, 0); |
1115 | 1115 | ||
1116 | /* | 1116 | /* |
1117 | * If there was an error, do not try next fragments. | 1117 | * If there was an error, do not try next fragments. |
@@ -1162,11 +1162,8 @@ static void kcryptd_crypt_write_convert(struct dm_crypt_io *io) | |||
1162 | crypt_dec_pending(io); | 1162 | crypt_dec_pending(io); |
1163 | } | 1163 | } |
1164 | 1164 | ||
1165 | static void kcryptd_crypt_read_done(struct dm_crypt_io *io, int error) | 1165 | static void kcryptd_crypt_read_done(struct dm_crypt_io *io) |
1166 | { | 1166 | { |
1167 | if (unlikely(error < 0)) | ||
1168 | io->error = -EIO; | ||
1169 | |||
1170 | crypt_dec_pending(io); | 1167 | crypt_dec_pending(io); |
1171 | } | 1168 | } |
1172 | 1169 | ||
@@ -1181,9 +1178,11 @@ static void kcryptd_crypt_read_convert(struct dm_crypt_io *io) | |||
1181 | io->sector); | 1178 | io->sector); |
1182 | 1179 | ||
1183 | r = crypt_convert(cc, &io->ctx); | 1180 | r = crypt_convert(cc, &io->ctx); |
1181 | if (r < 0) | ||
1182 | io->error = -EIO; | ||
1184 | 1183 | ||
1185 | if (atomic_dec_and_test(&io->ctx.pending)) | 1184 | if (atomic_dec_and_test(&io->ctx.pending)) |
1186 | kcryptd_crypt_read_done(io, r); | 1185 | kcryptd_crypt_read_done(io); |
1187 | 1186 | ||
1188 | crypt_dec_pending(io); | 1187 | crypt_dec_pending(io); |
1189 | } | 1188 | } |
@@ -1204,15 +1203,18 @@ static void kcryptd_async_done(struct crypto_async_request *async_req, | |||
1204 | if (!error && cc->iv_gen_ops && cc->iv_gen_ops->post) | 1203 | if (!error && cc->iv_gen_ops && cc->iv_gen_ops->post) |
1205 | error = cc->iv_gen_ops->post(cc, iv_of_dmreq(cc, dmreq), dmreq); | 1204 | error = cc->iv_gen_ops->post(cc, iv_of_dmreq(cc, dmreq), dmreq); |
1206 | 1205 | ||
1206 | if (error < 0) | ||
1207 | io->error = -EIO; | ||
1208 | |||
1207 | mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool); | 1209 | mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool); |
1208 | 1210 | ||
1209 | if (!atomic_dec_and_test(&ctx->pending)) | 1211 | if (!atomic_dec_and_test(&ctx->pending)) |
1210 | return; | 1212 | return; |
1211 | 1213 | ||
1212 | if (bio_data_dir(io->base_bio) == READ) | 1214 | if (bio_data_dir(io->base_bio) == READ) |
1213 | kcryptd_crypt_read_done(io, error); | 1215 | kcryptd_crypt_read_done(io); |
1214 | else | 1216 | else |
1215 | kcryptd_crypt_write_io_submit(io, error, 1); | 1217 | kcryptd_crypt_write_io_submit(io, 1); |
1216 | } | 1218 | } |
1217 | 1219 | ||
1218 | static void kcryptd_crypt(struct work_struct *work) | 1220 | static void kcryptd_crypt(struct work_struct *work) |
@@ -1413,6 +1415,7 @@ static int crypt_ctr_cipher(struct dm_target *ti, | |||
1413 | char *tmp, *cipher, *chainmode, *ivmode, *ivopts, *keycount; | 1415 | char *tmp, *cipher, *chainmode, *ivmode, *ivopts, *keycount; |
1414 | char *cipher_api = NULL; | 1416 | char *cipher_api = NULL; |
1415 | int cpu, ret = -EINVAL; | 1417 | int cpu, ret = -EINVAL; |
1418 | char dummy; | ||
1416 | 1419 | ||
1417 | /* Convert to crypto api definition? */ | 1420 | /* Convert to crypto api definition? */ |
1418 | if (strchr(cipher_in, '(')) { | 1421 | if (strchr(cipher_in, '(')) { |
@@ -1434,7 +1437,7 @@ static int crypt_ctr_cipher(struct dm_target *ti, | |||
1434 | 1437 | ||
1435 | if (!keycount) | 1438 | if (!keycount) |
1436 | cc->tfms_count = 1; | 1439 | cc->tfms_count = 1; |
1437 | else if (sscanf(keycount, "%u", &cc->tfms_count) != 1 || | 1440 | else if (sscanf(keycount, "%u%c", &cc->tfms_count, &dummy) != 1 || |
1438 | !is_power_of_2(cc->tfms_count)) { | 1441 | !is_power_of_2(cc->tfms_count)) { |
1439 | ti->error = "Bad cipher key count specification"; | 1442 | ti->error = "Bad cipher key count specification"; |
1440 | return -EINVAL; | 1443 | return -EINVAL; |
@@ -1579,6 +1582,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1579 | int ret; | 1582 | int ret; |
1580 | struct dm_arg_set as; | 1583 | struct dm_arg_set as; |
1581 | const char *opt_string; | 1584 | const char *opt_string; |
1585 | char dummy; | ||
1582 | 1586 | ||
1583 | static struct dm_arg _args[] = { | 1587 | static struct dm_arg _args[] = { |
1584 | {0, 1, "Invalid number of feature args"}, | 1588 | {0, 1, "Invalid number of feature args"}, |
@@ -1636,7 +1640,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1636 | } | 1640 | } |
1637 | 1641 | ||
1638 | ret = -EINVAL; | 1642 | ret = -EINVAL; |
1639 | if (sscanf(argv[2], "%llu", &tmpll) != 1) { | 1643 | if (sscanf(argv[2], "%llu%c", &tmpll, &dummy) != 1) { |
1640 | ti->error = "Invalid iv_offset sector"; | 1644 | ti->error = "Invalid iv_offset sector"; |
1641 | goto bad; | 1645 | goto bad; |
1642 | } | 1646 | } |
@@ -1647,7 +1651,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
1647 | goto bad; | 1651 | goto bad; |
1648 | } | 1652 | } |
1649 | 1653 | ||
1650 | if (sscanf(argv[4], "%llu", &tmpll) != 1) { | 1654 | if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1) { |
1651 | ti->error = "Invalid device sector"; | 1655 | ti->error = "Invalid device sector"; |
1652 | goto bad; | 1656 | goto bad; |
1653 | } | 1657 | } |