Remove device even if underlying device disappeared.
authorMilan Broz <gmazyland@gmail.com>
Sun, 30 May 2010 12:20:56 +0000 (12:20 +0000)
committerMilan Broz <gmazyland@gmail.com>
Sun, 30 May 2010 12:20:56 +0000 (12:20 +0000)
git-svn-id: https://cryptsetup.googlecode.com/svn/trunk@240 36d66b0a-2a48-0410-832c-cd162a569da5

ChangeLog
lib/libdevmapper.c
lib/setup.c

index 9101f94..0eed82b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2010-05-27  Milan Broz  <mbroz@redhat.com>
        * Fix luksFormat/luksOpen reading passphrase from stdin and "-" keyfile.
        * Add verbose log level and move unlocking message there.
+       * Remove device even if underlying device disappeared.
 
 2010-05-23  Milan Broz  <mbroz@redhat.com>
        * Fix luksClose operation for stacked DM devices.
index ef80602..c37a84e 100644 (file)
@@ -197,7 +197,7 @@ static char *lookup_dev(const char *dev_id)
 {
        uint32_t major, minor;
        dev_t dev;
-       char *result, buf[PATH_MAX + 1];
+       char *result = NULL, buf[PATH_MAX + 1];
 
        if (sscanf(dev_id, "%" PRIu32 ":%" PRIu32, &major, &minor) != 2)
                return NULL;
@@ -220,8 +220,8 @@ static char *lookup_dev(const char *dev_id)
        strncpy(buf, DEVICE_DIR, PATH_MAX);
        result = __lookup_dev(buf, dev, 0, 4);
 
-       /* If not found, return major:minor */
-       return result ?: strdup(dev_id);
+       /* If not found, return NULL */
+       return result;
 }
 
 static int _dev_read_ahead(const char *dev, uint32_t *read_ahead)
index 45690b8..87a1c38 100644 (file)
@@ -741,10 +741,8 @@ int crypt_remove_device(struct crypt_options *options)
        int r;
 
        r = crypt_init_by_name(&cd, options->name);
-       if (r)
-               return r;
-
-       r = crypt_deactivate(cd, options->name);
+       if (r == 0)
+               r = crypt_deactivate(cd, options->name);
 
        crypt_free(cd);
        return r;
@@ -759,7 +757,7 @@ int crypt_luksFormat(struct crypt_options *options)
        char cipherMode[LUKS_CIPHERMODE_L];
        char *password=NULL;
        unsigned int passwordLen;
-       struct crypt_device *cd;
+       struct crypt_device *cd = NULL;
        struct crypt_params_luks1 cp = {
                .hash = options->hash,
                .data_alignment = options->align_payload
@@ -1049,6 +1047,12 @@ int crypt_init_by_name(struct crypt_device **cd, const char *name)
 
        r = dm_query_device(name, &device, NULL, NULL, NULL,
                            NULL, NULL, NULL, NULL, NULL, NULL);
+
+       /* Underlying device disappeared but mapping still active */
+       if (r >= 0 && !device)
+               log_verbose(NULL, _("Underlying device for crypt device %s disappeared.\n"),
+                           name);
+
        if (r >= 0)
                r = crypt_init(cd, device);