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

Never scan suspended devices in clvmd.

For mirror repair (and similar tasks) it can happen that full
device rescan is issued from clvmd.

Because code can be in the middle of repair (calling suspend)
clvmd should never try to scan suspended devices
(otherwise it causes deadlock).

Also code must not change ignore_suspended_device flag when
doing refresh_filters (called from lvmcache scan code).
This commit is contained in:
Milan Broz 2010-01-19 13:25:00 +00:00
parent 81410c8f09
commit 7a96516819
3 changed files with 16 additions and 1 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.59 -
===================================
Fix clvmd to never scan suspended devices.
Initial version of the cmirror init script (Red Hat).
Initial version of the cmirrord man page.
Make cluster log communication structures architecture independant.

View File

@ -499,6 +499,9 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
cmd->partial_activation = (lock_flags & LCK_PARTIAL_MODE) ? 1 : 0;
/* clvmd should never try to read suspended device */
init_ignore_suspended_devices(1);
switch (command & LCK_MASK) {
case LCK_LV_EXCLUSIVE:
status = do_activate_lv(resource, lock_flags, LKM_EXMODE);
@ -627,6 +630,7 @@ int do_refresh_cache()
}
init_full_scan_done(0);
init_ignore_suspended_devices(1);
lvmcache_label_scan(cmd, 2);
dm_pool_empty(cmd->mem);
@ -860,6 +864,7 @@ int init_lvm(int using_gulm)
/* Check lvm.conf is setup for cluster-LVM */
check_config();
init_ignore_suspended_devices(1);
/* Remove any non-LV locks that may have been left around */
if (using_gulm)

View File

@ -1231,12 +1231,21 @@ skip_dlclose:
int refresh_filters(struct cmd_context *cmd)
{
int r, saved_ignore_suspended_devices = ignore_suspended_devices();
if (cmd->filter) {
cmd->filter->destroy(cmd->filter);
cmd->filter = NULL;
}
return _init_filters(cmd, 0);
r = _init_filters(cmd, 0);
/*
* During repair code must not reset suspended flag.
*/
init_ignore_suspended_devices(saved_ignore_suspended_devices);
return r;
}
int refresh_toolcontext(struct cmd_context *cmd)