diff options
| -rw-r--r-- | drivers/md/dm-crypt.c | 180 |
1 files changed, 93 insertions, 87 deletions
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c index a8aab9cf26b9..139bbe2254cd 100644 --- a/drivers/md/dm-crypt.c +++ b/drivers/md/dm-crypt.c | |||
| @@ -999,6 +999,45 @@ static int crypt_wipe_key(struct crypt_config *cc) | |||
| 999 | return crypto_ablkcipher_setkey(cc->tfm, cc->key, cc->key_size); | 999 | return crypto_ablkcipher_setkey(cc->tfm, cc->key, cc->key_size); |
| 1000 | } | 1000 | } |
| 1001 | 1001 | ||
| 1002 | static void crypt_dtr(struct dm_target *ti) | ||
| 1003 | { | ||
| 1004 | struct crypt_config *cc = ti->private; | ||
| 1005 | |||
| 1006 | ti->private = NULL; | ||
| 1007 | |||
| 1008 | if (!cc) | ||
| 1009 | return; | ||
| 1010 | |||
| 1011 | if (cc->io_queue) | ||
| 1012 | destroy_workqueue(cc->io_queue); | ||
| 1013 | if (cc->crypt_queue) | ||
| 1014 | destroy_workqueue(cc->crypt_queue); | ||
| 1015 | |||
| 1016 | if (cc->bs) | ||
| 1017 | bioset_free(cc->bs); | ||
| 1018 | |||
| 1019 | if (cc->page_pool) | ||
| 1020 | mempool_destroy(cc->page_pool); | ||
| 1021 | if (cc->req_pool) | ||
| 1022 | mempool_destroy(cc->req_pool); | ||
| 1023 | if (cc->io_pool) | ||
| 1024 | mempool_destroy(cc->io_pool); | ||
| 1025 | |||
| 1026 | if (cc->iv_gen_ops && cc->iv_gen_ops->dtr) | ||
| 1027 | cc->iv_gen_ops->dtr(cc); | ||
| 1028 | |||
| 1029 | if (cc->tfm && !IS_ERR(cc->tfm)) | ||
| 1030 | crypto_free_ablkcipher(cc->tfm); | ||
| 1031 | |||
| 1032 | if (cc->dev) | ||
| 1033 | dm_put_device(ti, cc->dev); | ||
| 1034 | |||
| 1035 | kfree(cc->iv_mode); | ||
| 1036 | |||
| 1037 | /* Must zero key material before freeing */ | ||
| 1038 | kzfree(cc); | ||
| 1039 | } | ||
| 1040 | |||
| 1002 | /* | 1041 | /* |
| 1003 | * Construct an encryption mapping: | 1042 | * Construct an encryption mapping: |
| 1004 | * <cipher> <key> <iv_offset> <dev_path> <start> | 1043 | * <cipher> <key> <iv_offset> <dev_path> <start> |
| @@ -1006,7 +1045,6 @@ static int crypt_wipe_key(struct crypt_config *cc) | |||
| 1006 | static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | 1045 | static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) |
| 1007 | { | 1046 | { |
| 1008 | struct crypt_config *cc; | 1047 | struct crypt_config *cc; |
| 1009 | struct crypto_ablkcipher *tfm; | ||
| 1010 | char *tmp; | 1048 | char *tmp; |
| 1011 | char *cipher; | 1049 | char *cipher; |
| 1012 | char *chainmode; | 1050 | char *chainmode; |
| @@ -1014,6 +1052,7 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1014 | char *ivopts; | 1052 | char *ivopts; |
| 1015 | unsigned int key_size; | 1053 | unsigned int key_size; |
| 1016 | unsigned long long tmpll; | 1054 | unsigned long long tmpll; |
| 1055 | int ret = -EINVAL; | ||
| 1017 | 1056 | ||
| 1018 | if (argc != 5) { | 1057 | if (argc != 5) { |
| 1019 | ti->error = "Not enough arguments"; | 1058 | ti->error = "Not enough arguments"; |
| @@ -1032,12 +1071,13 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1032 | key_size = strlen(argv[1]) >> 1; | 1071 | key_size = strlen(argv[1]) >> 1; |
| 1033 | 1072 | ||
| 1034 | cc = kzalloc(sizeof(*cc) + key_size * sizeof(u8), GFP_KERNEL); | 1073 | cc = kzalloc(sizeof(*cc) + key_size * sizeof(u8), GFP_KERNEL); |
| 1035 | if (cc == NULL) { | 1074 | if (!cc) { |
| 1036 | ti->error = | 1075 | ti->error = "Cannot allocate transparent encryption context"; |
| 1037 | "Cannot allocate transparent encryption context"; | ||
| 1038 | return -ENOMEM; | 1076 | return -ENOMEM; |
| 1039 | } | 1077 | } |
| 1040 | 1078 | ||
| 1079 | ti->private = cc; | ||
| 1080 | |||
| 1041 | /* Compatibility mode for old dm-crypt cipher strings */ | 1081 | /* Compatibility mode for old dm-crypt cipher strings */ |
| 1042 | if (!chainmode || (strcmp(chainmode, "plain") == 0 && !ivmode)) { | 1082 | if (!chainmode || (strcmp(chainmode, "plain") == 0 && !ivmode)) { |
| 1043 | chainmode = "cbc"; | 1083 | chainmode = "cbc"; |
| @@ -1046,35 +1086,36 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1046 | 1086 | ||
| 1047 | if (strcmp(chainmode, "ecb") && !ivmode) { | 1087 | if (strcmp(chainmode, "ecb") && !ivmode) { |
| 1048 | ti->error = "This chaining mode requires an IV mechanism"; | 1088 | ti->error = "This chaining mode requires an IV mechanism"; |
| 1049 | goto bad_cipher; | 1089 | goto bad; |
| 1050 | } | 1090 | } |
| 1051 | 1091 | ||
| 1092 | ret = -ENOMEM; | ||
| 1052 | if (snprintf(cc->cipher, CRYPTO_MAX_ALG_NAME, "%s(%s)", | 1093 | if (snprintf(cc->cipher, CRYPTO_MAX_ALG_NAME, "%s(%s)", |
| 1053 | chainmode, cipher) >= CRYPTO_MAX_ALG_NAME) { | 1094 | chainmode, cipher) >= CRYPTO_MAX_ALG_NAME) { |
| 1054 | ti->error = "Chain mode + cipher name is too long"; | 1095 | ti->error = "Chain mode + cipher name is too long"; |
| 1055 | goto bad_cipher; | 1096 | goto bad; |
| 1056 | } | 1097 | } |
| 1057 | 1098 | ||
| 1058 | tfm = crypto_alloc_ablkcipher(cc->cipher, 0, 0); | 1099 | cc->tfm = crypto_alloc_ablkcipher(cc->cipher, 0, 0); |
| 1059 | if (IS_ERR(tfm)) { | 1100 | if (IS_ERR(cc->tfm)) { |
| 1060 | ti->error = "Error allocating crypto tfm"; | 1101 | ti->error = "Error allocating crypto tfm"; |
| 1061 | goto bad_cipher; | 1102 | goto bad; |
| 1062 | } | 1103 | } |
| 1063 | 1104 | ||
| 1064 | strcpy(cc->cipher, cipher); | 1105 | strcpy(cc->cipher, cipher); |
| 1065 | strcpy(cc->chainmode, chainmode); | 1106 | strcpy(cc->chainmode, chainmode); |
| 1066 | cc->tfm = tfm; | ||
| 1067 | 1107 | ||
| 1068 | if (crypt_set_key(cc, argv[1]) < 0) { | 1108 | ret = crypt_set_key(cc, argv[1]); |
| 1109 | if (ret < 0) { | ||
| 1069 | ti->error = "Error decoding and setting key"; | 1110 | ti->error = "Error decoding and setting key"; |
| 1070 | goto bad_ivmode; | 1111 | goto bad; |
| 1071 | } | 1112 | } |
| 1072 | 1113 | ||
| 1073 | /* | 1114 | /* |
| 1074 | * Choose ivmode. Valid modes: "plain", "essiv:<esshash>", "benbi". | 1115 | * Choose ivmode. Valid modes: "plain", "essiv:<esshash>", "benbi". |
| 1075 | * See comments at iv code | 1116 | * See comments at iv code |
| 1076 | */ | 1117 | */ |
| 1077 | 1118 | ret = -EINVAL; | |
| 1078 | if (ivmode == NULL) | 1119 | if (ivmode == NULL) |
| 1079 | cc->iv_gen_ops = NULL; | 1120 | cc->iv_gen_ops = NULL; |
| 1080 | else if (strcmp(ivmode, "plain") == 0) | 1121 | else if (strcmp(ivmode, "plain") == 0) |
| @@ -1089,20 +1130,28 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1089 | cc->iv_gen_ops = &crypt_iv_null_ops; | 1130 | cc->iv_gen_ops = &crypt_iv_null_ops; |
| 1090 | else { | 1131 | else { |
| 1091 | ti->error = "Invalid IV mode"; | 1132 | ti->error = "Invalid IV mode"; |
| 1092 | goto bad_ivmode; | 1133 | goto bad; |
| 1093 | } | 1134 | } |
| 1094 | 1135 | ||
| 1095 | if (cc->iv_gen_ops && cc->iv_gen_ops->ctr && | 1136 | /* Allocate IV */ |
| 1096 | cc->iv_gen_ops->ctr(cc, ti, ivopts) < 0) | 1137 | if (cc->iv_gen_ops && cc->iv_gen_ops->ctr) { |
| 1097 | goto bad_ivmode; | 1138 | ret = cc->iv_gen_ops->ctr(cc, ti, ivopts); |
| 1139 | if (ret < 0) { | ||
| 1140 | ti->error = "Error creating IV"; | ||
| 1141 | goto bad; | ||
| 1142 | } | ||
| 1143 | } | ||
| 1098 | 1144 | ||
| 1099 | if (cc->iv_gen_ops && cc->iv_gen_ops->init && | 1145 | /* Initialize IV (set keys for ESSIV etc) */ |
| 1100 | cc->iv_gen_ops->init(cc) < 0) { | 1146 | if (cc->iv_gen_ops && cc->iv_gen_ops->init) { |
| 1101 | ti->error = "Error initialising IV"; | 1147 | ret = cc->iv_gen_ops->init(cc); |
| 1102 | goto bad_slab_pool; | 1148 | if (ret < 0) { |
| 1149 | ti->error = "Error initialising IV"; | ||
| 1150 | goto bad; | ||
| 1151 | } | ||
| 1103 | } | 1152 | } |
| 1104 | 1153 | ||
| 1105 | cc->iv_size = crypto_ablkcipher_ivsize(tfm); | 1154 | cc->iv_size = crypto_ablkcipher_ivsize(cc->tfm); |
| 1106 | if (cc->iv_size) | 1155 | if (cc->iv_size) |
| 1107 | /* at least a 64 bit sector number should fit in our buffer */ | 1156 | /* at least a 64 bit sector number should fit in our buffer */ |
| 1108 | cc->iv_size = max(cc->iv_size, | 1157 | cc->iv_size = max(cc->iv_size, |
| @@ -1116,62 +1165,65 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1116 | } | 1165 | } |
| 1117 | } | 1166 | } |
| 1118 | 1167 | ||
| 1168 | ret = -ENOMEM; | ||
| 1119 | cc->io_pool = mempool_create_slab_pool(MIN_IOS, _crypt_io_pool); | 1169 | cc->io_pool = mempool_create_slab_pool(MIN_IOS, _crypt_io_pool); |
| 1120 | if (!cc->io_pool) { | 1170 | if (!cc->io_pool) { |
| 1121 | ti->error = "Cannot allocate crypt io mempool"; | 1171 | ti->error = "Cannot allocate crypt io mempool"; |
| 1122 | goto bad_slab_pool; | 1172 | goto bad; |
| 1123 | } | 1173 | } |
| 1124 | 1174 | ||
| 1125 | cc->dmreq_start = sizeof(struct ablkcipher_request); | 1175 | cc->dmreq_start = sizeof(struct ablkcipher_request); |
| 1126 | cc->dmreq_start += crypto_ablkcipher_reqsize(tfm); | 1176 | cc->dmreq_start += crypto_ablkcipher_reqsize(cc->tfm); |
| 1127 | cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment()); | 1177 | cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment()); |
| 1128 | cc->dmreq_start += crypto_ablkcipher_alignmask(tfm) & | 1178 | cc->dmreq_start += crypto_ablkcipher_alignmask(cc->tfm) & |
| 1129 | ~(crypto_tfm_ctx_alignment() - 1); | 1179 | ~(crypto_tfm_ctx_alignment() - 1); |
| 1130 | 1180 | ||
| 1131 | cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start + | 1181 | cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start + |
| 1132 | sizeof(struct dm_crypt_request) + cc->iv_size); | 1182 | sizeof(struct dm_crypt_request) + cc->iv_size); |
| 1133 | if (!cc->req_pool) { | 1183 | if (!cc->req_pool) { |
| 1134 | ti->error = "Cannot allocate crypt request mempool"; | 1184 | ti->error = "Cannot allocate crypt request mempool"; |
| 1135 | goto bad_req_pool; | 1185 | goto bad; |
| 1136 | } | 1186 | } |
| 1137 | cc->req = NULL; | 1187 | cc->req = NULL; |
| 1138 | 1188 | ||
| 1139 | cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0); | 1189 | cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0); |
| 1140 | if (!cc->page_pool) { | 1190 | if (!cc->page_pool) { |
| 1141 | ti->error = "Cannot allocate page mempool"; | 1191 | ti->error = "Cannot allocate page mempool"; |
| 1142 | goto bad_page_pool; | 1192 | goto bad; |
| 1143 | } | 1193 | } |
| 1144 | 1194 | ||
| 1145 | cc->bs = bioset_create(MIN_IOS, 0); | 1195 | cc->bs = bioset_create(MIN_IOS, 0); |
| 1146 | if (!cc->bs) { | 1196 | if (!cc->bs) { |
| 1147 | ti->error = "Cannot allocate crypt bioset"; | 1197 | ti->error = "Cannot allocate crypt bioset"; |
| 1148 | goto bad_bs; | 1198 | goto bad; |
| 1149 | } | 1199 | } |
| 1150 | 1200 | ||
| 1201 | ret = -EINVAL; | ||
| 1151 | if (sscanf(argv[2], "%llu", &tmpll) != 1) { | 1202 | if (sscanf(argv[2], "%llu", &tmpll) != 1) { |
| 1152 | ti->error = "Invalid iv_offset sector"; | 1203 | ti->error = "Invalid iv_offset sector"; |
| 1153 | goto bad_device; | 1204 | goto bad; |
| 1154 | } | 1205 | } |
| 1155 | cc->iv_offset = tmpll; | 1206 | cc->iv_offset = tmpll; |
| 1156 | 1207 | ||
| 1208 | if (dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev)) { | ||
| 1209 | ti->error = "Device lookup failed"; | ||
| 1210 | goto bad; | ||
| 1211 | } | ||
| 1212 | |||
| 1157 | if (sscanf(argv[4], "%llu", &tmpll) != 1) { | 1213 | if (sscanf(argv[4], "%llu", &tmpll) != 1) { |
| 1158 | ti->error = "Invalid device sector"; | 1214 | ti->error = "Invalid device sector"; |
| 1159 | goto bad_device; | 1215 | goto bad; |
| 1160 | } | 1216 | } |
| 1161 | cc->start = tmpll; | 1217 | cc->start = tmpll; |
| 1162 | 1218 | ||
| 1163 | if (dm_get_device(ti, argv[3], dm_table_get_mode(ti->table), &cc->dev)) { | 1219 | ret = -ENOMEM; |
| 1164 | ti->error = "Device lookup failed"; | ||
| 1165 | goto bad_device; | ||
| 1166 | } | ||
| 1167 | |||
| 1168 | if (ivmode && cc->iv_gen_ops) { | 1220 | if (ivmode && cc->iv_gen_ops) { |
| 1169 | if (ivopts) | 1221 | if (ivopts) |
| 1170 | *(ivopts - 1) = ':'; | 1222 | *(ivopts - 1) = ':'; |
| 1171 | cc->iv_mode = kstrdup(ivmode, GFP_KERNEL); | 1223 | cc->iv_mode = kstrdup(ivmode, GFP_KERNEL); |
| 1172 | if (!cc->iv_mode) { | 1224 | if (!cc->iv_mode) { |
| 1173 | ti->error = "Error kmallocing iv_mode string"; | 1225 | ti->error = "Error kmallocing iv_mode string"; |
| 1174 | goto bad_ivmode_string; | 1226 | goto bad; |
| 1175 | } | 1227 | } |
| 1176 | } else | 1228 | } else |
| 1177 | cc->iv_mode = NULL; | 1229 | cc->iv_mode = NULL; |
| @@ -1179,67 +1231,21 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
| 1179 | cc->io_queue = create_singlethread_workqueue("kcryptd_io"); | 1231 | cc->io_queue = create_singlethread_workqueue("kcryptd_io"); |
| 1180 | if (!cc->io_queue) { | 1232 | if (!cc->io_queue) { |
| 1181 | ti->error = "Couldn't create kcryptd io queue"; | 1233 | ti->error = "Couldn't create kcryptd io queue"; |
| 1182 | goto bad_io_queue; | 1234 | goto bad; |
| 1183 | } | 1235 | } |
| 1184 | 1236 | ||
| 1185 | cc->crypt_queue = create_singlethread_workqueue("kcryptd"); | 1237 | cc->crypt_queue = create_singlethread_workqueue("kcryptd"); |
| 1186 | if (!cc->crypt_queue) { | 1238 | if (!cc->crypt_queue) { |
| 1187 | ti->error = "Couldn't create kcryptd queue"; | 1239 | ti->error = "Couldn't create kcryptd queue"; |
| 1188 | goto bad_crypt_queue; | 1240 | goto bad; |
| 1189 | } | 1241 | } |
| 1190 | 1242 | ||
| 1191 | ti->num_flush_requests = 1; | 1243 | ti->num_flush_requests = 1; |
| 1192 | ti->private = cc; | ||
| 1193 | return 0; | 1244 | return 0; |
| 1194 | 1245 | ||
| 1195 | bad_crypt_queue: | 1246 | bad: |
| 1196 | destroy_workqueue(cc->io_queue); | 1247 | crypt_dtr(ti); |
| 1197 | bad_io_queue: | 1248 | return ret; |
| 1198 | kfree(cc->iv_mode); | ||
| 1199 | bad_ivmode_string: | ||
| 1200 | dm_put_device(ti, cc->dev); | ||
| 1201 | bad_device: | ||
| 1202 | bioset_free(cc->bs); | ||
| 1203 | bad_bs: | ||
| 1204 | mempool_destroy(cc->page_pool); | ||
| 1205 | bad_page_pool: | ||
| 1206 | mempool_destroy(cc->req_pool); | ||
| 1207 | bad_req_pool: | ||
| 1208 | mempool_destroy(cc->io_pool); | ||
| 1209 | bad_slab_pool: | ||
| 1210 | if (cc->iv_gen_ops && cc->iv_gen_ops->dtr) | ||
| 1211 | cc->iv_gen_ops->dtr(cc); | ||
| 1212 | bad_ivmode: | ||
| 1213 | crypto_free_ablkcipher(tfm); | ||
| 1214 | bad_cipher: | ||
| 1215 | /* Must zero key material before freeing */ | ||
| 1216 | kzfree(cc); | ||
| 1217 | return -EINVAL; | ||
| 1218 | } | ||
| 1219 | |||
| 1220 | static void crypt_dtr(struct dm_target *ti) | ||
| 1221 | { | ||
| 1222 | struct crypt_config *cc = (struct crypt_config *) ti->private; | ||
| 1223 | |||
| 1224 | destroy_workqueue(cc->io_queue); | ||
| 1225 | destroy_workqueue(cc->crypt_queue); | ||
| 1226 | |||
| 1227 | if (cc->req) | ||
| 1228 | mempool_free(cc->req, cc->req_pool); | ||
| 1229 | |||
| 1230 | bioset_free(cc->bs); | ||
| 1231 | mempool_destroy(cc->page_pool); | ||
| 1232 | mempool_destroy(cc->req_pool); | ||
| 1233 | mempool_destroy(cc->io_pool); | ||
| 1234 | |||
| 1235 | kfree(cc->iv_mode); | ||
| 1236 | if (cc->iv_gen_ops && cc->iv_gen_ops->dtr) | ||
| 1237 | cc->iv_gen_ops->dtr(cc); | ||
| 1238 | crypto_free_ablkcipher(cc->tfm); | ||
| 1239 | dm_put_device(ti, cc->dev); | ||
| 1240 | |||
| 1241 | /* Must zero key material before freeing */ | ||
| 1242 | kzfree(cc); | ||
| 1243 | } | 1249 | } |
| 1244 | 1250 | ||
| 1245 | static int crypt_map(struct dm_target *ti, struct bio *bio, | 1251 | static int crypt_map(struct dm_target *ti, struct bio *bio, |
