diff --git a/ChangeLog b/ChangeLog index 9101f943..0eed82b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ 2010-05-27 Milan Broz * 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 * Fix luksClose operation for stacked DM devices. diff --git a/lib/libdevmapper.c b/lib/libdevmapper.c index ef806026..c37a84ea 100644 --- a/lib/libdevmapper.c +++ b/lib/libdevmapper.c @@ -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) diff --git a/lib/setup.c b/lib/setup.c index 45690b83..87a1c385 100644 --- a/lib/setup.c +++ b/lib/setup.c @@ -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);