From 49463051bc5c9ed3ab9d99a4cd45a91e48b3c5a3 Mon Sep 17 00:00:00 2001 From: Milan Broz Date: Sun, 30 May 2010 12:20:56 +0000 Subject: [PATCH] Remove device even if underlying device disappeared. git-svn-id: https://cryptsetup.googlecode.com/svn/trunk@240 36d66b0a-2a48-0410-832c-cd162a569da5 --- ChangeLog | 1 + lib/libdevmapper.c | 6 +++--- lib/setup.c | 14 +++++++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9101f94..0eed82b 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 ef80602..c37a84e 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 45690b8..87a1c38 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); -- 2.7.4