ANDROID: dm: rename dm-linear methods for dm-android-verity
[firefly-linux-kernel-4.4.55.git] / drivers / md / dm-android-verity.h
1 /*
2  * Copyright (C) 2015 Google, Inc.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  */
14
15 #ifndef DM_ANDROID_VERITY_H
16 #define DM_ANDROID_VERITY_H
17
18 #include <crypto/sha.h>
19
20 #define RSANUMBYTES 256
21 #define VERITY_METADATA_MAGIC_NUMBER 0xb001b001
22 #define VERITY_METADATA_MAGIC_DISABLE 0x46464f56
23 #define VERITY_METADATA_VERSION 0
24 #define VERITY_STATE_DISABLE 1
25 #define DATA_BLOCK_SIZE (4 * 1024)
26 #define VERITY_METADATA_SIZE (8 * DATA_BLOCK_SIZE)
27 #define VERITY_TABLE_ARGS 10
28 #define VERITY_COMMANDLINE_PARAM_LENGTH 20
29
30 #define FEC_MAGIC 0xFECFECFE
31 #define FEC_BLOCK_SIZE (4 * 1024)
32 #define FEC_VERSION 0
33 #define FEC_RSM 255
34 #define FEC_ARG_LENGTH 300
35
36 #define VERITY_TABLE_OPT_RESTART "restart_on_corruption"
37 #define VERITY_TABLE_OPT_LOGGING "ignore_corruption"
38 #define VERITY_TABLE_OPT_IGNZERO "ignore_zero_blocks"
39
40 #define VERITY_TABLE_OPT_FEC_FORMAT \
41         "use_fec_from_device %s fec_start %llu fec_blocks %llu fec_roots %u ignore_zero_blocks"
42 #define VERITY_TABLE_OPT_FEC_ARGS 9
43
44 #define VERITY_DEBUG 0
45
46 #define DM_MSG_PREFIX                   "android-verity"
47
48 #define DM_LINEAR_ARGS 2
49 #define DM_LINEAR_TARGET_OFFSET "0"
50
51 /*
52  * There can be two formats.
53  * if fec is present
54  * <data_blocks> <verity_tree> <verity_metdata_32K><fec_data><fec_data_4K>
55  * if fec is not present
56  * <data_blocks> <verity_tree> <verity_metdata_32K>
57  */
58 /* TODO: rearrange structure to reduce memory holes
59  * depends on userspace change.
60  */
61 struct fec_header {
62         __le32 magic;
63         __le32 version;
64         __le32 size;
65         __le32 roots;
66         __le32 fec_size;
67         __le64 inp_size;
68         u8 hash[SHA256_DIGEST_SIZE];
69 };
70
71 struct android_metadata_header {
72         __le32 magic_number;
73         __le32 protocol_version;
74         char signature[RSANUMBYTES];
75         __le32 table_length;
76 };
77
78 struct android_metadata {
79         struct android_metadata_header *header;
80         char *verity_table;
81 };
82
83 struct fec_ecc_metadata {
84         bool valid;
85         u32 roots;
86         u64 blocks;
87         u64 rounds;
88         u64 start;
89 };
90
91 struct bio_read {
92         struct page **page_io;
93         int number_of_pages;
94 };
95
96 extern struct target_type linear_target;
97
98 extern void dm_linear_dtr(struct dm_target *ti);
99 extern int dm_linear_map(struct dm_target *ti, struct bio *bio);
100 extern void dm_linear_status(struct dm_target *ti, status_type_t type,
101                         unsigned status_flags, char *result, unsigned maxlen);
102 extern int dm_linear_ioctl(struct dm_target *ti, unsigned int cmd,
103                 unsigned long arg);
104 extern int dm_linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm,
105                 struct bio_vec *biovec, int max_size);
106 extern int dm_linear_iterate_devices(struct dm_target *ti,
107                         iterate_devices_callout_fn fn, void *data);
108 extern int dm_linear_ctr(struct dm_target *ti, unsigned int argc, char **argv);
109 #endif /* DM_ANDROID_VERITY_H */