Fix mapping of TCRYPT system encryption for more partitions.
authorMilan Broz <gmazyland@gmail.com>
Sun, 23 Jun 2013 13:24:01 +0000 (15:24 +0200)
committerMilan Broz <gmazyland@gmail.com>
Sun, 23 Jun 2013 13:24:01 +0000 (15:24 +0200)
If TCRYPT system encryption uses only partition (not the whole device)
some other partitions could be in use and we have to use
more relaxed check to allow device activation.

lib/tcrypt/tcrypt.c

index 811794c..3bab4ba 100644 (file)
@@ -640,6 +640,7 @@ int TCRYPT_activate(struct crypt_device *cd,
        unsigned int i;
        int r;
        struct tcrypt_algs *algs;
+       enum devcheck device_check;
        struct crypt_dm_active_device dmd = {
                .target = DM_CRYPT,
                .size   = 0,
@@ -676,7 +677,18 @@ int TCRYPT_activate(struct crypt_device *cd,
        else
                dmd.size = hdr->d.volume_size / hdr->d.sector_size;
 
-       r = device_block_adjust(cd, dmd.data_device, DEV_EXCL,
+       /*
+        * System encryption use the whole device mapping, there can
+        * be active partitions.
+        * FIXME: This will allow multiple mappings unexpectedly.
+        */
+       if ((dmd.flags & CRYPT_ACTIVATE_SHARED) ||
+           (params->flags & CRYPT_TCRYPT_SYSTEM_HEADER))
+               device_check = DEV_SHARED;
+       else
+               device_check = DEV_EXCL;
+
+       r = device_block_adjust(cd, dmd.data_device, device_check,
                                dmd.u.crypt.offset, &dmd.size, &dmd.flags);
        if (r)
                return r;