Fix error message for luksClose and detached LUKS header.
authorMilan Broz <gmazyland@gmail.com>
Sun, 13 Nov 2011 22:12:51 +0000 (22:12 +0000)
committerMilan Broz <gmazyland@gmail.com>
Sun, 13 Nov 2011 22:12:51 +0000 (22:12 +0000)
Allow --header for status command to get full info with detached header.

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

ChangeLog
lib/setup.c
man/cryptsetup.8
src/cryptsetup.c
tests/compat-test

index 48c2093930c8d65258bb35a1e32f2d6ff83fd163..255e034beccb2c5e7100fdd817d0e7f75e76b6ab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-11-13  Milan Broz  <mbroz@redhat.com>
+       * Fix error message for luksClose and detached LUKS header.
+       * Allow --header for status command to get full info with detached header.
+
 2011-11-09  Milan Broz  <mbroz@redhat.com>
        * Version 1.4.1.
 
index e58c4c5d1857758701e20d76bb3c40553b1a8126..ce2eafa62159dad5d5570d7a65641d34c4793ebe 100644 (file)
@@ -598,6 +598,27 @@ int crypt_set_data_device(struct crypt_device *cd, const char *device)
        return crypt_check_data_device_size(cd);
 }
 
+static int _crypt_load_luks1(struct crypt_device *cd, int require_header)
+{
+       struct luks_phdr hdr;
+       int r;
+
+       r = init_crypto(cd);
+       if (r < 0)
+               return r;
+
+       r = LUKS_read_phdr(mdata_device(cd), &hdr, require_header, cd);
+       if (r < 0)
+               return r;
+
+       if (!cd->type && !(cd->type = strdup(CRYPT_LUKS1)))
+               return -ENOMEM;
+
+       memcpy(&cd->hdr, &hdr, sizeof(hdr));
+
+       return r;
+}
+
 int crypt_init_by_name_and_header(struct crypt_device **cd,
                                  const char *name,
                                  const char *header_device)
@@ -701,7 +722,7 @@ int crypt_init_by_name_and_header(struct crypt_device **cd,
                }
        } else if (isLUKS((*cd)->type)) {
                if (mdata_device(*cd)) {
-                       r = crypt_load(*cd, CRYPT_LUKS1, NULL);
+                       r = _crypt_load_luks1(*cd, 0);
                        if (r < 0) {
                                log_dbg("LUKS device header does not match active device.");
                                free((*cd)->type);
@@ -931,7 +952,6 @@ int crypt_load(struct crypt_device *cd,
               const char *requested_type,
               void *params __attribute__((unused)))
 {
-       struct luks_phdr hdr;
        int r;
 
        log_dbg("Trying to load %s crypt type from device %s.",
@@ -948,19 +968,10 @@ int crypt_load(struct crypt_device *cd,
                return -EINVAL;
        }
 
-       r = init_crypto(cd);
-       if (r < 0)
-               return r;
-
-       r = LUKS_read_phdr(mdata_device(cd), &hdr, 1, cd);
+       r = _crypt_load_luks1(cd, 1);
        if (r < 0)
                return r;
 
-       if (!cd->type && !(cd->type = strdup(CRYPT_LUKS1)))
-               return -ENOMEM;
-
-       memcpy(&cd->hdr, &hdr, sizeof(hdr));
-
        /* cd->type and header must be set in context */
        r = crypt_check_data_device_size(cd);
        if (r < 0) {
index c9ad5fda924250922a8aab6e924c39a6412cfe44..a685e1e6baeb1211e0ffde80ed9f4cdf9e88b0a5 100644 (file)
@@ -393,7 +393,8 @@ Set detached (separated) metadata device or file with LUKS header.
 This options allows separation of ciphertext device and on-disk metadata header.
 
 This option is only relevant for LUKS devices and can be used in \fIluksFormat\fR,
-\fIluksOpen\fR, \fIluksSuspend\fR, \fIluksResume\fR and \fIresize\fR commands.
+\fIluksOpen\fR, \fIluksSuspend\fR, \fIluksResume\fR, \fIstatus\fR and
+\fIresize\fR commands.
 
 If used with \fIluksFormat\fR the \-\-align-payload option is taken
 as absolute sector alignment on ciphertext device and can be zero.
index 1bf43eb87f4c0d9529d907c7d028b467614e331e..fac38b7261ea0a215fe80f99f7c04b5a751b0df8 100644 (file)
@@ -408,7 +408,8 @@ static int action_status(int arg __attribute__((unused)))
                else
                        log_std("%s/%s is active%s.\n", crypt_get_dir(), action_argv[0],
                                ci == CRYPT_BUSY ? " and is in use" : "");
-               r = crypt_init_by_name(&cd, action_argv[0]);
+
+               r = crypt_init_by_name_and_header(&cd, action_argv[0], opt_header_device);
                if (r < 0 || !crypt_get_type(cd))
                        goto out;
 
index 3499faf846492920e0018571f7418657612f70ad..4bf70a563d43e70e20d014a0b62143c83b71a48c 100755 (executable)
@@ -7,6 +7,7 @@ DEV_NAME2=dummy2
 DEV_NAME3=dummy3
 ORIG_IMG=luks-test-orig
 IMG=luks-test
+HEADER_IMG=luks-header
 KEY1=key1
 KEY2=key2
 KEY5=key5
@@ -34,7 +35,7 @@ function remove_mapping()
        [ -b /dev/mapper/$DEV_NAME2 ] && dmsetup remove $DEV_NAME2
        [ -b /dev/mapper/$DEV_NAME ] && dmsetup remove $DEV_NAME
        losetup -d $LOOPDEV >/dev/null 2>&1
-       rm -f $ORIG_IMG $IMG $KEY1 $KEY2 $KEY5 >/dev/null 2>&1
+       rm -f $ORIG_IMG $IMG $KEY1 $KEY2 $KEY5 $HEADER_IMG >/dev/null 2>&1
 }
 
 function fail()
@@ -127,7 +128,6 @@ function valgrind_run()
 
 # LUKS tests
 
-
 prepare        "[1] open - compat image - acceptance check" new
 echo "compatkey" | $CRYPTSETUP luksOpen $LOOPDEV $DEV_NAME || fail
 check_exists
@@ -446,5 +446,16 @@ $CRYPTSETUP luksOpen -S 1 -d $KEY5 $LOOPDEV $DEV_NAME && fail
 $CRYPTSETUP luksOpen -S 5 -d $KEY1 $LOOPDEV $DEV_NAME && fail
 [ -b /dev/mapper/$DEV_NAME ] && fail
 
+prepare "[28] Detached LUKS header" wipe
+dd if=/dev/zero of=$HEADER_IMG bs=1M count=4 >/dev/null 2>&1
+echo "key0" | $CRYPTSETUP luksFormat -i1 $LOOPDEV --header $HEADER_IMG || fail
+echo "key0" | $CRYPTSETUP luksFormat -i1 $LOOPDEV --header $HEADER_IMG --align-payload 0 || fail
+echo "key0" | $CRYPTSETUP luksOpen $LOOPDEV --header $HEADER_IMG $DEV_NAME || fail
+$CRYPTSETUP -q resize  $DEV_NAME --size 100 --header $HEADER_IMG || fail
+$CRYPTSETUP -q status  $DEV_NAME --header $HEADER_IMG | grep "size:" | grep -q "100 sectors" || fail
+$CRYPTSETUP luksSuspend $DEV_NAME --header $HEADER_IMG || fail
+echo "key0" | $CRYPTSETUP luksResume $DEV_NAME --header $HEADER_IMG || fail
+$CRYPTSETUP luksClose $DEV_NAME || fail
+
 remove_mapping
 exit 0