From: Alasdair Kergon Date: Mon, 25 Oct 2010 10:37:34 +0000 (+0000) Subject: restrict last checkin to devs consisting entirely of error target X-Git-Tag: old-v2_02_75~21 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=4e51f802a05385d609b91bde359c0e007cac13da;p=lvm2.git restrict last checkin to devs consisting entirely of error target --- diff --git a/WHATS_NEW b/WHATS_NEW index 00bc45a2a..a09acf189 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,6 +1,6 @@ Version 2.02.75 - ===================================== - Never scan a device which is using the error target. + Skip dm devices in scan if they contain only error targets. Fix strict-aliasing compile warning in partition table scanning. Add an option to automatically extend snapshots through dmeventd. Remove dependency on libm, floor() is replaced with integer algorithm. diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c index aab0c9acf..cbb53785e 100644 --- a/lib/activate/dev_manager.c +++ b/lib/activate/dev_manager.c @@ -135,10 +135,11 @@ int device_is_usable(struct device *dev) char *target_type = NULL; char *params, *vgname = NULL, *lvname, *layer; void *next = NULL; + int only_error_target = 1; int r = 0; if (!(dmt = dm_task_create(DM_DEVICE_STATUS))) { - log_error("Failed to allocate dm_task struct to check dev status"); + log_error("Failed to create dm_task struct to check dev status"); return 0; } @@ -159,6 +160,11 @@ int device_is_usable(struct device *dev) name = dm_task_get_name(dmt); uuid = dm_task_get_uuid(dmt); + if (!info.target_count) { + log_debug("%s: Empty device %s not usable.", dev_name(dev), name); + goto out; + } + if (info.suspended && ignore_suspended_devices()) { log_debug("%s: Suspended device %s not usable.", dev_name(dev), name); goto out; @@ -191,13 +197,18 @@ int device_is_usable(struct device *dev) goto out; } - if (target_type && !strcmp(target_type, "error")) { - log_debug("%s: Error device %s not usable.", - dev_name(dev), name); - goto out; - } + if (target_type && strcmp(target_type, "error")) + only_error_target = 0; } while (next); + /* Skip devices consisting entirely of error targets. */ + /* FIXME Deal with device stacked above error targets? */ + if (only_error_target) { + log_debug("%s: Error device %s not usable.", + dev_name(dev), name); + goto out; + } + /* FIXME Also check dependencies? */ /* Check internal lvm devices */