ANDROID: dm: mount as linear target if eng build

eng builds dont have verity enabled i.e it does even
have verity metadata appended to the parition. Therefore
add rootdev as linear device and map the entire partition
if build variant is "eng".

(Cherry-picked based on
https://partner-android-review.git.corp.google.com/#/c/618690/)

BUG: 29276559
Signed-off-by: Badhri Jagan Sridharan <Badhri@google.com>
Change-Id: I8f5c2289b842b820ca04f5773525e5449bb3f355
Git-commit: 58bae772a7
Git-repo: https://android.googlesource.com/kernel/common
Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
This commit is contained in:
Badhri Jagan Sridharan 2016-06-17 18:54:35 -07:00 committed by Vikram Mulukutla
parent 6bcdcfa92b
commit 1e19beb791
2 changed files with 59 additions and 4 deletions

View file

@ -44,6 +44,7 @@
static char verifiedbootstate[VERITY_COMMANDLINE_PARAM_LENGTH]; static char verifiedbootstate[VERITY_COMMANDLINE_PARAM_LENGTH];
static char veritymode[VERITY_COMMANDLINE_PARAM_LENGTH]; static char veritymode[VERITY_COMMANDLINE_PARAM_LENGTH];
static char veritykeyid[VERITY_DEFAULT_KEY_ID_LENGTH]; static char veritykeyid[VERITY_DEFAULT_KEY_ID_LENGTH];
static char buildvariant[BUILD_VARIANT];
static bool target_added; static bool target_added;
static bool verity_enabled = true; static bool verity_enabled = true;
@ -88,11 +89,26 @@ static int __init verity_keyid_param(char *line)
__setup("veritykeyid=", verity_keyid_param); __setup("veritykeyid=", verity_keyid_param);
static int __init verity_buildvariant(char *line)
{
strlcpy(buildvariant, line, sizeof(buildvariant));
return 1;
}
__setup("buildvariant=", verity_buildvariant);
static inline bool default_verity_key_id(void) static inline bool default_verity_key_id(void)
{ {
return veritykeyid[0] != '\0'; return veritykeyid[0] != '\0';
} }
static inline bool is_eng(void)
{
static const char typeeng[] = "eng";
return !strncmp(buildvariant, typeeng, sizeof(typeeng));
}
static int table_extract_mpi_array(struct public_key_signature *pks, static int table_extract_mpi_array(struct public_key_signature *pks,
const void *data, size_t len) const void *data, size_t len)
{ {
@ -262,7 +278,7 @@ static int extract_fec_header(dev_t dev, struct fec_header *fec,
bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL); bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL);
if (IS_ERR(bdev)) { if (IS_ERR_OR_NULL(bdev)) {
DMERR("bdev get error"); DMERR("bdev get error");
return PTR_ERR(bdev); return PTR_ERR(bdev);
} }
@ -323,6 +339,24 @@ static void find_metadata_offset(struct fec_header *fec,
*metadata_offset = device_size - VERITY_METADATA_SIZE; *metadata_offset = device_size - VERITY_METADATA_SIZE;
} }
static int find_size(dev_t dev, u64 *device_size)
{
struct block_device *bdev;
bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL);
if (IS_ERR_OR_NULL(bdev)) {
DMERR("blkdev_get_by_dev failed");
return PTR_ERR(bdev);
}
*device_size = i_size_read(bdev->bd_inode);
*device_size >>= SECTOR_SHIFT;
DMINFO("blkdev size in sectors: %llu", *device_size);
blkdev_put(bdev, FMODE_READ);
return 0;
}
static struct android_metadata *extract_metadata(dev_t dev, static struct android_metadata *extract_metadata(dev_t dev,
struct fec_header *fec) struct fec_header *fec)
{ {
@ -337,7 +371,7 @@ static struct android_metadata *extract_metadata(dev_t dev,
bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL); bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL);
if (IS_ERR(bdev)) { if (IS_ERR_OR_NULL(bdev)) {
DMERR("blkdev_get_by_dev failed"); DMERR("blkdev_get_by_dev failed");
return ERR_CAST(bdev); return ERR_CAST(bdev);
} }
@ -632,12 +666,13 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
struct fec_ecc_metadata uninitialized_var(ecc); struct fec_ecc_metadata uninitialized_var(ecc);
char buf[FEC_ARG_LENGTH], *buf_ptr; char buf[FEC_ARG_LENGTH], *buf_ptr;
unsigned long long tmpll; unsigned long long tmpll;
u64 device_size;
if (argc == 1) { if (argc == 1) {
/* Use the default keyid */ /* Use the default keyid */
if (default_verity_key_id()) if (default_verity_key_id())
key_id = veritykeyid; key_id = veritykeyid;
else { else if (!is_eng()) {
DMERR("veritykeyid= is not set"); DMERR("veritykeyid= is not set");
handle_error(); handle_error();
return -EINVAL; return -EINVAL;
@ -650,7 +685,6 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
return -EINVAL; return -EINVAL;
} }
strreplace(key_id, '#', ' ');
target_device = argv[0]; target_device = argv[0];
dev = name_to_dev_t(target_device); dev = name_to_dev_t(target_device);
@ -660,6 +694,26 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
return -EINVAL; return -EINVAL;
} }
if (is_eng()) {
err = find_size(dev, &device_size);
if (err) {
DMERR("error finding bdev size");
handle_error();
return err;
}
ti->len = device_size;
err = add_as_linear_device(ti, target_device);
if (err) {
handle_error();
return err;
}
verity_enabled = false;
return 0;
}
strreplace(key_id, '#', ' ');
DMINFO("key:%s dev:%s", key_id, target_device); DMINFO("key:%s dev:%s", key_id, target_device);
if (extract_fec_header(dev, &fec, &ecc)) { if (extract_fec_header(dev, &fec, &ecc)) {

View file

@ -26,6 +26,7 @@
#define VERITY_METADATA_SIZE (8 * DATA_BLOCK_SIZE) #define VERITY_METADATA_SIZE (8 * DATA_BLOCK_SIZE)
#define VERITY_TABLE_ARGS 10 #define VERITY_TABLE_ARGS 10
#define VERITY_COMMANDLINE_PARAM_LENGTH 20 #define VERITY_COMMANDLINE_PARAM_LENGTH 20
#define BUILD_VARIANT 20
/* /*
* <subject>:<sha1-id> is the format for the identifier. * <subject>:<sha1-id> is the format for the identifier.