From 6ab93841e98bbcb987ea3ef70390ddab392be622 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Fri, 23 Nov 2012 13:46:23 +0100 Subject: [PATCH] TCRYPT: show proper device in status for chained mode --- lib/setup.c | 16 ++++++++++------ lib/tcrypt/tcrypt.c | 23 ++++++++++++++++++----- lib/tcrypt/tcrypt.h | 4 +++- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/lib/setup.c b/lib/setup.c index dec7fcd..82f8a24 100644 --- a/lib/setup.c +++ b/lib/setup.c @@ -755,8 +755,8 @@ static int _init_by_name_crypt(struct crypt_device *cd, const char *name) } } } else if (isTCRYPT(cd->type)) { - r = TCRYPT_init_by_name(cd, name, &dmd, &cd->tcrypt_params, - &cd->tcrypt_hdr); + r = TCRYPT_init_by_name(cd, name, &dmd, &cd->device, + &cd->tcrypt_params, &cd->tcrypt_hdr); } out: crypt_free_volume_key(dmd.u.crypt.vk); @@ -2507,8 +2507,7 @@ int crypt_get_verity_info(struct crypt_device *cd, return 0; } -int crypt_get_active_device(struct crypt_device *cd __attribute__((unused)), - const char *name, +int crypt_get_active_device(struct crypt_device *cd, const char *name, struct crypt_active_device *cad) { struct crypt_dm_active_device dmd; @@ -2521,8 +2520,13 @@ int crypt_get_active_device(struct crypt_device *cd __attribute__((unused)), if (dmd.target != DM_CRYPT && dmd.target != DM_VERITY) return -ENOTSUP; - cad->offset = dmd.u.crypt.offset; - cad->iv_offset = dmd.u.crypt.iv_offset; + if (cd && isTCRYPT(cd->type)) { + cad->offset = TCRYPT_get_data_offset(&cd->tcrypt_hdr); + cad->iv_offset = TCRYPT_get_iv_offset(&cd->tcrypt_hdr); + } else { + cad->offset = dmd.u.crypt.offset; + cad->iv_offset = dmd.u.crypt.iv_offset; + } cad->size = dmd.size; cad->flags = dmd.flags; diff --git a/lib/tcrypt/tcrypt.c b/lib/tcrypt/tcrypt.c index 7d8c6b7..2dfdb88 100644 --- a/lib/tcrypt/tcrypt.c +++ b/lib/tcrypt/tcrypt.c @@ -653,7 +653,8 @@ out: static int status_one(struct crypt_device *cd, const char *name, const char *base_uuid, int index, - size_t *key_size, char *cipher) + size_t *key_size, char *cipher, uint64_t *data_offset, + struct device **device) { struct crypt_dm_active_device dmd = {}; char dm_name[PATH_MAX], *c; @@ -666,7 +667,8 @@ static int status_one(struct crypt_device *cd, const char *name, if (r < 0) return r; - r = dm_query_device(cd, dm_name, DM_ACTIVE_UUID | + r = dm_query_device(cd, dm_name, DM_ACTIVE_DEVICE | + DM_ACTIVE_UUID | DM_ACTIVE_CRYPT_CIPHER | DM_ACTIVE_CRYPT_KEYSIZE, &dmd); if (r > 0) @@ -677,8 +679,13 @@ static int status_one(struct crypt_device *cd, const char *name, strcat(cipher, "-"); strncat(cipher, dmd.u.crypt.cipher, MAX_CIPHER_LEN); *key_size += dmd.u.crypt.vk->keylength; - } else + *data_offset = dmd.u.crypt.offset * SECTOR_SIZE; + device_free(*device); + *device = dmd.data_device; + } else { + device_free(dmd.data_device); r = -ENODEV; + } free(CONST_CAST(void*)dmd.uuid); free(CONST_CAST(void*)dmd.u.crypt.cipher); @@ -688,6 +695,7 @@ static int status_one(struct crypt_device *cd, const char *name, int TCRYPT_init_by_name(struct crypt_device *cd, const char *name, const struct crypt_dm_active_device *dmd, + struct device **device, struct crypt_params_tcrypt *tcrypt_params, struct tcrypt_phdr *tcrypt_hdr) { @@ -695,6 +703,9 @@ int TCRYPT_init_by_name(struct crypt_device *cd, const char *name, memset(tcrypt_params, 0, sizeof(*tcrypt_params)); memset(tcrypt_hdr, 0, sizeof(*tcrypt_hdr)); + tcrypt_hdr->d.sector_size = SECTOR_SIZE; + tcrypt_hdr->d.mk_offset = dmd->u.crypt.offset * SECTOR_SIZE; + strncpy(cipher, dmd->u.crypt.cipher, MAX_CIPHER_LEN); if ((mode = strchr(cipher, '-'))) { @@ -703,8 +714,10 @@ int TCRYPT_init_by_name(struct crypt_device *cd, const char *name, } tcrypt_params->key_size = dmd->u.crypt.vk->keylength; - if (!status_one(cd, name, dmd->uuid, 1, &tcrypt_params->key_size, cipher)) - status_one(cd, name, dmd->uuid, 2, &tcrypt_params->key_size, cipher); + if (!status_one(cd, name, dmd->uuid, 1, &tcrypt_params->key_size, + cipher, &tcrypt_hdr->d.mk_offset, device)) + status_one(cd, name, dmd->uuid, 2, &tcrypt_params->key_size, + cipher, &tcrypt_hdr->d.mk_offset, device); tcrypt_params->cipher = strdup(cipher); return 0; diff --git a/lib/tcrypt/tcrypt.h b/lib/tcrypt/tcrypt.h index 40e3c2e..d35b1e6 100644 --- a/lib/tcrypt/tcrypt.h +++ b/lib/tcrypt/tcrypt.h @@ -64,7 +64,8 @@ struct tcrypt_phdr { }; } __attribute__((__packed__)); -struct crypt_dm_active_device dmd; +struct crypt_dm_active_device; +struct device; int TCRYPT_read_phdr(struct crypt_device *cd, struct tcrypt_phdr *hdr, @@ -72,6 +73,7 @@ int TCRYPT_read_phdr(struct crypt_device *cd, int TCRYPT_init_by_name(struct crypt_device *cd, const char *name, const struct crypt_dm_active_device *dmd, + struct device **device, struct crypt_params_tcrypt *tcrypt_params, struct tcrypt_phdr *tcrypt_hdr); -- 2.7.4