1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) 2017 Google, Inc.
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #include <linux/blk-crypto.h>
7*4882a593Smuzhiyun #include <linux/device-mapper.h>
8*4882a593Smuzhiyun #include <linux/module.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #define DM_MSG_PREFIX "default-key"
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #define DM_DEFAULT_KEY_MAX_WRAPPED_KEY_SIZE 128
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun static const struct dm_default_key_cipher {
15*4882a593Smuzhiyun const char *name;
16*4882a593Smuzhiyun enum blk_crypto_mode_num mode_num;
17*4882a593Smuzhiyun int key_size;
18*4882a593Smuzhiyun } dm_default_key_ciphers[] = {
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun .name = "aes-xts-plain64",
21*4882a593Smuzhiyun .mode_num = BLK_ENCRYPTION_MODE_AES_256_XTS,
22*4882a593Smuzhiyun .key_size = 64,
23*4882a593Smuzhiyun }, {
24*4882a593Smuzhiyun .name = "xchacha12,aes-adiantum-plain64",
25*4882a593Smuzhiyun .mode_num = BLK_ENCRYPTION_MODE_ADIANTUM,
26*4882a593Smuzhiyun .key_size = 32,
27*4882a593Smuzhiyun },
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun /**
31*4882a593Smuzhiyun * struct dm_default_c - private data of a default-key target
32*4882a593Smuzhiyun * @dev: the underlying device
33*4882a593Smuzhiyun * @start: starting sector of the range of @dev which this target actually maps.
34*4882a593Smuzhiyun * For this purpose a "sector" is 512 bytes.
35*4882a593Smuzhiyun * @cipher_string: the name of the encryption algorithm being used
36*4882a593Smuzhiyun * @iv_offset: starting offset for IVs. IVs are generated as if the target were
37*4882a593Smuzhiyun * preceded by @iv_offset 512-byte sectors.
38*4882a593Smuzhiyun * @sector_size: crypto sector size in bytes (usually 4096)
39*4882a593Smuzhiyun * @sector_bits: log2(sector_size)
40*4882a593Smuzhiyun * @key: the encryption key to use
41*4882a593Smuzhiyun * @max_dun: the maximum DUN that may be used (computed from other params)
42*4882a593Smuzhiyun */
43*4882a593Smuzhiyun struct default_key_c {
44*4882a593Smuzhiyun struct dm_dev *dev;
45*4882a593Smuzhiyun sector_t start;
46*4882a593Smuzhiyun const char *cipher_string;
47*4882a593Smuzhiyun u64 iv_offset;
48*4882a593Smuzhiyun unsigned int sector_size;
49*4882a593Smuzhiyun unsigned int sector_bits;
50*4882a593Smuzhiyun struct blk_crypto_key key;
51*4882a593Smuzhiyun bool is_hw_wrapped;
52*4882a593Smuzhiyun u64 max_dun;
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun static const struct dm_default_key_cipher *
lookup_cipher(const char * cipher_string)56*4882a593Smuzhiyun lookup_cipher(const char *cipher_string)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun int i;
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun for (i = 0; i < ARRAY_SIZE(dm_default_key_ciphers); i++) {
61*4882a593Smuzhiyun if (strcmp(cipher_string, dm_default_key_ciphers[i].name) == 0)
62*4882a593Smuzhiyun return &dm_default_key_ciphers[i];
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun return NULL;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
default_key_dtr(struct dm_target * ti)67*4882a593Smuzhiyun static void default_key_dtr(struct dm_target *ti)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun struct default_key_c *dkc = ti->private;
70*4882a593Smuzhiyun int err;
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun if (dkc->dev) {
73*4882a593Smuzhiyun err = blk_crypto_evict_key(bdev_get_queue(dkc->dev->bdev),
74*4882a593Smuzhiyun &dkc->key);
75*4882a593Smuzhiyun if (err && err != -ENOKEY)
76*4882a593Smuzhiyun DMWARN("Failed to evict crypto key: %d", err);
77*4882a593Smuzhiyun dm_put_device(ti, dkc->dev);
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun kfree_sensitive(dkc->cipher_string);
80*4882a593Smuzhiyun kfree_sensitive(dkc);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
default_key_ctr_optional(struct dm_target * ti,unsigned int argc,char ** argv)83*4882a593Smuzhiyun static int default_key_ctr_optional(struct dm_target *ti,
84*4882a593Smuzhiyun unsigned int argc, char **argv)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun struct default_key_c *dkc = ti->private;
87*4882a593Smuzhiyun struct dm_arg_set as;
88*4882a593Smuzhiyun static const struct dm_arg _args[] = {
89*4882a593Smuzhiyun {0, 4, "Invalid number of feature args"},
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun unsigned int opt_params;
92*4882a593Smuzhiyun const char *opt_string;
93*4882a593Smuzhiyun bool iv_large_sectors = false;
94*4882a593Smuzhiyun char dummy;
95*4882a593Smuzhiyun int err;
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun as.argc = argc;
98*4882a593Smuzhiyun as.argv = argv;
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun err = dm_read_arg_group(_args, &as, &opt_params, &ti->error);
101*4882a593Smuzhiyun if (err)
102*4882a593Smuzhiyun return err;
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun while (opt_params--) {
105*4882a593Smuzhiyun opt_string = dm_shift_arg(&as);
106*4882a593Smuzhiyun if (!opt_string) {
107*4882a593Smuzhiyun ti->error = "Not enough feature arguments";
108*4882a593Smuzhiyun return -EINVAL;
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun if (!strcmp(opt_string, "allow_discards")) {
111*4882a593Smuzhiyun ti->num_discard_bios = 1;
112*4882a593Smuzhiyun } else if (sscanf(opt_string, "sector_size:%u%c",
113*4882a593Smuzhiyun &dkc->sector_size, &dummy) == 1) {
114*4882a593Smuzhiyun if (dkc->sector_size < SECTOR_SIZE ||
115*4882a593Smuzhiyun dkc->sector_size > 4096 ||
116*4882a593Smuzhiyun !is_power_of_2(dkc->sector_size)) {
117*4882a593Smuzhiyun ti->error = "Invalid sector_size";
118*4882a593Smuzhiyun return -EINVAL;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun } else if (!strcmp(opt_string, "iv_large_sectors")) {
121*4882a593Smuzhiyun iv_large_sectors = true;
122*4882a593Smuzhiyun } else if (!strcmp(opt_string, "wrappedkey_v0")) {
123*4882a593Smuzhiyun dkc->is_hw_wrapped = true;
124*4882a593Smuzhiyun } else {
125*4882a593Smuzhiyun ti->error = "Invalid feature arguments";
126*4882a593Smuzhiyun return -EINVAL;
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun /* dm-default-key doesn't implement iv_large_sectors=false. */
131*4882a593Smuzhiyun if (dkc->sector_size != SECTOR_SIZE && !iv_large_sectors) {
132*4882a593Smuzhiyun ti->error = "iv_large_sectors must be specified";
133*4882a593Smuzhiyun return -EINVAL;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun return 0;
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /*
140*4882a593Smuzhiyun * Construct a default-key mapping:
141*4882a593Smuzhiyun * <cipher> <key> <iv_offset> <dev_path> <start>
142*4882a593Smuzhiyun *
143*4882a593Smuzhiyun * This syntax matches dm-crypt's, but lots of unneeded functionality has been
144*4882a593Smuzhiyun * removed. Also, dm-default-key requires that the "iv_large_sectors" option be
145*4882a593Smuzhiyun * given whenever a non-default sector size is used.
146*4882a593Smuzhiyun */
default_key_ctr(struct dm_target * ti,unsigned int argc,char ** argv)147*4882a593Smuzhiyun static int default_key_ctr(struct dm_target *ti, unsigned int argc, char **argv)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun struct default_key_c *dkc;
150*4882a593Smuzhiyun const struct dm_default_key_cipher *cipher;
151*4882a593Smuzhiyun u8 raw_key[DM_DEFAULT_KEY_MAX_WRAPPED_KEY_SIZE];
152*4882a593Smuzhiyun unsigned int raw_key_size;
153*4882a593Smuzhiyun unsigned int dun_bytes;
154*4882a593Smuzhiyun unsigned long long tmpll;
155*4882a593Smuzhiyun char dummy;
156*4882a593Smuzhiyun int err;
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun if (argc < 5) {
159*4882a593Smuzhiyun ti->error = "Not enough arguments";
160*4882a593Smuzhiyun return -EINVAL;
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun dkc = kzalloc(sizeof(*dkc), GFP_KERNEL);
164*4882a593Smuzhiyun if (!dkc) {
165*4882a593Smuzhiyun ti->error = "Out of memory";
166*4882a593Smuzhiyun return -ENOMEM;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun ti->private = dkc;
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun /* <cipher> */
171*4882a593Smuzhiyun dkc->cipher_string = kstrdup(argv[0], GFP_KERNEL);
172*4882a593Smuzhiyun if (!dkc->cipher_string) {
173*4882a593Smuzhiyun ti->error = "Out of memory";
174*4882a593Smuzhiyun err = -ENOMEM;
175*4882a593Smuzhiyun goto bad;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun cipher = lookup_cipher(dkc->cipher_string);
178*4882a593Smuzhiyun if (!cipher) {
179*4882a593Smuzhiyun ti->error = "Unsupported cipher";
180*4882a593Smuzhiyun err = -EINVAL;
181*4882a593Smuzhiyun goto bad;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun /* <key> */
185*4882a593Smuzhiyun raw_key_size = strlen(argv[1]);
186*4882a593Smuzhiyun if (raw_key_size > 2 * DM_DEFAULT_KEY_MAX_WRAPPED_KEY_SIZE ||
187*4882a593Smuzhiyun raw_key_size % 2) {
188*4882a593Smuzhiyun ti->error = "Invalid keysize";
189*4882a593Smuzhiyun err = -EINVAL;
190*4882a593Smuzhiyun goto bad;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun raw_key_size /= 2;
193*4882a593Smuzhiyun if (hex2bin(raw_key, argv[1], raw_key_size) != 0) {
194*4882a593Smuzhiyun ti->error = "Malformed key string";
195*4882a593Smuzhiyun err = -EINVAL;
196*4882a593Smuzhiyun goto bad;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /* <iv_offset> */
200*4882a593Smuzhiyun if (sscanf(argv[2], "%llu%c", &dkc->iv_offset, &dummy) != 1) {
201*4882a593Smuzhiyun ti->error = "Invalid iv_offset sector";
202*4882a593Smuzhiyun err = -EINVAL;
203*4882a593Smuzhiyun goto bad;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun /* <dev_path> */
207*4882a593Smuzhiyun err = dm_get_device(ti, argv[3], dm_table_get_mode(ti->table),
208*4882a593Smuzhiyun &dkc->dev);
209*4882a593Smuzhiyun if (err) {
210*4882a593Smuzhiyun ti->error = "Device lookup failed";
211*4882a593Smuzhiyun goto bad;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun /* <start> */
215*4882a593Smuzhiyun if (sscanf(argv[4], "%llu%c", &tmpll, &dummy) != 1 ||
216*4882a593Smuzhiyun tmpll != (sector_t)tmpll) {
217*4882a593Smuzhiyun ti->error = "Invalid start sector";
218*4882a593Smuzhiyun err = -EINVAL;
219*4882a593Smuzhiyun goto bad;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun dkc->start = tmpll;
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun /* optional arguments */
224*4882a593Smuzhiyun dkc->sector_size = SECTOR_SIZE;
225*4882a593Smuzhiyun if (argc > 5) {
226*4882a593Smuzhiyun err = default_key_ctr_optional(ti, argc - 5, &argv[5]);
227*4882a593Smuzhiyun if (err)
228*4882a593Smuzhiyun goto bad;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun dkc->sector_bits = ilog2(dkc->sector_size);
231*4882a593Smuzhiyun if (ti->len & ((dkc->sector_size >> SECTOR_SHIFT) - 1)) {
232*4882a593Smuzhiyun ti->error = "Device size is not a multiple of sector_size";
233*4882a593Smuzhiyun err = -EINVAL;
234*4882a593Smuzhiyun goto bad;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun dkc->max_dun = (dkc->iv_offset + ti->len - 1) >>
238*4882a593Smuzhiyun (dkc->sector_bits - SECTOR_SHIFT);
239*4882a593Smuzhiyun dun_bytes = DIV_ROUND_UP(fls64(dkc->max_dun), 8);
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun err = blk_crypto_init_key(&dkc->key, raw_key, raw_key_size,
242*4882a593Smuzhiyun dkc->is_hw_wrapped, cipher->mode_num,
243*4882a593Smuzhiyun dun_bytes, dkc->sector_size);
244*4882a593Smuzhiyun if (err) {
245*4882a593Smuzhiyun ti->error = "Error initializing blk-crypto key";
246*4882a593Smuzhiyun goto bad;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun err = blk_crypto_start_using_key(&dkc->key,
250*4882a593Smuzhiyun bdev_get_queue(dkc->dev->bdev));
251*4882a593Smuzhiyun if (err) {
252*4882a593Smuzhiyun ti->error = "Error starting to use blk-crypto";
253*4882a593Smuzhiyun goto bad;
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun ti->num_flush_bios = 1;
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun err = 0;
259*4882a593Smuzhiyun goto out;
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun bad:
262*4882a593Smuzhiyun default_key_dtr(ti);
263*4882a593Smuzhiyun out:
264*4882a593Smuzhiyun memzero_explicit(raw_key, sizeof(raw_key));
265*4882a593Smuzhiyun return err;
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun
default_key_map(struct dm_target * ti,struct bio * bio)268*4882a593Smuzhiyun static int default_key_map(struct dm_target *ti, struct bio *bio)
269*4882a593Smuzhiyun {
270*4882a593Smuzhiyun const struct default_key_c *dkc = ti->private;
271*4882a593Smuzhiyun sector_t sector_in_target;
272*4882a593Smuzhiyun u64 dun[BLK_CRYPTO_DUN_ARRAY_SIZE] = { 0 };
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun bio_set_dev(bio, dkc->dev->bdev);
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun /*
277*4882a593Smuzhiyun * If the bio is a device-level request which doesn't target a specific
278*4882a593Smuzhiyun * sector, there's nothing more to do.
279*4882a593Smuzhiyun */
280*4882a593Smuzhiyun if (bio_sectors(bio) == 0)
281*4882a593Smuzhiyun return DM_MAPIO_REMAPPED;
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun /* Map the bio's sector to the underlying device. (512-byte sectors) */
284*4882a593Smuzhiyun sector_in_target = dm_target_offset(ti, bio->bi_iter.bi_sector);
285*4882a593Smuzhiyun bio->bi_iter.bi_sector = dkc->start + sector_in_target;
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun /*
288*4882a593Smuzhiyun * If the bio should skip dm-default-key (i.e. if it's for an encrypted
289*4882a593Smuzhiyun * file's contents), or if it doesn't have any data (e.g. if it's a
290*4882a593Smuzhiyun * DISCARD request), there's nothing more to do.
291*4882a593Smuzhiyun */
292*4882a593Smuzhiyun if (bio_should_skip_dm_default_key(bio) || !bio_has_data(bio))
293*4882a593Smuzhiyun return DM_MAPIO_REMAPPED;
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun /*
296*4882a593Smuzhiyun * Else, dm-default-key needs to set this bio's encryption context.
297*4882a593Smuzhiyun * It must not already have one.
298*4882a593Smuzhiyun */
299*4882a593Smuzhiyun if (WARN_ON_ONCE(bio_has_crypt_ctx(bio)))
300*4882a593Smuzhiyun return DM_MAPIO_KILL;
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun /* Calculate the DUN and enforce data-unit (crypto sector) alignment. */
303*4882a593Smuzhiyun dun[0] = dkc->iv_offset + sector_in_target; /* 512-byte sectors */
304*4882a593Smuzhiyun if (dun[0] & ((dkc->sector_size >> SECTOR_SHIFT) - 1))
305*4882a593Smuzhiyun return DM_MAPIO_KILL;
306*4882a593Smuzhiyun dun[0] >>= dkc->sector_bits - SECTOR_SHIFT; /* crypto sectors */
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun /*
309*4882a593Smuzhiyun * This check isn't necessary as we should have calculated max_dun
310*4882a593Smuzhiyun * correctly, but be safe.
311*4882a593Smuzhiyun */
312*4882a593Smuzhiyun if (WARN_ON_ONCE(dun[0] > dkc->max_dun))
313*4882a593Smuzhiyun return DM_MAPIO_KILL;
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun bio_crypt_set_ctx(bio, &dkc->key, dun, GFP_NOIO);
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun return DM_MAPIO_REMAPPED;
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun
default_key_status(struct dm_target * ti,status_type_t type,unsigned int status_flags,char * result,unsigned int maxlen)320*4882a593Smuzhiyun static void default_key_status(struct dm_target *ti, status_type_t type,
321*4882a593Smuzhiyun unsigned int status_flags, char *result,
322*4882a593Smuzhiyun unsigned int maxlen)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun const struct default_key_c *dkc = ti->private;
325*4882a593Smuzhiyun unsigned int sz = 0;
326*4882a593Smuzhiyun int num_feature_args = 0;
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun switch (type) {
329*4882a593Smuzhiyun case STATUSTYPE_INFO:
330*4882a593Smuzhiyun result[0] = '\0';
331*4882a593Smuzhiyun break;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun case STATUSTYPE_TABLE:
334*4882a593Smuzhiyun /* Omit the key for now. */
335*4882a593Smuzhiyun DMEMIT("%s - %llu %s %llu", dkc->cipher_string, dkc->iv_offset,
336*4882a593Smuzhiyun dkc->dev->name, (unsigned long long)dkc->start);
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun num_feature_args += !!ti->num_discard_bios;
339*4882a593Smuzhiyun if (dkc->sector_size != SECTOR_SIZE)
340*4882a593Smuzhiyun num_feature_args += 2;
341*4882a593Smuzhiyun if (dkc->is_hw_wrapped)
342*4882a593Smuzhiyun num_feature_args += 1;
343*4882a593Smuzhiyun if (num_feature_args != 0) {
344*4882a593Smuzhiyun DMEMIT(" %d", num_feature_args);
345*4882a593Smuzhiyun if (ti->num_discard_bios)
346*4882a593Smuzhiyun DMEMIT(" allow_discards");
347*4882a593Smuzhiyun if (dkc->sector_size != SECTOR_SIZE) {
348*4882a593Smuzhiyun DMEMIT(" sector_size:%u", dkc->sector_size);
349*4882a593Smuzhiyun DMEMIT(" iv_large_sectors");
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun if (dkc->is_hw_wrapped)
352*4882a593Smuzhiyun DMEMIT(" wrappedkey_v0");
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun break;
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun }
357*4882a593Smuzhiyun
default_key_prepare_ioctl(struct dm_target * ti,struct block_device ** bdev)358*4882a593Smuzhiyun static int default_key_prepare_ioctl(struct dm_target *ti,
359*4882a593Smuzhiyun struct block_device **bdev)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun const struct default_key_c *dkc = ti->private;
362*4882a593Smuzhiyun const struct dm_dev *dev = dkc->dev;
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun *bdev = dev->bdev;
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun /* Only pass ioctls through if the device sizes match exactly. */
367*4882a593Smuzhiyun if (dkc->start != 0 ||
368*4882a593Smuzhiyun ti->len != i_size_read(dev->bdev->bd_inode) >> SECTOR_SHIFT)
369*4882a593Smuzhiyun return 1;
370*4882a593Smuzhiyun return 0;
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun
default_key_iterate_devices(struct dm_target * ti,iterate_devices_callout_fn fn,void * data)373*4882a593Smuzhiyun static int default_key_iterate_devices(struct dm_target *ti,
374*4882a593Smuzhiyun iterate_devices_callout_fn fn,
375*4882a593Smuzhiyun void *data)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun const struct default_key_c *dkc = ti->private;
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun return fn(ti, dkc->dev, dkc->start, ti->len, data);
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun
default_key_io_hints(struct dm_target * ti,struct queue_limits * limits)382*4882a593Smuzhiyun static void default_key_io_hints(struct dm_target *ti,
383*4882a593Smuzhiyun struct queue_limits *limits)
384*4882a593Smuzhiyun {
385*4882a593Smuzhiyun const struct default_key_c *dkc = ti->private;
386*4882a593Smuzhiyun const unsigned int sector_size = dkc->sector_size;
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun limits->logical_block_size =
389*4882a593Smuzhiyun max_t(unsigned int, limits->logical_block_size, sector_size);
390*4882a593Smuzhiyun limits->physical_block_size =
391*4882a593Smuzhiyun max_t(unsigned int, limits->physical_block_size, sector_size);
392*4882a593Smuzhiyun limits->io_min = max_t(unsigned int, limits->io_min, sector_size);
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun static struct target_type default_key_target = {
396*4882a593Smuzhiyun .name = "default-key",
397*4882a593Smuzhiyun .version = {2, 1, 0},
398*4882a593Smuzhiyun .features = DM_TARGET_PASSES_CRYPTO,
399*4882a593Smuzhiyun .module = THIS_MODULE,
400*4882a593Smuzhiyun .ctr = default_key_ctr,
401*4882a593Smuzhiyun .dtr = default_key_dtr,
402*4882a593Smuzhiyun .map = default_key_map,
403*4882a593Smuzhiyun .status = default_key_status,
404*4882a593Smuzhiyun .prepare_ioctl = default_key_prepare_ioctl,
405*4882a593Smuzhiyun .iterate_devices = default_key_iterate_devices,
406*4882a593Smuzhiyun .io_hints = default_key_io_hints,
407*4882a593Smuzhiyun };
408*4882a593Smuzhiyun
dm_default_key_init(void)409*4882a593Smuzhiyun static int __init dm_default_key_init(void)
410*4882a593Smuzhiyun {
411*4882a593Smuzhiyun return dm_register_target(&default_key_target);
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun
dm_default_key_exit(void)414*4882a593Smuzhiyun static void __exit dm_default_key_exit(void)
415*4882a593Smuzhiyun {
416*4882a593Smuzhiyun dm_unregister_target(&default_key_target);
417*4882a593Smuzhiyun }
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun module_init(dm_default_key_init);
420*4882a593Smuzhiyun module_exit(dm_default_key_exit);
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun MODULE_AUTHOR("Paul Lawrence <paullawrence@google.com>");
423*4882a593Smuzhiyun MODULE_AUTHOR("Paul Crowley <paulcrowley@google.com>");
424*4882a593Smuzhiyun MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
425*4882a593Smuzhiyun MODULE_DESCRIPTION(DM_NAME " target for encrypting filesystem metadata");
426*4882a593Smuzhiyun MODULE_LICENSE("GPL");
427