merge in jb-release history after reset to jb-dev
diff --git a/Android.mk b/Android.mk
index e4256ae..b7a4905 100644
--- a/Android.mk
+++ b/Android.mk
@@ -40,6 +40,8 @@
LOCAL_SHARED_LIBRARIES := $(common_shared_libraries)
+LOCAL_STATIC_LIBRARIES := libfs_mgr
+
LOCAL_MODULE_TAGS := eng tests
include $(BUILD_STATIC_LIBRARY)
@@ -58,6 +60,8 @@
LOCAL_SHARED_LIBRARIES := $(common_shared_libraries)
+LOCAL_STATIC_LIBRARIES := libfs_mgr
+
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
diff --git a/cryptfs.c b/cryptfs.c
index 5bd6de7..cc7797a 100644
--- a/cryptfs.c
+++ b/cryptfs.c
@@ -38,6 +38,7 @@
#include <cutils/android_reboot.h>
#include <ext4.h>
#include <linux/kdev_t.h>
+#include <fs_mgr.h>
#include "cryptfs.h"
#define LOG_TAG "Cryptfs"
#include "cutils/android_reboot.h"
@@ -53,7 +54,6 @@
#define KEY_LEN_BYTES 16
#define IV_LEN_BYTES 16
-#define KEY_LOC_PROP "ro.crypto.keyfile.userdata"
#define KEY_IN_FOOTER "footer"
#define EXT4_FS 1
@@ -65,6 +65,8 @@
static char *saved_data_blkdev;
static char *saved_mount_point;
static int master_key_saved = 0;
+#define FSTAB_PREFIX "/fstab."
+static char fstab_filename[PROPERTY_VALUE_MAX + sizeof(FSTAB_PREFIX)];
static void ioctl_init(struct dm_ioctl *io, size_t dataSize, const char *name, unsigned flags)
{
@@ -122,6 +124,19 @@
return nr_sec;
}
+/* Get and cache the name of the fstab file so we don't
+ * keep talking over the socket to the property service.
+ */
+static char *get_fstab_filename(void)
+{
+ if (fstab_filename[0] == 0) {
+ strcpy(fstab_filename, FSTAB_PREFIX);
+ property_get("ro.hardware", fstab_filename + sizeof(FSTAB_PREFIX) - 1, "");
+ }
+
+ return fstab_filename;
+}
+
/* key or salt can be NULL, in which case just skip writing that value. Useful to
* update the failed mount count but not change the key.
*/
@@ -136,7 +151,7 @@
char key_loc[PROPERTY_VALUE_MAX];
struct stat statbuf;
- property_get(KEY_LOC_PROP, key_loc, KEY_IN_FOOTER);
+ fs_mgr_get_crypt_info(get_fstab_filename(), key_loc, 0, sizeof(key_loc));
if (!strcmp(key_loc, KEY_IN_FOOTER)) {
fname = real_blk_name;
@@ -167,7 +182,7 @@
return -1;
}
} else {
- SLOGE("Unexpected value for" KEY_LOC_PROP "\n");
+ SLOGE("Unexpected value for crypto key location\n");
return -1;;
}
@@ -235,7 +250,7 @@
char *fname;
struct stat statbuf;
- property_get(KEY_LOC_PROP, key_loc, KEY_IN_FOOTER);
+ fs_mgr_get_crypt_info(get_fstab_filename(), key_loc, 0, sizeof(key_loc));
if (!strcmp(key_loc, KEY_IN_FOOTER)) {
fname = real_blk_name;
@@ -273,7 +288,7 @@
goto errout;
}
} else {
- SLOGE("Unexpected value for" KEY_LOC_PROP "\n");
+ SLOGE("Unexpected value for crypto key location\n");
return -1;;
}
@@ -557,27 +572,6 @@
return encrypt_master_key(passwd, salt, key_buf, master_key);
}
-static int get_orig_mount_parms(char *mount_point, char *fs_type, char *real_blkdev,
- unsigned long *mnt_flags, char *fs_options)
-{
- char mount_point2[PROPERTY_VALUE_MAX];
- char fs_flags[PROPERTY_VALUE_MAX];
-
- property_get("ro.crypto.fs_type", fs_type, "");
- property_get("ro.crypto.fs_real_blkdev", real_blkdev, "");
- property_get("ro.crypto.fs_mnt_point", mount_point2, "");
- property_get("ro.crypto.fs_options", fs_options, "");
- property_get("ro.crypto.fs_flags", fs_flags, "");
- *mnt_flags = strtol(fs_flags, 0, 0);
-
- if (strcmp(mount_point, mount_point2)) {
- /* Consistency check. These should match. If not, something odd happened. */
- return -1;
- }
-
- return 0;
-}
-
static int wait_and_unmount(char *mountpoint)
{
int i, rc;
@@ -692,26 +686,22 @@
return -1;
}
- if (! get_orig_mount_parms(DATA_MNT_POINT, fs_type, real_blkdev, &mnt_flags, fs_options)) {
- SLOGD("Just got orig mount parms\n");
+ if (! (rc = wait_and_unmount(DATA_MNT_POINT)) ) {
+ /* If that succeeded, then mount the decrypted filesystem */
+ fs_mgr_do_mount(get_fstab_filename(), DATA_MNT_POINT, crypto_blkdev, 0);
- if (! (rc = wait_and_unmount(DATA_MNT_POINT)) ) {
- /* If that succeeded, then mount the decrypted filesystem */
- mount(crypto_blkdev, DATA_MNT_POINT, fs_type, mnt_flags, fs_options);
-
- property_set("vold.decrypt", "trigger_load_persist_props");
- /* Create necessary paths on /data */
- if (prep_data_fs()) {
- return -1;
- }
-
- /* startup service classes main and late_start */
- property_set("vold.decrypt", "trigger_restart_framework");
- SLOGD("Just triggered restart_framework\n");
-
- /* Give it a few moments to get started */
- sleep(1);
+ property_set("vold.decrypt", "trigger_load_persist_props");
+ /* Create necessary paths on /data */
+ if (prep_data_fs()) {
+ return -1;
}
+
+ /* startup service classes main and late_start */
+ property_set("vold.decrypt", "trigger_restart_framework");
+ SLOGD("Just triggered restart_framework\n");
+
+ /* Give it a few moments to get started */
+ sleep(1);
}
if (rc == 0) {
@@ -727,9 +717,6 @@
unsigned char encrypted_master_key[32];
unsigned char salt[SALT_LEN];
char real_blkdev[MAXPATHLEN];
- char fs_type[PROPERTY_VALUE_MAX];
- char fs_options[PROPERTY_VALUE_MAX];
- unsigned long mnt_flags;
char encrypted_state[PROPERTY_VALUE_MAX];
char key_loc[PROPERTY_VALUE_MAX];
@@ -739,13 +726,11 @@
return 1;
}
- if (get_orig_mount_parms(mount_point, fs_type, real_blkdev, &mnt_flags, fs_options)) {
- SLOGE("Error reading original mount parms for mount point %s\n", mount_point);
- return -1;
- }
+ fs_mgr_get_crypt_info(get_fstab_filename(), 0, real_blkdev, sizeof(real_blkdev));
if (get_crypt_ftr_and_key(real_blkdev, &crypt_ftr, encrypted_master_key, salt)) {
- property_get(KEY_LOC_PROP, key_loc, KEY_IN_FOOTER);
+ fs_mgr_get_crypt_info(get_fstab_filename(), key_loc, 0, sizeof(key_loc));
+
/*
* Only report this error if key_loc is a file and it exists.
* If the device was never encrypted, and /data is not mountable for
@@ -780,10 +765,7 @@
unsigned char salt[SALT_LEN];
char crypto_blkdev[MAXPATHLEN];
char real_blkdev[MAXPATHLEN];
- char fs_type[PROPERTY_VALUE_MAX];
- char fs_options[PROPERTY_VALUE_MAX];
char tmp_mount_point[64];
- unsigned long mnt_flags;
unsigned int orig_failed_decrypt_count;
char encrypted_state[PROPERTY_VALUE_MAX];
int rc;
@@ -794,10 +776,7 @@
return -1;
}
- if (get_orig_mount_parms(mount_point, fs_type, real_blkdev, &mnt_flags, fs_options)) {
- SLOGE("Error reading original mount parms for mount point %s\n", mount_point);
- return -1;
- }
+ fs_mgr_get_crypt_info(get_fstab_filename(), 0, real_blkdev, sizeof(real_blkdev));
if (get_crypt_ftr_and_key(real_blkdev, &crypt_ftr, encrypted_master_key, salt)) {
SLOGE("Error getting crypt footer and key\n");
@@ -826,7 +805,7 @@
*/
sprintf(tmp_mount_point, "%s/tmp_mnt", mount_point);
mkdir(tmp_mount_point, 0755);
- if ( mount(crypto_blkdev, tmp_mount_point, "ext4", MS_RDONLY, "") ) {
+ if (fs_mgr_do_mount(get_fstab_filename(), DATA_MNT_POINT, crypto_blkdev, tmp_mount_point)) {
SLOGE("Error temp mounting decrypted block device\n");
delete_crypto_blk_dev(label);
crypt_ftr.failed_decrypt_count++;
@@ -938,9 +917,6 @@
unsigned char encrypted_master_key[32], decrypted_master_key[32];
unsigned char salt[SALT_LEN];
char real_blkdev[MAXPATHLEN];
- char fs_type[PROPERTY_VALUE_MAX];
- char fs_options[PROPERTY_VALUE_MAX];
- unsigned long mnt_flags;
char encrypted_state[PROPERTY_VALUE_MAX];
int rc;
@@ -960,10 +936,7 @@
return -1;
}
- if (get_orig_mount_parms(saved_mount_point, fs_type, real_blkdev, &mnt_flags, fs_options)) {
- SLOGE("Error reading original mount parms for mount point %s\n", saved_mount_point);
- return -1;
- }
+ fs_mgr_get_crypt_info(get_fstab_filename(), 0, real_blkdev, sizeof(real_blkdev));
if (get_crypt_ftr_and_key(real_blkdev, &crypt_ftr, encrypted_master_key, salt)) {
SLOGE("Error getting crypt footer and key\n");
@@ -1143,9 +1116,7 @@
{
int how = 0;
char crypto_blkdev[MAXPATHLEN], real_blkdev[MAXPATHLEN], sd_crypto_blkdev[MAXPATHLEN];
- char fs_type[PROPERTY_VALUE_MAX], fs_options[PROPERTY_VALUE_MAX],
- mount_point[PROPERTY_VALUE_MAX];
- unsigned long mnt_flags, nr_sec;
+ unsigned long nr_sec;
unsigned char master_key[KEY_LEN_BYTES], decrypted_master_key[KEY_LEN_BYTES];
unsigned char salt[SALT_LEN];
int rc=-1, fd, i, ret;
@@ -1167,7 +1138,7 @@
goto error_unencrypted;
}
- property_get(KEY_LOC_PROP, key_loc, KEY_IN_FOOTER);
+ fs_mgr_get_crypt_info(get_fstab_filename(), key_loc, 0, sizeof(key_loc));
if (!strcmp(howarg, "wipe")) {
how = CRYPTO_ENABLE_WIPE;
@@ -1178,7 +1149,7 @@
goto error_unencrypted;
}
- get_orig_mount_parms(mount_point, fs_type, real_blkdev, &mnt_flags, fs_options);
+ fs_mgr_get_crypt_info(get_fstab_filename(), 0, real_blkdev, sizeof(real_blkdev));
/* Get the size of the real block device */
fd = open(real_blkdev, O_RDONLY);
@@ -1267,9 +1238,7 @@
* /data, set a property saying we're doing inplace encryption,
* and restart the framework.
*/
- property_get("ro.crypto.tmpfs_options", tmpfs_options, "");
- if (mount("tmpfs", DATA_MNT_POINT, "tmpfs", MS_NOATIME | MS_NOSUID | MS_NODEV,
- tmpfs_options) < 0) {
+ if (fs_mgr_do_tmpfs_mount(DATA_MNT_POINT)) {
goto error_shutting_down;
}
/* Tells the framework that inplace encryption is starting */
@@ -1456,7 +1425,7 @@
return -1;
}
- property_get("ro.crypto.fs_real_blkdev", real_blkdev, "");
+ fs_mgr_get_crypt_info(get_fstab_filename(), 0, real_blkdev, sizeof(real_blkdev));
if (strlen(real_blkdev) == 0) {
SLOGE("Can't find real blkdev");
return -1;