diff --git a/lib/internal.h b/lib/internal.h index 670b3494..2a9559d5 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -37,7 +37,7 @@ struct setup_backend { int (*init)(void); void (*exit)(void); int (*create)(int reload, struct crypt_options *options, - const char *key); + const char *key, const char *uuid); int (*status)(int details, struct crypt_options *options, char **key); int (*remove)(int force, struct crypt_options *options); diff --git a/lib/libdevmapper.c b/lib/libdevmapper.c index 3859508e..7809216c 100644 --- a/lib/libdevmapper.c +++ b/lib/libdevmapper.c @@ -18,7 +18,7 @@ #include "internal.h" #define DEVICE_DIR "/dev" - +#define UUID_PREFIX "CRYPT-" #define CRYPT_TARGET "crypt" #define RETRY_COUNT 5 @@ -247,19 +247,26 @@ static int _dm_remove(struct crypt_options *options, int force) } static int dm_create_device(int reload, struct crypt_options *options, - const char *key) + const char *key, const char *uuid) { struct dm_task *dmt = NULL; struct dm_task *dmt_query = NULL; struct dm_info dmi; char *params = NULL; char *error = NULL; + char dev_uuid[64]; int r = -EINVAL; uint32_t read_ahead = 0; params = get_params(options, key); if (!params) goto out_no_removal; + + if (uuid) { + strcpy(dev_uuid, UUID_PREFIX); + strcat(dev_uuid, uuid); + } + if (!(dmt = dm_task_create(reload ? DM_DEVICE_RELOAD : DM_DEVICE_CREATE))) goto out; @@ -275,6 +282,10 @@ static int dm_create_device(int reload, struct crypt_options *options, !dm_task_set_read_ahead(dmt, read_ahead, DM_READ_AHEAD_MINIMUM_FLAG)) goto out; #endif + + if (uuid && !dm_task_set_uuid(dmt, dev_uuid)) + goto out; + if (!dm_task_run(dmt)) goto out; @@ -284,6 +295,8 @@ static int dm_create_device(int reload, struct crypt_options *options, goto out; if (!dm_task_set_name(dmt, options->name)) goto out; + if (uuid && !dm_task_set_uuid(dmt, dev_uuid)) + goto out; if (!dm_task_run(dmt)) goto out; } diff --git a/lib/setup.c b/lib/setup.c index 64b0bd95..78178ae8 100644 --- a/lib/setup.c +++ b/lib/setup.c @@ -350,9 +350,9 @@ static int __crypt_create_device(int reload, struct setup_backend *backend, set_error("Key processing error"); return -ENOENT; } - - r = backend->create(reload, options, processed_key); - + + r = backend->create(reload, options, processed_key, NULL); + safe_free(processed_key); return r; @@ -404,7 +404,7 @@ static int __crypt_resize_device(int details, struct setup_backend *backend, if (infos.readonly) options->flags |= CRYPT_FLAG_READONLY; - r = backend->create(1, &tmp, key); + r = backend->create(1, &tmp, key, NULL); safe_free(key); @@ -579,7 +579,9 @@ start: r = -EINVAL; goto out2; } options->size -= options->offset; - r = backend->create(0, options, mk->key); + /* FIXME: code allows multiple crypt mapping, cannot use uuid then. + * anyway, it is dangerous and can corrupt data. Remove it in next version! */ + r = backend->create(0, options, mk->key, excl ? hdr.uuid : NULL); out2: free(dmCipherSpec); diff --git a/luks/keyencryption.c b/luks/keyencryption.c index 22c845a5..e989a6d3 100644 --- a/luks/keyencryption.c +++ b/luks/keyencryption.c @@ -89,7 +89,7 @@ static int setup_mapping(const char *cipher, const char *name, set_error(NULL); - r = backend->create(0, options, key); + r = backend->create(0, options, key, NULL); return r; }