Set UUID in device-mapper for LUKS devices.
authorMilan Broz <gmazyland@gmail.com>
Sat, 20 Jun 2009 20:24:56 +0000 (20:24 +0000)
committerMilan Broz <gmazyland@gmail.com>
Sat, 20 Jun 2009 20:24:56 +0000 (20:24 +0000)
Device mapper device should use UUID string if possible.
UDEV can then easily distinguish the device type etc.

cryptsetup now uses CRYPT prefix for uuid.

git-svn-id: https://cryptsetup.googlecode.com/svn/trunk@55 36d66b0a-2a48-0410-832c-cd162a569da5

lib/internal.h
lib/libdevmapper.c
lib/setup.c
luks/keyencryption.c

index 670b349..2a9559d 100644 (file)
@@ -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);
index 3859508..7809216 100644 (file)
@@ -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;
        }
index 64b0bd9..78178ae 100644 (file)
@@ -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);
index 22c845a..e989a6d 100644 (file)
@@ -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;
 }