summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Rosenberg <drosen@google.com>2016-03-28 20:05:30 -0700
committerDaniel Rosenberg <drosen@google.com>2016-03-29 12:40:03 -0700
commit8221716dae5e9cf4cd9f7b405d42ceedf3ce7d5d (patch)
treee8593a182327104e4414de82aaa933ade70c19ce
parent0d8b97661784707a05259cf88edaf97eaab8eb7a (diff)
parenta5ac5f31346033242041b6b6e79235b9adcb287d (diff)
downloadtegra-8221716dae5e9cf4cd9f7b405d42ceedf3ce7d5d.tar.gz
Merge branch 'android-tegra-3.10' into android-tegra-flounder-3.10
a5ac5f3 sdcardfs: Fix issue with d_child move \ * ddf25a8 sdcardfs: remove unneeded __init and __exit * 94d473d sdcardfs: Remove unused code * 6508d8e ANDROID: dm: Mounting root as linear device when verity disabled * fe8b356 pipe: Fix buffer offset after partially failed read Bug:27794037 Bug:27175947 Change-Id: I8241e9c56ccc245b85aecdae0176d4a45113728b
-rw-r--r--drivers/md/dm-android-verity.c128
-rw-r--r--drivers/md/dm-android-verity.h5
-rw-r--r--drivers/md/dm-linear.c2
-rw-r--r--fs/pipe.c3
-rwxr-xr-xfs/sdcardfs/derived_perm.c2
-rwxr-xr-xfs/sdcardfs/main.c2
-rwxr-xr-xfs/sdcardfs/packagelist.c4
7 files changed, 117 insertions, 29 deletions
diff --git a/drivers/md/dm-android-verity.c b/drivers/md/dm-android-verity.c
index c77c9fa7a962..42639a81ab5d 100644
--- a/drivers/md/dm-android-verity.c
+++ b/drivers/md/dm-android-verity.c
@@ -13,6 +13,7 @@
*/
#include <linux/buffer_head.h>
+#include <linux/debugfs.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/device-mapper.h>
@@ -43,6 +44,25 @@
static char verifiedbootstate[VERITY_COMMANDLINE_PARAM_LENGTH];
static char veritymode[VERITY_COMMANDLINE_PARAM_LENGTH];
+static bool target_added;
+static bool verity_enabled = true;
+struct dentry *debug_dir;
+static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv);
+
+static struct target_type android_verity_target = {
+ .name = "android-verity",
+ .version = {1, 0, 0},
+ .module = THIS_MODULE,
+ .ctr = android_verity_ctr,
+ .dtr = verity_dtr,
+ .map = verity_map,
+ .status = verity_status,
+ .ioctl = verity_ioctl,
+ .merge = verity_merge,
+ .iterate_devices = verity_iterate_devices,
+ .io_hints = verity_io_hints,
+};
+
static int __init verified_boot_state_param(char *line)
{
strlcpy(verifiedbootstate, line, sizeof(verifiedbootstate));
@@ -549,6 +569,32 @@ static inline bool test_mult_overflow(sector_t a, u32 b)
return a > r;
}
+static int add_as_linear_device(struct dm_target *ti, char *dev)
+{
+ /*Move to linear mapping defines*/
+ char *linear_table_args[DM_LINEAR_ARGS] = {dev,
+ DM_LINEAR_TARGET_OFFSET};
+ int err = 0;
+
+ android_verity_target.dtr = linear_target.dtr,
+ android_verity_target.map = linear_target.map,
+ android_verity_target.status = linear_target.status,
+ android_verity_target.ioctl = linear_target.ioctl,
+ android_verity_target.merge = linear_target.merge,
+ android_verity_target.iterate_devices = linear_target.iterate_devices,
+ android_verity_target.io_hints = NULL;
+
+ err = linear_target.ctr(ti, DM_LINEAR_ARGS, linear_table_args);
+
+ if (!err) {
+ DMINFO("Added android-verity as a linear target");
+ target_added = true;
+ } else
+ DMERR("Failed to add android-verity as linear target");
+
+ return err;
+}
+
/*
* Target parameters:
* <key id> Key id of the public key in the system keyring.
@@ -613,21 +659,27 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
if (err == VERITY_STATE_DISABLE) {
DMERR("Mounting root with verity disabled");
- return -EINVAL;
+ verity_enabled = false;
+ /* we would still have to parse the args to figure out
+ * the data blocks size. Or may be could map the entire
+ * partition similar to mounting the device.
+ */
} else if (err) {
DMERR("Verity header handle error");
handle_error();
goto free_metadata;
}
- err = verify_verity_signature(key_id, metadata);
+ if (!verity_enabled) {
+ err = verify_verity_signature(key_id, metadata);
- if (err) {
- DMERR("Signature verification failed");
- handle_error();
- goto free_metadata;
- } else
- DMINFO("Signature verification success");
+ if (err) {
+ DMERR("Signature verification failed");
+ handle_error();
+ goto free_metadata;
+ } else
+ DMINFO("Signature verification success");
+ }
table_ptr = metadata->verity_table;
@@ -683,6 +735,12 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
/* update target length */
ti->len = data_sectors;
+ /* Setup linear target and free */
+ if (!verity_enabled) {
+ err = add_as_linear_device(ti, argv[1]);
+ goto free_metadata;
+ }
+
/*substitute data_dev and hash_dev*/
verity_table_args[1] = argv[1];
verity_table_args[2] = argv[1];
@@ -730,6 +788,13 @@ static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
err = verity_ctr(ti, no_of_args, verity_table_args);
+ if (err)
+ DMERR("android-verity failed to mount as verity target");
+ else {
+ target_added = true;
+ DMINFO("android-verity mounted as verity target");
+ }
+
free_metadata:
kfree(metadata->header);
kfree(metadata->verity_table);
@@ -737,33 +802,52 @@ free_metadata:
return err;
}
-static struct target_type android_verity_target = {
- .name = "android-verity",
- .version = {1, 0, 0},
- .module = THIS_MODULE,
- .ctr = android_verity_ctr,
- .dtr = verity_dtr,
- .map = verity_map,
- .status = verity_status,
- .ioctl = verity_ioctl,
- .merge = verity_merge,
- .iterate_devices = verity_iterate_devices,
- .io_hints = verity_io_hints,
-};
-
static int __init dm_android_verity_init(void)
{
int r;
+ struct dentry *file;
r = dm_register_target(&android_verity_target);
if (r < 0)
DMERR("register failed %d", r);
+ /* Tracks the status of the last added target */
+ debug_dir = debugfs_create_dir("android_verity", NULL);
+
+ if (IS_ERR_OR_NULL(debug_dir)) {
+ DMERR("Cannot create android_verity debugfs directory: %ld",
+ PTR_ERR(debug_dir));
+ goto end;
+ }
+
+ file = debugfs_create_bool("target_added", S_IRUGO, debug_dir,
+ (u32 *)&target_added);
+
+ if (IS_ERR_OR_NULL(file)) {
+ DMERR("Cannot create android_verity debugfs directory: %ld",
+ PTR_ERR(debug_dir));
+ debugfs_remove_recursive(debug_dir);
+ goto end;
+ }
+
+ file = debugfs_create_bool("verity_enabled", S_IRUGO, debug_dir,
+ (u32 *)&verity_enabled);
+
+ if (IS_ERR_OR_NULL(file)) {
+ DMERR("Cannot create android_verity debugfs directory: %ld",
+ PTR_ERR(debug_dir));
+ debugfs_remove_recursive(debug_dir);
+ }
+
+end:
return r;
}
static void __exit dm_android_verity_exit(void)
{
+ if (!IS_ERR_OR_NULL(debug_dir))
+ debugfs_remove_recursive(debug_dir);
+
dm_unregister_target(&android_verity_target);
}
diff --git a/drivers/md/dm-android-verity.h b/drivers/md/dm-android-verity.h
index 11477ffd2243..fe53863c664b 100644
--- a/drivers/md/dm-android-verity.h
+++ b/drivers/md/dm-android-verity.h
@@ -44,6 +44,10 @@
#define VERITY_DEBUG 0
#define DM_MSG_PREFIX "android-verity"
+
+#define DM_LINEAR_ARGS 2
+#define DM_LINEAR_TARGET_OFFSET "0"
+
/*
* There can be two formats.
* if fec is present
@@ -89,4 +93,5 @@ struct bio_read {
int number_of_pages;
};
+extern struct target_type linear_target;
#endif /* DM_ANDROID_VERITY_H */
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c
index 4f99d267340c..800286668eed 100644
--- a/drivers/md/dm-linear.c
+++ b/drivers/md/dm-linear.c
@@ -152,7 +152,7 @@ static int linear_iterate_devices(struct dm_target *ti,
return fn(ti, lc->dev, lc->start, ti->len, data);
}
-static struct target_type linear_target = {
+struct target_type linear_target = {
.name = "linear",
.version = {1, 2, 1},
.module = THIS_MODULE,
diff --git a/fs/pipe.c b/fs/pipe.c
index 14b58f9f26f2..50267e6ba688 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -400,7 +400,8 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov,
const struct pipe_buf_operations *ops = buf->ops;
void *addr;
size_t chars = buf->len, remaining;
- int error, atomic, offset;
+ int error, atomic;
+ int offset;
if (chars > total_len)
chars = total_len;
diff --git a/fs/sdcardfs/derived_perm.c b/fs/sdcardfs/derived_perm.c
index 9de45bc54f0e..128b3e56851f 100755
--- a/fs/sdcardfs/derived_perm.c
+++ b/fs/sdcardfs/derived_perm.c
@@ -111,7 +111,7 @@ void get_derived_permission(struct dentry *parent, struct dentry *dentry)
void get_derive_permissions_recursive(struct dentry *parent) {
struct dentry *dentry;
- list_for_each_entry(dentry, &parent->d_subdirs, d_u.d_child) {
+ list_for_each_entry(dentry, &parent->d_subdirs, d_child) {
if (dentry && dentry->d_inode) {
mutex_lock(&dentry->d_inode->i_mutex);
get_derived_permission(parent, dentry);
diff --git a/fs/sdcardfs/main.c b/fs/sdcardfs/main.c
index fa11a0458b84..a6522286d731 100755
--- a/fs/sdcardfs/main.c
+++ b/fs/sdcardfs/main.c
@@ -54,7 +54,6 @@ static int parse_options(struct super_block *sb, char *options, int silent,
char *p;
substring_t args[MAX_OPT_ARGS];
int option;
- char *string_option;
/* by default, we use AID_MEDIA_RW as uid, gid */
opts->fs_low_uid = AID_MEDIA_RW;
@@ -117,7 +116,6 @@ static int parse_options(struct super_block *sb, char *options, int silent,
break;
/* unknown option */
default:
-invalid_option:
if (!silent) {
printk( KERN_ERR "Unrecognized mount option \"%s\" "
"or missing value", p);
diff --git a/fs/sdcardfs/packagelist.c b/fs/sdcardfs/packagelist.c
index cf1f8027499d..4ca5782b4800 100755
--- a/fs/sdcardfs/packagelist.c
+++ b/fs/sdcardfs/packagelist.c
@@ -395,7 +395,7 @@ static struct configfs_subsystem sdcardfs_packages_subsys = {
},
};
-static int __init configfs_sdcardfs_init(void)
+static int configfs_sdcardfs_init(void)
{
int ret;
struct configfs_subsystem *subsys = &sdcardfs_packages_subsys;
@@ -411,7 +411,7 @@ static int __init configfs_sdcardfs_init(void)
return ret;
}
-static void __exit configfs_sdcardfs_exit(void)
+static void configfs_sdcardfs_exit(void)
{
configfs_unregister_subsystem(&sdcardfs_packages_subsys);
}