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

Add devices/ignore_suspended_devices to ignore suspended dm devices.

This commit is contained in:
Alasdair Kergon 2007-01-25 21:22:30 +00:00
parent 820810da65
commit f247a4e76f
9 changed files with 80 additions and 1 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.20 - Version 2.02.20 -
=================================== ===================================
Add devices/ignore_suspended_devices to ignore suspended dm devices.
Add some missing close() and fclose() return code checks. Add some missing close() and fclose() return code checks.
Fix exit statuses of reporting tools (2.02.19). Fix exit statuses of reporting tools (2.02.19).
Add init script for dmeventd monitoring. Add init script for dmeventd monitoring.

View File

@ -79,6 +79,12 @@ devices {
# software RAID (md) devices by looking for md superblocks. # software RAID (md) devices by looking for md superblocks.
# 1 enables; 0 disables. # 1 enables; 0 disables.
md_component_detection = 1 md_component_detection = 1
# If, while scanning the system for PVs, LVM2 encounters a device-mapper
# device that has its I/O suspended, it waits for it to become accessible.
# Set this to 1 to skip such devices. This should only be needed
# in recovery situations.
ignore_suspended_devices = 0
} }
# This section that allows you to configure the nature of the # This section that allows you to configure the nature of the

View File

@ -95,4 +95,9 @@ int monitor_dev_for_events(struct cmd_context *cmd,
int pv_uses_vg(struct physical_volume *pv, int pv_uses_vg(struct physical_volume *pv,
struct volume_group *vg); struct volume_group *vg);
/*
* Returns 1 if mapped device is not suspended.
*/
int device_is_usable(dev_t dev);
#endif #endif

View File

@ -25,6 +25,7 @@
#include "targets.h" #include "targets.h"
#include "config.h" #include "config.h"
#include "filter.h" #include "filter.h"
#include "activate.h"
#include <limits.h> #include <limits.h>
#include <dirent.h> #include <dirent.h>
@ -154,6 +155,42 @@ static int _info_run(const char *name, const char *dlid, struct dm_info *info,
return r; return r;
} }
int device_is_usable(dev_t dev)
{
struct dm_task *dmt;
struct dm_info info;
int r = 0;
if (!(dmt = dm_task_create(DM_DEVICE_INFO))) {
log_error("Failed to allocate dm_task struct to check dev status");
return 0;
}
if (!dm_task_set_major(dmt, MAJOR(dev)) || !dm_task_set_minor(dmt, MINOR(dev)))
goto_out;
if (!dm_task_run(dmt)) {
log_error("Failed to get state of mapped device");
goto out;
}
if (!dm_task_get_info(dmt, &info))
goto_out;
if (!info.exists || info.suspended)
goto out;
/* FIXME Also check for mirror block_on_error and mpath no paths */
/* FIXME Also check dependencies? */
r = 1;
out:
dm_task_destroy(dmt);
return r;
}
static int _info(const char *name, const char *dlid, int mknodes, static int _info(const char *name, const char *dlid, int mknodes,
int with_open_count, struct dm_info *info, int with_open_count, struct dm_info *info,
struct dm_pool *mem, char **uuid_out) struct dm_pool *mem, char **uuid_out)

View File

@ -592,6 +592,9 @@ static int _init_filters(struct cmd_context *cmd, unsigned load_persistent_cache
return 0; return 0;
} }
init_ignore_suspended_devices(find_config_tree_int(cmd,
"devices/ignore_suspended_devices", DEFAULT_IGNORE_SUSPENDED_DEVICES));
dev_cache = find_config_tree_str(cmd, "devices/cache", dev_cache = find_config_tree_str(cmd, "devices/cache",
cache_file); cache_file);
if (!(f4 = persistent_filter_create(f3, dev_cache))) { if (!(f4 = persistent_filter_create(f3, dev_cache))) {

View File

@ -30,6 +30,7 @@
#define DEFAULT_PROC_DIR "/proc" #define DEFAULT_PROC_DIR "/proc"
#define DEFAULT_SYSFS_SCAN 1 #define DEFAULT_SYSFS_SCAN 1
#define DEFAULT_MD_COMPONENT_DETECTION 1 #define DEFAULT_MD_COMPONENT_DETECTION 1
#define DEFAULT_IGNORE_SUSPENDED_DEVICES 1
#define DEFAULT_LOCK_DIR "/var/lock/lvm" #define DEFAULT_LOCK_DIR "/var/lock/lvm"
#define DEFAULT_LOCKING_LIB "liblvm2clusterlock.so" #define DEFAULT_LOCKING_LIB "liblvm2clusterlock.so"

View File

@ -19,6 +19,7 @@
#include "lvm-string.h" #include "lvm-string.h"
#include "config.h" #include "config.h"
#include "metadata.h" #include "metadata.h"
#include "activate.h"
#include <dirent.h> #include <dirent.h>
#include <unistd.h> #include <unistd.h>
@ -37,6 +38,7 @@ typedef struct {
} device_info_t; } device_info_t;
static int _md_major = -1; static int _md_major = -1;
static int _device_mapper_major = -1;
int md_major(void) int md_major(void)
{ {
@ -90,6 +92,13 @@ static int _passes_lvm_type_device_filter(struct dev_filter *f,
return 0; return 0;
} }
/* 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);
return 0;
}
/* Check it's accessible */ /* Check it's accessible */
if (!dev_open_flags(dev, O_RDONLY, 0, 1)) { if (!dev_open_flags(dev, O_RDONLY, 0, 1)) {
log_debug("%s: Skipping: open failed", name); log_debug("%s: Skipping: open failed", name);
@ -182,10 +191,14 @@ static int _scan_proc_dev(const char *proc, const struct config_node *cn)
if (!strncmp("md", line + i, 2) && isspace(*(line + i + 2))) if (!strncmp("md", line + i, 2) && isspace(*(line + i + 2)))
_md_major = line_maj; _md_major = line_maj;
/* Look for device-mapper device */
/* FIXME Cope with multiple majors */
if (!strncmp("device-mapper", line + i, 13) && isspace(*(line + i + 13)))
_device_mapper_major = line_maj;
/* Go through the valid device names and if there is a /* Go through the valid device names and if there is a
match store max number of partitions */ match store max number of partitions */
for (j = 0; device_info[j].name != NULL; j++) { for (j = 0; device_info[j].name != NULL; j++) {
dev_len = strlen(device_info[j].name); dev_len = strlen(device_info[j].name);
if (dev_len <= strlen(line + i) && if (dev_len <= strlen(line + i) &&
!strncmp(device_info[j].name, line + i, dev_len) && !strncmp(device_info[j].name, line + i, dev_len) &&

View File

@ -49,6 +49,7 @@ static char _msg_prefix[30] = " ";
static int _already_logging = 0; static int _already_logging = 0;
static int _mirror_in_sync = 0; static int _mirror_in_sync = 0;
static int _dmeventd_monitor = DEFAULT_DMEVENTD_MONITOR; static int _dmeventd_monitor = DEFAULT_DMEVENTD_MONITOR;
static int _ignore_suspended_devices = 0;
static lvm2_log_fn_t _lvm2_log_fn = NULL; static lvm2_log_fn_t _lvm2_log_fn = NULL;
@ -195,6 +196,11 @@ void init_dmeventd_monitor(int reg)
_dmeventd_monitor = reg; _dmeventd_monitor = reg;
} }
void init_ignore_suspended_devices(int ignore)
{
_ignore_suspended_devices = ignore;
}
void init_cmd_name(int status) void init_cmd_name(int status)
{ {
_log_cmd_name = status; _log_cmd_name = status;
@ -274,6 +280,11 @@ int dmeventd_monitor_mode(void)
return _dmeventd_monitor; return _dmeventd_monitor;
} }
int ignore_suspended_devices(void)
{
return _ignore_suspended_devices;
}
void init_debug(int level) void init_debug(int level)
{ {
_debug_level = level; _debug_level = level;

View File

@ -76,6 +76,7 @@ void init_lockingfailed(int level);
void init_security_level(int level); void init_security_level(int level);
void init_mirror_in_sync(int in_sync); void init_mirror_in_sync(int in_sync);
void init_dmeventd_monitor(int reg); void init_dmeventd_monitor(int reg);
void init_ignore_suspended_devices(int ignore);
void set_cmd_name(const char *cmd_name); void set_cmd_name(const char *cmd_name);
@ -90,6 +91,7 @@ int ignorelockingfailure(void);
int lockingfailed(void); int lockingfailed(void);
int security_level(void); int security_level(void);
int mirror_in_sync(void); int mirror_in_sync(void);
int ignore_suspended_devices(void);
#define DMEVENTD_MONITOR_IGNORE -1 #define DMEVENTD_MONITOR_IGNORE -1
int dmeventd_monitor_mode(void); int dmeventd_monitor_mode(void);