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

Add global/metadata_read_only to use unrepaired metadata in read-only cmds.

This commit is contained in:
Alasdair Kergon 2010-10-25 11:20:54 +00:00
parent c748bda186
commit b83af51668
10 changed files with 66 additions and 25 deletions

View File

@ -1,5 +1,6 @@
Version 2.02.75 -
=====================================
Add global/metadata_read_only to use unrepaired metadata in read-only cmds.
Don't take write lock in vgchange --refresh, --poll or --monitor.
Skip dm devices in scan if they contain only error targets or are empty.
Fix strict-aliasing compile warning in partition table scanning.

View File

@ -334,6 +334,13 @@ global {
# Treat any internal errors as fatal errors, aborting the process that
# encountered the internal error. Please only enable for debugging.
abort_on_internal_errors = 0
# If set to 1, no operations that change on-disk metadata will be permitted.
# Additionally, read-only commands that encounter metadata in need of repair
# will still be allowed to proceed exactly as if the repair had been
# performed (except for the unchanged vg_seqno).
# Inappropriate use could mess up your system, so seek advice first!
metadata_read_only = 0
}
activation {

View File

@ -314,6 +314,9 @@ static int _process_config(struct cmd_context *cmd)
if ((cv->type != CFG_STRING) || !cv->v.str[0])
log_error("Ignoring invalid activation/mlock_filter entry in config file");
cmd->metadata_read_only = find_config_tree_int(cmd, "global/metadata_read_only",
DEFAULT_METADATA_READ_ONLY);
return 1;
}

View File

@ -73,6 +73,7 @@ struct cmd_context {
unsigned handles_unknown_segments:1;
unsigned partial_activation:1;
unsigned si_unit_consistency:1;
unsigned metadata_read_only:1;
struct dev_filter *filter;
int dump_filter; /* Dump filter when exiting? */

View File

@ -44,6 +44,7 @@
#define DEFAULT_WAIT_FOR_LOCKS 1
#define DEFAULT_PRIORITISE_WRITE_LOCKS 1
#define DEFAULT_USE_MLOCKALL 0
#define DEFAULT_METADATA_READ_ONLY 0
#define DEFAULT_MIRRORLOG "disk"
#define DEFAULT_MIRROR_LOG_FAULT_POLICY "allocate"

View File

@ -374,6 +374,13 @@ static int _lock_vol(struct cmd_context *cmd, const char *resource,
return 0;
}
if (cmd->metadata_read_only &&
((flags & LCK_TYPE_MASK) == LCK_WRITE) &&
strcmp(resource, VG_GLOBAL)) {
log_error("Operation prohibited while global/metadata_read_only is set.");
return 0;
}
if ((ret = _locking.lock_resource(cmd, resource, flags))) {
if ((flags & LCK_SCOPE_MASK) == LCK_VG &&
!(flags & LCK_CACHE)) {

View File

@ -2729,8 +2729,14 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
/* FIXME Also ensure contents same - checksum compare? */
if (correct_vg->seqno != vg->seqno) {
inconsistent = 1;
inconsistent_seqno = 1;
if (cmd->metadata_read_only)
log_very_verbose("Not repairing VG %s metadata seqno (%d != %d) "
"as global/metadata_read_only is set.",
vgname, vg->seqno, correct_vg->seqno);
else {
inconsistent = 1;
inconsistent_seqno = 1;
}
if (vg->seqno > correct_vg->seqno) {
vg_release(correct_vg);
correct_vg = vg;
@ -2805,8 +2811,8 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
}
}
if (dm_list_size(&correct_vg->pvs) != dm_list_size(pvids)
+ vg_missing_pv_count(correct_vg)) {
if (dm_list_size(&correct_vg->pvs) !=
dm_list_size(pvids) + vg_missing_pv_count(correct_vg)) {
log_debug("Cached VG %s had incorrect PV list",
vgname);
@ -2882,8 +2888,15 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
/* FIXME Also ensure contents same - checksums same? */
if (correct_vg->seqno != vg->seqno) {
inconsistent = 1;
inconsistent_seqno = 1;
/* Ignore inconsistent seqno if told to skip repair logic */
if (cmd->metadata_read_only)
log_very_verbose("Not repairing VG %s metadata seqno (%d != %d) "
"as global/metadata_read_only is set.",
vgname, vg->seqno, correct_vg->seqno);
else {
inconsistent = 1;
inconsistent_seqno = 1;
}
if (!_update_pv_list(cmd->mem, &all_pvs, vg)) {
vg_release(vg);
vg_release(correct_vg);

View File

@ -30,7 +30,7 @@ xx(e2fsadm,
xx(dumpconfig,
"Dump active configuration",
0,
PERMITTED_READ_ONLY,
"dumpconfig "
"\t[-f|--file filename] " "\n"
"[ConfigurationVariable...]\n",
@ -38,12 +38,12 @@ xx(dumpconfig,
xx(formats,
"List available metadata formats",
0,
PERMITTED_READ_ONLY,
"formats\n")
xx(help,
"Display help for commands",
0,
PERMITTED_READ_ONLY,
"help <command>" "\n")
/*********
@ -58,7 +58,7 @@ xx(lvactivate,
xx(lvchange,
"Change the attributes of logical volume(s)",
CACHE_VGMETADATA,
CACHE_VGMETADATA | PERMITTED_READ_ONLY,
"lvchange\n"
"\t[-A|--autobackup y|n]\n"
"\t[-a|--available [e|l]y|n]\n"
@ -207,7 +207,7 @@ xx(lvcreate,
xx(lvdisplay,
"Display information about a logical volume",
0,
PERMITTED_READ_ONLY,
"lvdisplay\n"
"\t[-a|--all]\n"
"\t[-c|--colon]\n"
@ -287,7 +287,7 @@ xx(lvmchange,
xx(lvmdiskscan,
"List devices that may be used as physical volumes",
0,
PERMITTED_READ_ONLY,
"lvmdiskscan\n"
"\t[-d|--debug]\n"
"\t[-h|--help]\n"
@ -401,7 +401,7 @@ xx(lvresize,
xx(lvs,
"Display information about logical volumes",
0,
PERMITTED_READ_ONLY,
"lvs" "\n"
"\t[-a|--all]\n"
"\t[--aligned]\n"
@ -432,7 +432,7 @@ xx(lvs,
xx(lvscan,
"List all logical volumes in all volume groups",
0,
PERMITTED_READ_ONLY,
"lvscan " "\n"
"\t[-a|--all]\n"
"\t[-b|--blockdevice] " "\n"
@ -545,7 +545,7 @@ xx(pvdata,
xx(pvdisplay,
"Display various attributes of physical volume(s)",
CACHE_VGMETADATA,
CACHE_VGMETADATA | PERMITTED_READ_ONLY,
"pvdisplay\n"
"\t[-c|--colon]\n"
"\t[-d|--debug]\n"
@ -620,7 +620,7 @@ xx(pvremove,
xx(pvs,
"Display information about physical volumes",
CACHE_VGMETADATA,
CACHE_VGMETADATA | PERMITTED_READ_ONLY,
"pvs" "\n"
"\t[-a|--all]\n"
"\t[--aligned]\n"
@ -651,7 +651,7 @@ xx(pvs,
xx(pvscan,
"List all physical volumes",
0,
PERMITTED_READ_ONLY,
"pvscan " "\n"
"\t[-d|--debug] " "\n"
"\t{-e|--exported | -n|--novolumegroup} " "\n"
@ -668,12 +668,12 @@ xx(pvscan,
xx(segtypes,
"List available segment types",
0,
PERMITTED_READ_ONLY,
"segtypes\n")
xx(vgcfgbackup,
"Backup volume group configuration(s)",
0,
PERMITTED_READ_ONLY,
"vgcfgbackup " "\n"
"\t[-d|--debug] " "\n"
"\t[-f|--file filename] " "\n"
@ -704,7 +704,7 @@ xx(vgcfgrestore,
xx(vgchange,
"Change volume group attributes",
CACHE_VGMETADATA,
CACHE_VGMETADATA | PERMITTED_READ_ONLY,
"vgchange" "\n"
"\t[-A|--autobackup {y|n}] " "\n"
"\t[--alloc AllocationPolicy] " "\n"
@ -797,7 +797,7 @@ xx(vgcreate,
xx(vgdisplay,
"Display volume group information",
0,
PERMITTED_READ_ONLY,
"vgdisplay " "\n"
"\t[-A|--activevolumegroups]" "\n"
"\t[-c|--colon | -s|--short | -v|--verbose]" "\n"
@ -961,7 +961,7 @@ xx(vgrename,
xx(vgs,
"Display information about volume groups",
0,
PERMITTED_READ_ONLY,
"vgs" "\n"
"\t[--aligned]\n"
"\t[-a|--all]\n"
@ -991,7 +991,7 @@ xx(vgs,
xx(vgscan,
"Search for all volume groups",
0,
PERMITTED_READ_ONLY,
"vgscan "
"\t[-d|--debug]\n"
"\t[-h|--help]\n"
@ -1029,6 +1029,6 @@ xx(vgsplit,
xx(version,
"Display software and driver version information",
0,
PERMITTED_READ_ONLY,
"version\n" )

View File

@ -1073,6 +1073,13 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
if ((ret = _process_common_commands(cmd)))
goto_out;
if (cmd->metadata_read_only &&
!(cmd->command->flags & PERMITTED_READ_ONLY)) {
log_error("%s: Command not permitted while global/metadata_read_only "
"is set.", cmd->cmd_line);
goto out;
}
if (arg_count(cmd, nolocking_ARG))
locking_type = 0;
else

View File

@ -117,7 +117,8 @@ struct arg {
/* void *ptr; // Currently not used. */
};
#define CACHE_VGMETADATA 0x00000001
#define CACHE_VGMETADATA 0x00000001
#define PERMITTED_READ_ONLY 0x00000002
/* a register of the lvm commands */
struct command {