1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Skip also special lvm devices in scan (if ignore suspended is used).

This should avoid various races between dmeventd on multiple nodes
in cluster where one node already repairing device and another
run full scan and locks the device.
This commit is contained in:
Milan Broz 2010-05-13 18:38:38 +00:00
parent b1d188894e
commit 28e2b5b213
4 changed files with 18 additions and 7 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.65 -
=================================
Skip internal lvm devices in scan if ignore suspended devices is requested.
Do not merge old device cache after we run full scan. (2.02.56)
Add pkgconfigdir Makefile variable for make install override.
Switch usage of Libs.private: to Requires.private: in devmapper.pc, lvm2app.pc.

View File

@ -110,6 +110,6 @@ int pv_uses_vg(struct physical_volume *pv,
/*
* Returns 1 if mapped device is not suspended.
*/
int device_is_usable(dev_t dev);
int device_is_usable(struct device *dev);
#endif

View File

@ -126,11 +126,11 @@ static int _info_run(const char *name, const char *dlid, struct dm_info *info,
return r;
}
int device_is_usable(dev_t dev)
int device_is_usable(struct device *dev)
{
struct dm_task *dmt;
struct dm_info info;
const char *name;
const char *name, *uuid;
uint64_t start, length;
char *target_type = NULL;
char *params;
@ -142,7 +142,7 @@ int device_is_usable(dev_t dev)
return 0;
}
if (!dm_task_set_major_minor(dmt, MAJOR(dev), MINOR(dev), 1))
if (!dm_task_set_major_minor(dmt, MAJOR(dev->dev), MINOR(dev->dev), 1))
goto_out;
if (!dm_task_run(dmt)) {
@ -157,6 +157,7 @@ int device_is_usable(dev_t dev)
goto out;
name = dm_task_get_name(dmt);
uuid = dm_task_get_uuid(dmt);
/* FIXME Also check for mirror block_on_error and mpath no paths */
/* For now, we exclude all mirrors */
@ -165,12 +166,21 @@ int device_is_usable(dev_t dev)
next = dm_get_next_target(dmt, next, &start, &length,
&target_type, &params);
/* Skip if target type doesn't match */
if (target_type && !strcmp(target_type, "mirror"))
if (target_type && !strcmp(target_type, "mirror")) {
log_debug("%s: Mirror device not usable.", dev_name(dev));
goto out;
}
} while (next);
/* FIXME Also check dependencies? */
/* Check internal lvm devices */
if (is_reserved_lvname(name) && uuid &&
!strncmp(uuid, UUID_PREFIX, sizeof(UUID_PREFIX) - 1)) {
log_debug("%s: Reserved internal LVM device not usable.", dev_name(dev));
goto out;
}
r = 1;
out:

View File

@ -132,8 +132,8 @@ static int _passes_lvm_type_device_filter(struct dev_filter *f __attribute((unus
/* Skip suspended devices */
if (MAJOR(dev->dev) == _device_mapper_major &&
ignore_suspended_devices() && !device_is_usable(dev->dev)) {
log_debug("%s: Skipping: Suspended dm device", name);
ignore_suspended_devices() && !device_is_usable(dev)) {
log_debug("%s: Skipping: Suspended or internal dm device", name);
return 0;
}