master - fix: regression for recent persistent commit
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=392bb6f46eb73d...
Commit: 392bb6f46eb73dcf725566fbdf006a4e02ae7502
Parent: 18b8fdc8c92f54c39b8089c343d6fc12fafd1f38
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 17:05:35 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 17:08:41 2014 +0200
fix: regression for recent persistent commit
Do not let fly metadata with just 'minor' set
(since they would not be readable on older version)
Be permissive with invalid major/minor number and
just report them as problem, but allow to use
such metadata with default major:minor.
---
lib/format_text/import_vsn1.c | 17 ++++++++++-------
tools/lvmcmdline.c | 12 +++++++-----
2 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/lib/format_text/import_vsn1.c b/lib/format_text/import_vsn1.c
index 580349f..1783b1e 100644
--- a/lib/format_text/import_vsn1.c
+++ b/lib/format_text/import_vsn1.c
@@ -678,16 +678,19 @@ static int _read_lvsegs(struct format_instance *fid,
return 0;
}
- if (!_read_int32(lvn, "major", &lv->major)) {
- log_error("Couldn't read major number for logical "
- "volume %s.", lv->name);
- return 0;
+ if (!dm_config_has_node(lvn, "major"))
+ /* If major is missing, pick default */
+ lv->major = vg->cmd->dev_types->device_mapper_major;
+ else if (!_read_int32(lvn, "major", &lv->major)) {
+ log_warn("WARNING: Couldn't read major number for logical "
+ "volume %s.", lv->name);
+ lv->major = vg->cmd->dev_types->device_mapper_major;
}
if (!validate_major_minor(vg->cmd, fid->fmt, lv->major, lv->minor)) {
- log_error("Logical volume %s does not have a valid major, minor number.",
- lv->name);
- return 0;
+ log_warn("WARNING: Ignoring invalid major, minor number for "
+ "logical volume %s.", lv->name);
+ lv->major = lv->minor = -1;
}
}
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 9a5cc3a..5f258a2 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -607,11 +607,13 @@ int read_and_validate_major_minor(const struct cmd_context *cmd,
return 0;
}
*major = arg_int_value(cmd, major_ARG, -1);
- } else if (arg_is_set(cmd, major_ARG)) {
- log_warn("WARNING: Ignoring supplied major number - "
- "kernel assigns major numbers dynamically. "
- "Using major number %d instead.",
- cmd->dev_types->device_mapper_major);
+ } else {
+ if (arg_is_set(cmd, major_ARG)) {
+ log_warn("WARNING: Ignoring supplied major number - "
+ "kernel assigns major numbers dynamically. "
+ "Using major number %d instead.",
+ cmd->dev_types->device_mapper_major);
+ }
*major = cmd->dev_types->device_mapper_major;
}
8 years, 6 months
master - cleanup: use int32 for major minor
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=18b8fdc8c92f54...
Commit: 18b8fdc8c92f54c39b8089c343d6fc12fafd1f38
Parent: d274724c83e0bed34b4a1d794a6eb16cab777c05
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 17:04:28 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 17:04:28 2014 +0200
cleanup: use int32 for major minor
Use consistently int32_t for major, minor.
---
lib/metadata/metadata-exported.h | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index aa0edcf..0fa6c97 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -797,8 +797,8 @@ struct lvcreate_params {
int create_pool; /* thin */
int zero; /* all */
int wipe_signatures; /* all */
- int major; /* all */
- int minor; /* all */
+ int32_t major; /* all */
+ int32_t minor; /* all */
int log_count; /* mirror */
int nosync; /* mirror */
int poolmetadataspare; /* thin pool */
8 years, 6 months
master - cache: fix regression and invert test
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=d274724c83e0be...
Commit: d274724c83e0bed34b4a1d794a6eb16cab777c05
Parent: 386fbf8e0d30823854ffefb1b4e3b47b09ec5905
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 16:16:36 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 16:18:39 2014 +0200
cache: fix regression and invert test
Last commit c710f02e0181cc2db5455f0c98033247a70ecc30
converting code to use lv_update_and_reload()
intoduced invalid test for error result.
Fix it and properly check for if (!...)
---
lib/metadata/cache_manip.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/lib/metadata/cache_manip.c b/lib/metadata/cache_manip.c
index 73df448..7f5ea65 100644
--- a/lib/metadata/cache_manip.c
+++ b/lib/metadata/cache_manip.c
@@ -224,7 +224,7 @@ int lv_cache_remove(struct logical_volume *cache_lv)
cache_seg->policy_argv = NULL;
/* update the kernel to put the cleaner policy in place */
- if (lv_update_and_reload(cache_lv))
+ if (!lv_update_and_reload(cache_lv))
return_0;
}
8 years, 6 months
master - debug: enhance mmap catch code
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=386fbf8e0d3082...
Commit: 386fbf8e0d30823854ffefb1b4e3b47b09ec5905
Parent: 081e406d0d0c02d8fb6f93d6b8fb97f4217fde62
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 11:04:36 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 15:55:47 2014 +0200
debug: enhance mmap catch code
Use nice instruction_HLT macro
Use log_debug_mem()
Don't actually log things after we prohibit 'mmap'.
Move initialization of strerror & udev before blocking mmap.
---
lib/mm/memlock.c | 29 ++++++++++++-----------------
1 files changed, 12 insertions(+), 17 deletions(-)
diff --git a/lib/mm/memlock.c b/lib/mm/memlock.c
index 0658800..37d9457 100644
--- a/lib/mm/memlock.c
+++ b/lib/mm/memlock.c
@@ -334,6 +334,7 @@ static int _memlock_maps(struct cmd_context *cmd, lvmlock_t lock, size_t *mstats
#define _GNU_SOURCE
#endif
#include <dlfcn.h>
+static const unsigned char INSTRUCTION_HLT = 0x94;
static char _mmap_orig;
static unsigned char *_mmap_addr;
#ifdef __i386__
@@ -358,7 +359,7 @@ static int _disable_mmap(void)
#endif /* __i386__ */
_mmap_addr = *(void **)abs_addr;
} else
- log_debug("Can't find PLT jump entry assuming -fPIE linkage.");
+ log_debug_mem("Can't find PLT jump entry assuming -fPIE linkage.");
if (mprotect((void *)((unsigned long)_mmap_addr & ~4095UL), 4096, PROT_READ|PROT_WRITE|PROT_EXEC)) {
log_sys_error("mprotect", "");
_mmap_addr = NULL;
@@ -366,8 +367,8 @@ static int _disable_mmap(void)
}
_mmap_orig = *_mmap_addr;
}
- *_mmap_addr = 0xf4;
- log_debug("Remapped mmap jump entry %x to %x.", _mmap_orig, *_mmap_addr);
+ log_debug_mem("Remapping mmap entry %02x to %02x.", _mmap_orig, INSTRUCTION_HLT);
+ *_mmap_addr = INSTRUCTION_HLT;
#ifdef __i386__
if (!_mmap64_addr) {
@@ -375,8 +376,7 @@ static int _disable_mmap(void)
if (_mmap64_addr[0] == 0xff && _mmap64_addr[1] == 0x25) {
abs_addr = *(void **)(_mmap64_addr + 2);
_mmap64_addr = *(void **)abs_addr;
- } else
- log_debug("Can't find PLT jump entry assuming -fPIE linkage.");
+ } /* Can't find PLT jump entry assuming -fPIE linkage */
if (mprotect((void *)((unsigned long)_mmap64_addr & ~4095UL), 4096, PROT_READ|PROT_WRITE|PROT_EXEC)) {
log_sys_error("mprotect", "");
_mmap64_addr = NULL;
@@ -384,8 +384,7 @@ static int _disable_mmap(void)
}
_mmap64_orig = *_mmap64_addr;
}
- *_mmap64_addr = 0xf4;
- log_debug("Remapped mmap64 jump entry %x to %x.", _mmap64_orig, *_mmap64_addr);
+ *_mmap64_addr = INSTRUCTION_HLT;
#endif /* __i386__ */
#endif /* ARCH_X86 */
return 1;
@@ -394,16 +393,13 @@ static int _disable_mmap(void)
static int _restore_mmap(void)
{
#ifdef ARCH_X86
- if (_mmap_addr) {
- log_debug("Restoring mmap jump entry.");
+ if (_mmap_addr)
*_mmap_addr = _mmap_orig;
- }
#ifdef __i386__
- if (_mmap64_addr) {
- log_debug("Restoring mmap64 jump entry.");
+ if (_mmap64_addr)
*_mmap64_addr = _mmap64_orig;
- }
#endif /* __i386__ */
+ log_debug_mem("Restored mmap entry.");
#endif /* ARCH_X86 */
return 1;
}
@@ -412,6 +408,9 @@ static int _restore_mmap(void)
static void _lock_mem(struct cmd_context *cmd)
{
_allocate_memory();
+ (void)strerror(0); /* Force libc.mo load */
+ (void)dm_udev_get_sync_support(); /* udev is initialized */
+ log_very_verbose("Locking memory");
/*
* For daemon we need to use mlockall()
@@ -439,10 +438,6 @@ static void _lock_mem(struct cmd_context *cmd)
stack;
}
- (void)strerror(0); /* Force libc.mo load */
- (void)dm_udev_get_sync_support(); /* udev is initialized */
-
- log_very_verbose("Locking memory");
if (!_memlock_maps(cmd, LVM_MLOCK, &_mstats))
stack;
8 years, 6 months
master - man: document obsoleted options
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=081e406d0d0c02...
Commit: 081e406d0d0c02d8fb6f93d6b8fb97f4217fde62
Parent: e3cbdde070b25db30984efa0898f16c2555301d9
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 14:53:14 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 15:55:47 2014 +0200
man: document obsoleted options
It's shown on comand line help and it's accepted argument,
so provide matching man entry.
---
man/lvchange.8.in | 9 ++++++++-
man/lvcreate.8.in | 9 ++++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/man/lvchange.8.in b/man/lvchange.8.in
index 39187f0..d3d63fd 100644
--- a/man/lvchange.8.in
+++ b/man/lvchange.8.in
@@ -50,9 +50,11 @@ lvchange \(em change attributes of a logical volume
.RB [ \-\-metadataprofile
.IR ProfileName ]
.RB [ \-M | \-\-persistent
-.RI { y | n }]
+.RI { y | n }
.RB [ \-\-minor
.IR minor ]
+.RB [ \-\-major
+.IR major ]]
.RB [ \-P | \-\-partial ]
.RB [ \-p | \-\-permission
.RI { r | rw }]
@@ -165,6 +167,11 @@ See \fBlvm.conf\fP(5) for more information about \fBmetadata profiles\fP.
.B \-\-minor \fIminor
Set the minor number.
.TP
+.B \-\-major \fImajor
+Sets the major number. This option is supported only on older systems
+(kernel version 2.4) and is ignored on modern Linux systems where major
+numbers are dynamically assigned.
+.TP
.BR \-\-monitor " {" \fIy | \fIn }
Start or stop monitoring a mirrored or snapshot logical volume with
dmeventd, if it is installed.
diff --git a/man/lvcreate.8.in b/man/lvcreate.8.in
index 5440ced..ed0ed65 100644
--- a/man/lvcreate.8.in
+++ b/man/lvcreate.8.in
@@ -43,9 +43,11 @@ lvcreate \- create a logical volume in an existing volume group
.BR \-V | \-\-virtualsize
.IR VirtualSize [ bBsSkKmMgGtTpPeE ]}
.RB [ \-M | \-\-persistent
-.RI { y | n }]
+.RI { y | n }
.RB [ \-\-minor
.IR minor ]
+.RB [ \-\-major
+.IR major ]]
.RB [ \-m | \-\-mirrors
.IR Mirrors
.RB [ \-\-nosync ]
@@ -298,6 +300,11 @@ Set to \fIy\fP to make the minor number specified persistent.
.B \-\-minor \fIminor
Sets the minor number.
.TP
+.B \-\-major \fImajor
+Sets the major number. This option is supported only on older systems
+(kernel version 2.4) and is ignored on modern Linux systems where major
+numbers are dynamically assigned.
+.TP
.BR \-\-monitor " {" \fIy | \fIn }
Starts or avoids monitoring a mirrored, snapshot or thin pool logical volume with
dmeventd, if it is installed.
8 years, 6 months
master - backup: drops locked memory
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=e3cbdde070b25d...
Commit: e3cbdde070b25db30984efa0898f16c2555301d9
Parent: 702b6482154b0d8a9488c304081992f2d569f005
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 15:31:41 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 15:55:46 2014 +0200
backup: drops locked memory
Since we want to backup metadata, this is the point
we no longer want to hold memory locked.
---
lib/format_text/archiver.c | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/lib/format_text/archiver.c b/lib/format_text/archiver.c
index 2667bdb..a2f40f2 100644
--- a/lib/format_text/archiver.c
+++ b/lib/format_text/archiver.c
@@ -19,6 +19,7 @@
#include "lvm-string.h"
#include "lvmcache.h"
#include "lvmetad.h"
+#include "memlock.h"
#include "toolcontext.h"
#include "locking.h"
@@ -255,6 +256,9 @@ int backup_locally(struct volume_group *vg)
int backup(struct volume_group *vg)
{
+ /* Unlock memory if possible */
+ memlock_unlock(vg->cmd);
+
/* Don't back up orphan VGs. */
if (is_orphan_vg(vg->name))
return 1;
8 years, 6 months
master - cleanup: lvchange remove some extra code.
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=702b6482154b0d...
Commit: 702b6482154b0d8a9488c304081992f2d569f005
Parent: 3adc50ac22f5a3e355db5d143303c8b7dfb7c828
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 15:10:21 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 15:55:46 2014 +0200
cleanup: lvchange remove some extra code.
We do not need to restore LV content on error path - since
for reactivation we always use ondisk/commited metadata,
so passed data are never used.
Drop some unneded extra message, since the called function
repeated logs same info.
---
tools/lvchange.c | 20 ++------------------
1 files changed, 2 insertions(+), 18 deletions(-)
diff --git a/tools/lvchange.c b/tools/lvchange.c
index b196591..e520157 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -399,19 +399,8 @@ static int lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
return 0;
}
- if (!vg_write(lv->vg)) {
- log_error("Failed to write intermediate VG metadata.");
- if (!attach_metadata_devices(seg, &device_list))
- stack;
- if (!_reactivate_lv(lv, active, exclusive))
- stack;
- return 0;
- }
-
- if (!vg_commit(lv->vg)) {
- log_error("Failed to commit intermediate VG metadata.");
- if (!attach_metadata_devices(seg, &device_list))
- stack;
+ if (!vg_write(lv->vg) || !vg_commit(lv->vg)) {
+ log_error("Failed to update intermediate VG metadata on disk.");
if (!_reactivate_lv(lv, active, exclusive))
stack;
return 0;
@@ -428,10 +417,6 @@ static int lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
return 0;
}
- log_very_verbose("Clearing %s device %s",
- (seg_is_raid(seg)) ? "metadata" : "log",
- lvl->lv->name);
-
if (!wipe_lv(lvl->lv, (struct wipe_params)
{ .do_zero = 1, .zero_sectors = lvl->lv->size })) {
log_error("Unable to reset sync status for %s",
@@ -460,7 +445,6 @@ static int lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
return 0;
}
- log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
if (!vg_write(lv->vg) || !vg_commit(lv->vg)) {
log_error("Failed to update metadata on disk.");
return 0;
8 years, 6 months
master - lvchange: backup final metadata
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=3adc50ac22f5a3...
Commit: 3adc50ac22f5a3e355db5d143303c8b7dfb7c828
Parent: f09f85d027d8833727483efd6077f52d2e5b6ba2
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 15:16:26 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 15:55:34 2014 +0200
lvchange: backup final metadata
Shift backup after final metadata commit.
Synchronize with wiping.
---
WHATS_NEW | 1 +
tools/lvchange.c | 9 ++++++++-
2 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index a2c4577..c5ba9fa 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.112 -
=====================================
+ Backup final metadata after resync of mirror/raid.
Unify handling of --persistent option for lvcreate and lvchange.
Validate major and minor numbers stored in metadata.
Use -fPIE when linking -pie executables.
diff --git a/tools/lvchange.c b/tools/lvchange.c
index 8ccbe19..b196591 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -14,6 +14,7 @@
*/
#include "tools.h"
+#include "memlock.h"
static int lvchange_permission(struct cmd_context *cmd,
struct logical_volume *lv)
@@ -416,7 +417,8 @@ static int lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
return 0;
}
- backup(lv->vg);
+ /* No backup for intermediate metadata, so just unlock memory */
+ memlock_unlock(lv->vg->cmd);
dm_list_iterate_items(lvl, &device_list) {
if (!activate_lv_excl_local(cmd, lvl->lv)) {
@@ -449,6 +451,8 @@ static int lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
}
}
+ sync_local_dev_names(lv->vg->cmd); /* Wait until devices are away */
+
/* Put metadata sub-LVs back in place */
if (!attach_metadata_devices(seg, &device_list)) {
log_error("Failed to reattach %s device after clearing",
@@ -463,11 +467,14 @@ static int lvchange_resync(struct cmd_context *cmd, struct logical_volume *lv)
}
if (!_reactivate_lv(lv, active, exclusive)) {
+ backup(lv->vg);
log_error("Failed to reactivate %s after resync",
lv->name);
return 0;
}
+ backup(lv->vg);
+
return 1;
}
8 years, 6 months
master - tools: common handling of --persistent option
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=f09f85d027d883...
Commit: f09f85d027d8833727483efd6077f52d2e5b6ba2
Parent: 73f4fa6bc100e21562397627ea95a5e89443c1ab
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 14:57:02 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 15:54:20 2014 +0200
tools: common handling of --persistent option
Move common code for reading and processing
of --persistent arguments for lvcreate and lvchange
into lvmcmdline.
Reuse validate_major_minor() routine for validation.
Don't blindly activate LVs after change in cluster
and instead only local reactivation is supported.
(we have now many limited targets now).
Dropping 'sigint_caught()' handling, since
prompt() is resolving this case itself.
---
WHATS_NEW | 1 +
tools/lvchange.c | 103 +++++++++++++++++++++++-----------------------------
tools/lvcreate.c | 59 ++++++------------------------
tools/lvmcmdline.c | 61 +++++++++++++++++++++----------
tools/tools.h | 5 ++-
5 files changed, 103 insertions(+), 126 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 24e28c7..a2c4577 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.112 -
=====================================
+ Unify handling of --persistent option for lvcreate and lvchange.
Validate major and minor numbers stored in metadata.
Use -fPIE when linking -pie executables.
Enable cache segment type by default.
diff --git a/tools/lvchange.c b/tools/lvchange.c
index e0e3b03..8ccbe19 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -552,86 +552,73 @@ static int lvchange_readahead(struct cmd_context *cmd,
static int lvchange_persistent(struct cmd_context *cmd,
struct logical_volume *lv)
{
- struct lvinfo info;
- int active = 0;
- int32_t major, minor;
+ enum activation_change activate = CHANGE_AN;
+
+ if (!read_and_validate_major_minor(cmd, lv->vg->fid->fmt,
+ &lv->major, &lv->minor))
+ return_0;
- if (!arg_uint_value(cmd, persistent_ARG, 0)) {
+ if (lv->minor == -1) {
if (!(lv->status & FIXED_MINOR)) {
- log_error("Minor number is already not persistent "
- "for \"%s\"", lv->name);
+ log_error("Minor number is already not persistent for %s.",
+ display_lvname(lv));
return 0;
}
lv->status &= ~FIXED_MINOR;
- lv->minor = -1;
- lv->major = -1;
- log_verbose("Disabling persistent device number for \"%s\"",
- lv->name);
+ log_verbose("Disabling persistent device number for %s.",
+ display_lvname(lv));
} else {
- if (!arg_count(cmd, minor_ARG) && lv->minor < 0) {
- log_error("Minor number must be specified with -My");
- return 0;
- }
- if (arg_count(cmd, major_ARG) > 1) {
- log_error("Option -j/--major may not be repeated.");
- return 0;
- }
- if (arg_count(cmd, minor_ARG) > 1) {
- log_error("Option --minor may not be repeated.");
- return 0;
- }
- if (!arg_count(cmd, major_ARG) && lv->major < 0) {
- log_error("Major number must be specified with -My");
- return 0;
- }
- if (lv_info(cmd, lv, 0, &info, 0, 0) && info.exists)
- active = 1;
-
- major = arg_int_value(cmd, major_ARG, lv->major);
- minor = arg_int_value(cmd, minor_ARG, lv->minor);
- if (!major_minor_valid(cmd, lv->vg->fid->fmt, major, minor))
- return 0;
+ if (lv_is_active(lv)) {
+ if (!arg_count(cmd, force_ARG) &&
+ !arg_count(cmd, yes_ARG) &&
+ yes_no_prompt("Logical volume %s will be "
+ "deactivated temporarily. "
+ "Continue? [y/n]: ", lv->name) == 'n') {
+ log_error("%s device number not changed.",
+ display_lvname(lv));
+ return 0;
+ }
- if (active && !arg_count(cmd, force_ARG) &&
- !arg_count(cmd, yes_ARG) &&
- yes_no_prompt("Logical volume %s will be "
- "deactivated temporarily. "
- "Continue? [y/n]: ", lv->name) == 'n') {
- log_error("%s device number not changed.",
- lv->name);
- return 0;
+ activate = CHANGE_AEY;
+ if (vg_is_clustered(lv->vg) &&
+ locking_is_clustered() &&
+ locking_supports_remote_queries() &&
+ !lv_is_active_exclusive_locally(lv)) {
+ /* Reliable reactivate only locally */
+ log_print_unless_silent("Remotely active LV %s needs "
+ "individual reactivation.",
+ display_lvname(lv));
+ activate = CHANGE_ALY;
+ }
}
- if (sigint_caught())
- return_0;
-
- log_verbose("Ensuring %s is inactive.", lv->name);
+ /* Ensuring LV is not active */
if (!deactivate_lv(cmd, lv)) {
- log_error("%s: deactivation failed", lv->name);
+ log_error("Cannot deactivate %s.", display_lvname(lv));
return 0;
}
lv->status |= FIXED_MINOR;
- lv->minor = minor;
- lv->major = major;
- log_verbose("Setting persistent device number to (%d, %d) "
- "for \"%s\"", lv->major, lv->minor, lv->name);
-
+ log_verbose("Setting persistent device number to (%d, %d) for %s.",
+ lv->major, lv->minor, display_lvname(lv));
}
- log_very_verbose("Updating logical volume \"%s\" on disk(s)", lv->name);
+ log_very_verbose("Updating logical volume %s on disk(s).",
+ display_lvname(lv));
+
if (!vg_write(lv->vg) || !vg_commit(lv->vg))
return_0;
- backup(lv->vg);
-
- if (active) {
- log_verbose("Re-activating logical volume \"%s\"", lv->name);
- if (!activate_lv(cmd, lv)) {
- log_error("%s: reactivation failed", lv->name);
+ if (activate != CHANGE_AN) {
+ log_verbose("Re-activating logical volume %s", display_lvname(lv));
+ if (!lv_active_change(cmd, lv, activate)) {
+ log_error("%s: reactivation failed", display_lvname(lv));
+ backup(lv->vg);
return 0;
}
}
+ backup(lv->vg);
+
return 1;
}
diff --git a/tools/lvcreate.c b/tools/lvcreate.c
index 7870d4f..499d686 100644
--- a/tools/lvcreate.c
+++ b/tools/lvcreate.c
@@ -760,55 +760,18 @@ static int _read_activation_params(struct lvcreate_params *lp,
lp->wipe_signatures = 0;
}
- if (arg_count(cmd, major_ARG) > 1) {
- log_error("Option -j/--major may not be repeated.");
- return 0;
- }
-
- if (arg_count(cmd, minor_ARG) > 1) {
- log_error("Option --minor may not be repeated.");
- return 0;
- }
-
- lp->minor = arg_int_value(cmd, minor_ARG, -1);
- lp->major = arg_int_value(cmd, major_ARG, -1);
-
- /* Persistent minor */
- if (arg_count(cmd, persistent_ARG)) {
+ /* Persistent minor (and major) */
+ if (arg_is_set(cmd, persistent_ARG)) {
if (lp->create_pool && !lp->thin) {
log_error("--persistent is not permitted when creating a thin pool device.");
return 0;
}
- if (!strcmp(arg_str_value(cmd, persistent_ARG, "n"), "y")) {
- if (lp->minor == -1) {
- log_error("Please specify minor number with "
- "--minor when using -My");
- return 0;
- }
- if (!strncmp(cmd->kernel_vsn, "2.4.", 4)) {
- if (lp->major == -1) {
- log_error("Please specify major number with "
- "--major when using -My");
- return 0;
- }
- } else {
- if (lp->major >= 0)
- log_warn("Ignoring supplied major number - kernel assigns "
- "major numbers dynamically. Using major number %d instead.",
- cmd->dev_types->device_mapper_major);
- lp->major = cmd->dev_types->device_mapper_major;
- }
- if (!major_minor_valid(cmd, vg->fid->fmt, lp->major, lp->minor))
- return 0;
- } else {
- if ((lp->minor != -1) || (lp->major != -1)) {
- log_error("--major and --minor incompatible "
- "with -Mn");
- return 0;
- }
- }
- } else if (arg_count(cmd, minor_ARG) || arg_count(cmd, major_ARG)) {
- log_error("--major and --minor require -My");
+
+ if (!read_and_validate_major_minor(cmd, vg->fid->fmt,
+ &lp->major, &lp->minor))
+ return_0;
+ } else if (arg_is_set(cmd, major_ARG) || arg_is_set(cmd, minor_ARG)) {
+ log_error("--major and --minor require -My.");
return 0;
}
@@ -844,7 +807,6 @@ static int _lvcreate_params(struct lvcreate_params *lp,
const char *segtype_str;
const char *tag;
- memset(lp, 0, sizeof(*lp));
memset(lcp, 0, sizeof(*lcp));
dm_list_init(&lp->tags);
lp->target_attr = ~0;
@@ -1248,7 +1210,10 @@ static int _validate_internal_thin_processing(const struct lvcreate_params *lp)
int lvcreate(struct cmd_context *cmd, int argc, char **argv)
{
int r = ECMD_FAILED;
- struct lvcreate_params lp;
+ struct lvcreate_params lp = {
+ .major = -1,
+ .minor = -1,
+ };
struct lvcreate_cmdline_params lcp;
struct volume_group *vg;
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index d90ef91..9a5cc3a 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -576,32 +576,55 @@ int metadatacopies_arg(struct cmd_context *cmd, struct arg_values *av)
return int_arg(cmd, av);
}
-int major_minor_valid(const struct cmd_context *cmd, const struct format_type *fmt,
- int32_t major, int32_t minor)
+int read_and_validate_major_minor(const struct cmd_context *cmd,
+ const struct format_type *fmt,
+ int32_t *major, int32_t *minor)
{
- if (!strncmp(cmd->kernel_vsn, "2.4.", 4) ||
- (fmt->features & FMT_RESTRICTED_LVIDS)) {
- if (major < 0 || major > 255) {
- log_error("Major number outside range 0-255");
+ if (strcmp(arg_str_value(cmd, persistent_ARG, "n"), "y")) {
+ if (arg_is_set(cmd, minor_ARG) || arg_is_set(cmd, major_ARG)) {
+ log_error("--major and --minor incompatible with -Mn");
return 0;
}
- if (minor < 0 || minor > 255) {
- log_error("Minor number outside range 0-255");
- return 0;
- }
- } else {
- /* 12 bits for major number */
- if (major < 0 || major > 4095) {
- log_error("Major number outside range 0-4095");
- return 0;
- }
- /* 20 bits for minor number */
- if (minor < 0 || minor > 1048575) {
- log_error("Minor number outside range 0-1048575");
+ *major = *minor = -1;
+ return 1;
+ }
+
+ if (arg_count(cmd, minor_ARG) > 1) {
+ log_error("Option --minor may not be repeated.");
+ return 0;
+ }
+
+ if (arg_count(cmd, major_ARG) > 1) {
+ log_error("Option -j/--major may not be repeated.");
+ return 0;
+ }
+
+ if (!strncmp(cmd->kernel_vsn, "2.4.", 4)) {
+ /* Major is required for 2.4 */
+ if (!arg_is_set(cmd, major_ARG)) {
+ log_error("Please specify major number with "
+ "--major when using -My");
return 0;
}
+ *major = arg_int_value(cmd, major_ARG, -1);
+ } else if (arg_is_set(cmd, major_ARG)) {
+ log_warn("WARNING: Ignoring supplied major number - "
+ "kernel assigns major numbers dynamically. "
+ "Using major number %d instead.",
+ cmd->dev_types->device_mapper_major);
+ *major = cmd->dev_types->device_mapper_major;
}
+ if (!arg_is_set(cmd, minor_ARG)) {
+ log_error("Please specify minor number with --minor when using -My.");
+ return 0;
+ }
+
+ *minor = arg_int_value(cmd, minor_ARG, -1);
+
+ if (!validate_major_minor(cmd, fmt, *major, *minor))
+ return_0;
+
return 1;
}
diff --git a/tools/tools.h b/tools/tools.h
index 51c6a4e..cbea1fa 100644
--- a/tools/tools.h
+++ b/tools/tools.h
@@ -138,8 +138,9 @@ int segtype_arg(struct cmd_context *cmd, struct arg_values *av);
int alloc_arg(struct cmd_context *cmd, struct arg_values *av);
int readahead_arg(struct cmd_context *cmd, struct arg_values *av);
int metadatacopies_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av);
-int major_minor_valid(const struct cmd_context * cmd, const struct format_type *fmt,
- int32_t major, int32_t minor);
+int read_and_validate_major_minor(const struct cmd_context *cmd,
+ const struct format_type *fmt,
+ int32_t *major, int32_t *minor);
/* we use the enums to access the switches */
unsigned arg_count(const struct cmd_context *cmd, int a);
8 years, 6 months
master - metadata: validate major, minor numbers
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=73f4fa6bc100e2...
Commit: 73f4fa6bc100e21562397627ea95a5e89443c1ab
Parent: 656ba3a744af5548ee0a5983590698aeee3dd326
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Sep 19 14:51:41 2014 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Sep 19 15:53:27 2014 +0200
metadata: validate major, minor numbers
Validate major, minor numbers after reading them from metadata.
---
WHATS_NEW | 1 +
lib/format_text/import_vsn1.c | 33 +++++++++++++++++-----------
lib/metadata/metadata-exported.h | 3 ++
lib/metadata/metadata.c | 43 ++++++++++++++++++++++++++++++++++++++
4 files changed, 67 insertions(+), 13 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index e06fcc2..24e28c7 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.112 -
=====================================
+ Validate major and minor numbers stored in metadata.
Use -fPIE when linking -pie executables.
Enable cache segment type by default.
Ensure only supported volume types are used with cache segments.
diff --git a/lib/format_text/import_vsn1.c b/lib/format_text/import_vsn1.c
index 174b3bf..580349f 100644
--- a/lib/format_text/import_vsn1.c
+++ b/lib/format_text/import_vsn1.c
@@ -635,7 +635,7 @@ static int _read_lvnames(struct format_instance *fid __attribute__((unused)),
return 1;
}
-static int _read_lvsegs(struct format_instance *fid __attribute__((unused)),
+static int _read_lvsegs(struct format_instance *fid,
struct volume_group *vg, const struct dm_config_node *lvn,
const struct dm_config_node *vgn __attribute__((unused)),
struct dm_hash_table *pv_hash,
@@ -668,20 +668,27 @@ static int _read_lvsegs(struct format_instance *fid __attribute__((unused)),
return_0;
lv->size = (uint64_t) lv->le_count * (uint64_t) vg->extent_size;
-
lv->minor = -1;
- if ((lv->status & FIXED_MINOR) &&
- !_read_int32(lvn, "minor", &lv->minor)) {
- log_error("Couldn't read minor number for logical "
- "volume %s.", lv->name);
- return 0;
- }
-
lv->major = -1;
- if ((lv->status & FIXED_MINOR) &&
- !_read_int32(lvn, "major", &lv->major)) {
- log_error("Couldn't read major number for logical "
- "volume %s.", lv->name);
+
+ if (lv->status & FIXED_MINOR) {
+ if (!_read_int32(lvn, "minor", &lv->minor)) {
+ log_error("Couldn't read minor number for logical "
+ "volume %s.", lv->name);
+ return 0;
+ }
+
+ if (!_read_int32(lvn, "major", &lv->major)) {
+ log_error("Couldn't read major number for logical "
+ "volume %s.", lv->name);
+ return 0;
+ }
+
+ if (!validate_major_minor(vg->cmd, fid->fmt, lv->major, lv->minor)) {
+ log_error("Logical volume %s does not have a valid major, minor number.",
+ lv->name);
+ return 0;
+ }
}
return 1;
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 935d3f7..aa0edcf 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -1136,6 +1136,9 @@ struct vgcreate_params {
uint32_t vgmetadatacopies;
};
+int validate_major_minor(const struct cmd_context *cmd,
+ const struct format_type *fmt,
+ int32_t major, int32_t minor);
int vgcreate_params_validate(struct cmd_context *cmd,
struct vgcreate_params *vp);
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 2900ccc..0842563 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -837,6 +837,49 @@ const char *strip_dir(const char *vg_name, const char *dev_dir)
}
/*
+ * Validates major and minor numbers.
+ * On >2.4 kernel we only support dynamic major number.
+ */
+int validate_major_minor(const struct cmd_context *cmd,
+ const struct format_type *fmt,
+ int32_t major, int32_t minor)
+{
+ int r = 1;
+
+ if (!strncmp(cmd->kernel_vsn, "2.4.", 4) ||
+ (fmt->features & FMT_RESTRICTED_LVIDS)) {
+ if (major < 0 || major > 255) {
+ log_error("Major number %d outside range 0-255.", major);
+ r = 0;
+ }
+ if (minor < 0 || minor > 255) {
+ log_error("Minor number %d outside range 0-255.", minor);
+ r = 0;
+ }
+ } else {
+ /* 12 bits for major number */
+ if ((major != -1) &&
+ (major != cmd->dev_types->device_mapper_major)) {
+ /* User supplied some major number */
+ if (major < 0 || major > 4095) {
+ log_error("Major number %d outside range 0-4095.", major);
+ r = 0;
+ } else
+ log_print_unless_silent("Ignoring supplied major %d number - "
+ "kernel assigns major numbers dynamically.",
+ major);
+ }
+ /* 20 bits for minor number */
+ if (minor < 0 || minor > 1048575) {
+ log_error("Minor number %d outside range 0-1048575.", minor);
+ r = 0;
+ }
+ }
+
+ return r;
+}
+
+/*
* Validate parameters to vg_create() before calling.
* FIXME: Move inside vg_create library function.
* FIXME: Change vgcreate_params struct to individual gets/sets
8 years, 6 months