stable-2.02 - cov: check for socket_path being set
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=5cf1c61152bfd5f1eef...
Commit: 5cf1c61152bfd5f1eef7f49509a877090f4cc26f
Parent: 2cd6cd34394cb25d312c73b979f4e536d431c10b
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jun 25 15:11:05 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jun 25 17:33:25 2019 +0200
cov: check for socket_path being set
As we check for existince on entering path
let's ensure it's there also on exit path.
---
libdaemon/server/daemon-server.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/libdaemon/server/daemon-server.c b/libdaemon/server/daemon-server.c
index 79b54d0..bc58f7b 100644
--- a/libdaemon/server/daemon-server.c
+++ b/libdaemon/server/daemon-server.c
@@ -693,7 +693,7 @@ void daemon_start(daemon_state s)
out:
/* If activated by systemd, do not unlink the socket - systemd takes care of that! */
if (!_systemd_activation && s.socket_fd >= 0)
- if (unlink(s.socket_path))
+ if (s.socket_path && unlink(s.socket_path))
perror("unlink error");
if (s.socket_fd >= 0)
4 years, 10 months
stable-2.02 - cov: check lv_info
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=2cd6cd34394cb25d312...
Commit: 2cd6cd34394cb25d312c73b979f4e536d431c10b
Parent: 82e7426028a90fff891e0b3fafa15826758e18e8
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jun 25 14:52:19 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jun 25 17:32:44 2019 +0200
cov: check lv_info
Use lv_info results only when valid.
---
lib/label/label.c | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/lib/label/label.c b/lib/label/label.c
index 6d8156e..83b4d99 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -1139,10 +1139,11 @@ void label_scan_invalidate_lv(struct cmd_context *cmd, struct logical_volume *lv
struct device *dev;
dev_t devt;
- lv_info(cmd, lv, 0, &lvinfo, 0, 0);
- devt = MKDEV(lvinfo.major, lvinfo.minor);
- if ((dev = dev_cache_get_by_devt(devt, NULL)))
- label_scan_invalidate(dev);
+ if (lv_info(cmd, lv, 0, &lvinfo, 0, 0)) {
+ devt = MKDEV(lvinfo.major, lvinfo.minor);
+ if ((dev = dev_cache_get_by_devt(devt, NULL)))
+ label_scan_invalidate(dev);
+ }
}
/*
4 years, 10 months
stable-2.02 - cov: check result of dev_get_block_size
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=82e7426028a90fff891...
Commit: 82e7426028a90fff891e0b3fafa15826758e18e8
Parent: 862899cc88e1697211d478de58b2ddc0eaec9cd9
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jun 25 14:56:07 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jun 25 17:32:44 2019 +0200
cov: check result of dev_get_block_size
---
lib/label/label.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/lib/label/label.c b/lib/label/label.c
index 9a3f8df..6d8156e 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -1498,7 +1498,10 @@ void dev_set_last_byte(struct device *dev, uint64_t offset)
unsigned int phys_block_size = 0;
unsigned int block_size = 0;
- dev_get_block_size(dev, &phys_block_size, &block_size);
+ if (!dev_get_block_size(dev, &phys_block_size, &block_size)) {
+ stack;
+ return; /* FIXME: error path ? */
+ }
bcache_set_last_byte(scan_bcache, dev->bcache_fd, offset, phys_block_size);
}
4 years, 10 months
stable-2.02 - cov: check result of dev_read_bytes
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=862899cc88e1697211d...
Commit: 862899cc88e1697211d478de58b2ddc0eaec9cd9
Parent: 09aafb61e31c3781530795057c87afaeb53a2bd4
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jun 25 14:50:05 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jun 25 17:32:44 2019 +0200
cov: check result of dev_read_bytes
---
lib/format_text/format-text.c | 14 ++++++++++++--
1 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index b9d85a4..a09c349 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -468,7 +468,12 @@ static struct raw_locn *_read_metadata_location_vg(struct device_area *dev_area,
*/
memset(vgnamebuf, 0, sizeof(vgnamebuf));
- dev_read_bytes(dev_area->dev, dev_area->start + rlocn->offset, NAME_LEN, vgnamebuf);
+ if (!dev_read_bytes(dev_area->dev, dev_area->start + rlocn->offset, NAME_LEN, vgnamebuf)) {
+ log_error("Failed to read metadata location vg %s at %llu",
+ dev_name(dev_area->dev),
+ (unsigned long long)dev_area->start + rlocn->offset);
+ return 0;
+ }
if (!strncmp(vgnamebuf, vgname, len = strlen(vgname)) &&
(isspace(vgnamebuf[len]) || vgnamebuf[len] == '{'))
@@ -1229,7 +1234,12 @@ int read_metadata_location_summary(const struct format_type *fmt,
return 0;
}
- dev_read_bytes(dev_area->dev, dev_area->start + rlocn->offset, NAME_LEN, buf);
+ if (!dev_read_bytes(dev_area->dev, dev_area->start + rlocn->offset, NAME_LEN, buf)) {
+ log_error("Can't read metadata location on %s at %llu.",
+ dev_name(dev_area->dev),
+ (unsigned long long)(dev_area->start + rlocn->offset));
+ return 0;
+ }
while (buf[len] && !isspace(buf[len]) && buf[len] != '{' &&
len < (NAME_LEN - 1))
4 years, 10 months
stable-2.02 - cov: release iterator on error path
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=09aafb61e31c3781530...
Commit: 09aafb61e31c3781530795057c87afaeb53a2bd4
Parent: 3b42cdad0c27d79766c7e9aae50d13cd93a2ffbf
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jun 25 15:37:01 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jun 25 17:32:44 2019 +0200
cov: release iterator on error path
---
lib/label/label.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/lib/label/label.c b/lib/label/label.c
index 4f8e135..9a3f8df 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -866,8 +866,11 @@ int label_scan(struct cmd_context *cmd)
}
while ((dev = dev_iter_get(iter))) {
- if (!(devl = dm_zalloc(sizeof(*devl))))
+ if (!(devl = dm_zalloc(sizeof(*devl)))) {
+ log_error("Failed to allocated device list.");
+ dev_iter_destroy(iter);
return 0;
+ }
devl->dev = dev;
dm_list_add(&all_devs, &devl->list);
4 years, 10 months
stable-2.02 - cov: unlock lvm2 mutex on error path
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=3b42cdad0c27d79766c...
Commit: 3b42cdad0c27d79766c7e9aae50d13cd93a2ffbf
Parent: 49813abc003180a38f9cd1e6c75f68311d005a50
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Jun 25 15:26:30 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Jun 25 17:31:39 2019 +0200
cov: unlock lvm2 mutex on error path
Add missing unlock call on theretical error path where
we would be missing our configured command.
---
daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c b/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c
index 5be11f1..be58aac 100644
--- a/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c
+++ b/daemons/dmeventd/plugins/lvm2/dmeventd_lvm.c
@@ -159,6 +159,7 @@ int dmeventd_lvm2_command(struct dm_pool *mem, char *buffer, size_t size,
dmeventd_lvm2_lock();
if (!dmeventd_lvm2_run(cmd) ||
!(env = getenv(cmd))) {
+ dmeventd_lvm2_unlock();
log_error("Unable to find configured command.");
return 0;
}
4 years, 10 months
stable-2.02 - tests: for cluster always use exlusive mirrors
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=49813abc003180a38f9...
Commit: 49813abc003180a38f9cd1e6c75f68311d005a50
Parent: 788d89c4127f69c813813e6a192fe44d8c1abc7a
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Fri Jun 21 14:51:17 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Fri Jun 21 14:51:17 2019 +0200
tests: for cluster always use exlusive mirrors
So to check the reason of failure is not influenced by missing cmirrord.
---
test/shell/lvcreate-usage.sh | 10 +++++-----
1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/test/shell/lvcreate-usage.sh b/test/shell/lvcreate-usage.sh
index ca8694e..4669539 100644
--- a/test/shell/lvcreate-usage.sh
+++ b/test/shell/lvcreate-usage.sh
@@ -91,12 +91,12 @@ lvremove -ff $vg/$lv3
lvchange -an $vg/$lv1
lvcreate -l1 -s -n $lv3 $vg/$lv1
fail lvcreate -l1 -n $lv4 $vg
-fail lvcreate -l1 --type mirror -m1 -n $lv4 $vg
+fail lvcreate -aey -l1 --type mirror -m1 -n $lv4 $vg
lvremove -ff $vg/$lv3
lvcreate -aey -l1 --type mirror -m1 -n $lv3 $vg
not lvcreate -l1 -n $lv4 $vg
-not lvcreate -l1 --type mirror -m1 -n $lv4 $vg
+not lvcreate -aey -l1 --type mirror -m1 -n $lv4 $vg
lvconvert -m0 $vg/$lv3
lvconvert -m2 --type mirror -i 1 $vg/$lv3
@@ -128,10 +128,10 @@ lvremove -f $vg
# - nonzero (bz186013)
# - a power of 2 and a multiple of page size
# - <= size of LV
-invalid lvcreate --type mirror -m 1 -L 32m -n $lv -R 0 $vg 2>err
+invalid lvcreate -aey --type mirror -m 1 -L 32m -n $lv -R 0 $vg 2>err
grep "may not be zero" err
-invalid lvcreate --type mirror -m 1 -L 32m -n $lv -R 11k $vg
-invalid lvcreate --type mirror -m 1 -L 32m -n $lv -R 1k $vg
+invalid lvcreate -aey --type mirror -m 1 -L 32m -n $lv -R 11k $vg
+invalid lvcreate -aey --type mirror -m 1 -L 32m -n $lv -R 1k $vg
lvcreate -aey -L 32m -n $lv --regionsize 128m --type mirror -m 1 $vg
check lv_field $vg/$lv regionsize "32.00m"
lvremove -f $vg
4 years, 10 months
stable-2.02 - tests: accept also value 512
by Zdenek Kabelac
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=788d89c4127f69c8138...
Commit: 788d89c4127f69c813813e6a192fe44d8c1abc7a
Parent: e0a176f49ab09d2afaea73cafa4d7b41ade0c345
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Thu Jun 20 14:20:35 2019 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Thu Jun 20 14:20:35 2019 +0200
tests: accept also value 512
Older kernels provide fixed value 512 instead of 0.
---
test/shell/lvchange-cache.sh | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/test/shell/lvchange-cache.sh b/test/shell/lvchange-cache.sh
index ab7c8b0..93c8c3b 100644
--- a/test/shell/lvchange-cache.sh
+++ b/test/shell/lvchange-cache.sh
@@ -88,7 +88,8 @@ grep 'random_threshold=4' out
else
# When MQ is emulated by SMQ policy it does not hold settings.
# So just skip testing of param changes when sequential_threshold=0
-grep 'sequential_threshold=0' out
+# or some older kernel instancies show also value 512
+grep 'sequential_threshold=0' out || grep 'sequential_threshold=512' out
fi
fi # have_cache 1 5 0
4 years, 10 months
master - scanning: open devs rw when rescanning for write
by David Teigland
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=d16142f90fdcf2aef42...
Commit: d16142f90fdcf2aef42a51ecabd0c4ff11733d7c
Parent: 8fecd9c14e0b3f62cc4de6ddac0a015db687b335
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Tue Jun 11 16:17:24 2019 -0500
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Fri Jun 21 10:57:49 2019 -0500
scanning: open devs rw when rescanning for write
When vg_read rescans devices with the intention of
writing the VG, the label rescan can open the devs
RW so they do not need to be closed and reopened
RW in dev_write_bytes.
---
lib/cache/lvmcache.c | 17 ++++++++-
lib/cache/lvmcache.h | 1 +
lib/label/label.c | 32 ++++++++++++++++-
lib/label/label.h | 1 +
lib/metadata/metadata-exported.h | 5 ++-
lib/metadata/metadata.c | 72 ++++++++++++++++++++++++-------------
tools/lvchange.c | 2 +-
tools/pvscan.c | 2 +-
tools/vgchange.c | 4 ++-
9 files changed, 103 insertions(+), 33 deletions(-)
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 1d92e01..e2d19e8 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -772,7 +772,7 @@ next:
* to that VG after a scan.
*/
-int lvmcache_label_rescan_vg(struct cmd_context *cmd, const char *vgname, const char *vgid)
+static int _label_rescan_vg(struct cmd_context *cmd, const char *vgname, const char *vgid, int rw)
{
struct dm_list devs;
struct device_list *devl, *devl2;
@@ -804,7 +804,10 @@ int lvmcache_label_rescan_vg(struct cmd_context *cmd, const char *vgname, const
/* FIXME: should we also rescan unused_duplicate_devs for devs
being rescanned here and then repeat resolving the duplicates? */
- label_scan_devs(cmd, cmd->filter, &devs);
+ if (rw)
+ label_scan_devs_rw(cmd, cmd->filter, &devs);
+ else
+ label_scan_devs(cmd, cmd->filter, &devs);
dm_list_iterate_items_safe(devl, devl2, &devs) {
dm_list_del(&devl->list);
@@ -819,6 +822,16 @@ int lvmcache_label_rescan_vg(struct cmd_context *cmd, const char *vgname, const
return 1;
}
+int lvmcache_label_rescan_vg(struct cmd_context *cmd, const char *vgname, const char *vgid)
+{
+ return _label_rescan_vg(cmd, vgname, vgid, 0);
+}
+
+int lvmcache_label_rescan_vg_rw(struct cmd_context *cmd, const char *vgname, const char *vgid)
+{
+ return _label_rescan_vg(cmd, vgname, vgid, 1);
+}
+
/*
* Uses label_scan to populate lvmcache with 'vginfo' struct for each VG
* and associated 'info' structs for those VGs. Only VG summary information
diff --git a/lib/cache/lvmcache.h b/lib/cache/lvmcache.h
index 5b78d7a..e2d967c 100644
--- a/lib/cache/lvmcache.h
+++ b/lib/cache/lvmcache.h
@@ -71,6 +71,7 @@ void lvmcache_destroy(struct cmd_context *cmd, int retain_orphans, int reset);
int lvmcache_label_scan(struct cmd_context *cmd);
int lvmcache_label_rescan_vg(struct cmd_context *cmd, const char *vgname, const char *vgid);
+int lvmcache_label_rescan_vg_rw(struct cmd_context *cmd, const char *vgname, const char *vgid);
/* Add/delete a device */
struct lvmcache_info *lvmcache_add(struct labeller *labeller, const char *pvid,
diff --git a/lib/label/label.c b/lib/label/label.c
index a8d87ec..185e51b 100644
--- a/lib/label/label.c
+++ b/lib/label/label.c
@@ -1118,7 +1118,37 @@ int label_scan_devs(struct cmd_context *cmd, struct dev_filter *f, struct dm_lis
_scan_list(cmd, f, devs, NULL);
- /* FIXME: this function should probably fail if any devs couldn't be scanned */
+ return 1;
+}
+
+/*
+ * This function is used when the caller plans to write to the devs, so opening
+ * them RW during rescan avoids needing to close and reopen with WRITE in
+ * dev_write_bytes.
+ */
+
+int label_scan_devs_rw(struct cmd_context *cmd, struct dev_filter *f, struct dm_list *devs)
+{
+ struct device_list *devl;
+
+ if (!scan_bcache) {
+ if (!_setup_bcache(0))
+ return 0;
+ }
+
+ dm_list_iterate_items(devl, devs) {
+ if (_in_bcache(devl->dev)) {
+ bcache_invalidate_fd(scan_bcache, devl->dev->bcache_fd);
+ _scan_dev_close(devl->dev);
+ }
+ /*
+ * With this flag set, _scan_dev_open() done by
+ * _scan_list() will do open RW
+ */
+ devl->dev->flags |= DEV_BCACHE_WRITE;
+ }
+
+ _scan_list(cmd, f, devs, NULL);
return 1;
}
diff --git a/lib/label/label.h b/lib/label/label.h
index 07bb77d..f06b7df 100644
--- a/lib/label/label.h
+++ b/lib/label/label.h
@@ -104,6 +104,7 @@ extern struct bcache *scan_bcache;
int label_scan(struct cmd_context *cmd);
int label_scan_devs(struct cmd_context *cmd, struct dev_filter *f, struct dm_list *devs);
+int label_scan_devs_rw(struct cmd_context *cmd, struct dev_filter *f, struct dm_list *devs);
int label_scan_devs_excl(struct dm_list *devs);
void label_scan_invalidate(struct device *dev);
void label_scan_invalidate_lv(struct cmd_context *cmd, struct logical_volume *lv);
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 9029d3f..966c88f 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -184,8 +184,9 @@
#define READ_ALLOW_EXPORTED 0x00020000U
#define READ_OK_NOTFOUND 0x00040000U
#define READ_WARN_INCONSISTENT 0x00080000U
-#define READ_FOR_UPDATE 0x00100000U /* A meta-flag, useful with toollib for_each_* functions. */
-#define PROCESS_SKIP_SCAN 0x00200000U /* skip lvmcache_label_scan in process_each_pv */
+#define READ_FOR_UPDATE 0x00100000U /* command tells vg_read it plans to write the vg */
+#define PROCESS_SKIP_SCAN 0x00200000U /* skip lvmcache_label_scan in process_each_pv */
+#define READ_FOR_ACTIVATE 0x00400000U /* command tells vg_read it plans to activate the vg */
/* vg_read returns these in error_flags */
#define FAILED_NOT_ENABLED 0x00000001U
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 039a7d6..7b0d6ce 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -4476,7 +4476,8 @@ void vg_write_commit_bad_mdas(struct cmd_context *cmd, struct volume_group *vg)
static struct volume_group *_vg_read(struct cmd_context *cmd,
const char *vgname,
const char *vgid,
- unsigned precommitted)
+ unsigned precommitted,
+ int writing)
{
const struct format_type *fmt = cmd->fmt;
struct format_instance *fid = NULL;
@@ -4530,8 +4531,11 @@ static struct volume_group *_vg_read(struct cmd_context *cmd,
* we can also skip the rescan in that case.
*/
if (!cmd->can_use_one_scan || lvmcache_scan_mismatch(cmd, vgname, vgid)) {
- log_debug_metadata("Rescanning devices for %s", vgname);
- lvmcache_label_rescan_vg(cmd, vgname, vgid);
+ log_debug_metadata("Rescanning devices for %s %s", vgname, writing ? "rw" : "");
+ if (writing)
+ lvmcache_label_rescan_vg_rw(cmd, vgname, vgid);
+ else
+ lvmcache_label_rescan_vg(cmd, vgname, vgid);
} else {
log_debug_metadata("Skipped rescanning devices for %s", vgname);
}
@@ -4752,6 +4756,7 @@ struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name, const
int missing_pv_flag = 0;
uint32_t failure = 0;
int writing = (read_flags & READ_FOR_UPDATE);
+ int activating = (read_flags & READ_FOR_ACTIVATE);
if (is_orphan_vg(vg_name)) {
log_very_verbose("Reading orphan VG %s", vg_name);
@@ -4766,13 +4771,23 @@ struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name, const
return NULL;
}
- if (!lock_vol(cmd, vg_name, writing ? LCK_VG_WRITE : LCK_VG_READ, NULL)) {
+ /*
+ * When a command is reading the VG with the intention of eventually
+ * writing it, it passes the READ_FOR_UPDATE flag. This causes vg_read
+ * to acquire an exclusive VG lock, and causes vg_read to do some more
+ * checks, e.g. that the VG is writable and not exported. It also
+ * means that when the label scan is repeated on the VG's devices, the
+ * VG's PVs can be reopened read-write when rescanning in anticipation
+ * of needing to write to them.
+ */
+
+ if (!lock_vol(cmd, vg_name, (writing || activating) ? LCK_VG_WRITE : LCK_VG_READ, NULL)) {
log_error("Can't get lock for %s", vg_name);
failure |= FAILED_LOCKING;
goto_bad;
}
- if (!(vg = _vg_read(cmd, vg_name, vgid, 0))) {
+ if (!(vg = _vg_read(cmd, vg_name, vgid, 0, writing))) {
/* Some callers don't care if the VG doesn't exist and don't want an error message. */
if (!(read_flags & READ_OK_NOTFOUND))
log_error("Volume group \"%s\" not found", vg_name);
@@ -4883,29 +4898,36 @@ struct volume_group *vg_read(struct cmd_context *cmd, const char *vg_name, const
goto_bad;
}
- if (writing && !(read_flags & READ_ALLOW_EXPORTED) && vg_is_exported(vg)) {
- log_error("Volume group %s is exported", vg->name);
- failure |= FAILED_EXPORTED;
- goto_bad;
- }
+ /*
+ * If the command intends to write or activate the VG, there are
+ * additional restrictions. FIXME: These restrictions should
+ * probably be checked/applied after vg_read returns.
+ */
+ if (writing || activating) {
+ if (!(read_flags & READ_ALLOW_EXPORTED) && vg_is_exported(vg)) {
+ log_error("Volume group %s is exported", vg->name);
+ failure |= FAILED_EXPORTED;
+ goto_bad;
+ }
- if (writing && !(vg->status & LVM_WRITE)) {
- log_error("Volume group %s is read-only", vg->name);
- failure |= FAILED_READ_ONLY;
- goto_bad;
- }
+ if (!(vg->status & LVM_WRITE)) {
+ log_error("Volume group %s is read-only", vg->name);
+ failure |= FAILED_READ_ONLY;
+ goto_bad;
+ }
- if (!cmd->handles_missing_pvs && (missing_pv_dev || missing_pv_flag) && writing) {
- log_error("Cannot change VG %s while PVs are missing.", vg->name);
- log_error("See vgreduce --removemissing and vgextend --restoremissing.");
- failure |= FAILED_NOT_ENABLED;
- goto_bad;
- }
+ if (!cmd->handles_missing_pvs && (missing_pv_dev || missing_pv_flag)) {
+ log_error("Cannot change VG %s while PVs are missing.", vg->name);
+ log_error("See vgreduce --removemissing and vgextend --restoremissing.");
+ failure |= FAILED_NOT_ENABLED;
+ goto_bad;
+ }
- if (!cmd->handles_unknown_segments && vg_has_unknown_segments(vg) && writing) {
- log_error("Cannot change VG %s with unknown segments in it!", vg->name);
- failure |= FAILED_NOT_ENABLED; /* FIXME new failure code here? */
- goto_bad;
+ if (!cmd->handles_unknown_segments && vg_has_unknown_segments(vg)) {
+ log_error("Cannot change VG %s with unknown segments in it!", vg->name);
+ failure |= FAILED_NOT_ENABLED; /* FIXME new failure code here? */
+ goto_bad;
+ }
}
/*
diff --git a/tools/lvchange.c b/tools/lvchange.c
index 7bdf997..e7fb57d 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -1435,7 +1435,7 @@ int lvchange_activate_cmd(struct cmd_context *cmd, int argc, char **argv)
} else /* Component LVs might be active, support easy deactivation */
cmd->process_component_lvs = 1;
- ret = process_each_lv(cmd, argc, argv, NULL, NULL, READ_FOR_UPDATE,
+ ret = process_each_lv(cmd, argc, argv, NULL, NULL, READ_FOR_ACTIVATE,
NULL, &_lvchange_activate_check, &_lvchange_activate_single);
if (ret != ECMD_PROCESSED)
diff --git a/tools/pvscan.c b/tools/pvscan.c
index d41345f..12711cb 100644
--- a/tools/pvscan.c
+++ b/tools/pvscan.c
@@ -900,7 +900,7 @@ static int _pvscan_aa(struct cmd_context *cmd, struct pvscan_aa_params *pp,
return ECMD_PROCESSED;
}
- ret = process_each_vg(cmd, 0, NULL, NULL, vgnames, READ_FOR_UPDATE, 0, handle, _pvscan_aa_single);
+ ret = process_each_vg(cmd, 0, NULL, NULL, vgnames, READ_FOR_ACTIVATE, 0, handle, _pvscan_aa_single);
destroy_processing_handle(cmd, handle);
diff --git a/tools/vgchange.c b/tools/vgchange.c
index a17f456..aad6db3 100644
--- a/tools/vgchange.c
+++ b/tools/vgchange.c
@@ -800,8 +800,10 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
cmd->lockd_vg_enforce_sh = 1;
}
- if (update || arg_is_set(cmd, activate_ARG))
+ if (update)
flags |= READ_FOR_UPDATE;
+ else if (arg_is_set(cmd, activate_ARG))
+ flags |= READ_FOR_ACTIVATE;
if (!(handle = init_processing_handle(cmd, NULL))) {
log_error("Failed to initialize processing handle.");
4 years, 10 months
master - metadata: include description with command in metadata areas
by David Teigland
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=8fecd9c14e0b3f62cc4...
Commit: 8fecd9c14e0b3f62cc4de6ddac0a015db687b335
Parent: 82b137ef2f7f1b6fc1bbf83918750037835a9568
Author: David Teigland <teigland(a)redhat.com>
AuthorDate: Tue Jun 18 16:10:06 2019 -0500
Committer: David Teigland <teigland(a)redhat.com>
CommitterDate: Thu Jun 20 16:09:05 2019 -0500
metadata: include description with command in metadata areas
Previously the VG metadata description field (which contains
the command line) was only included in backup/archive copies
of the metadata. Now also include it in the metadata written
to the metadata areas.
---
lib/format_text/export.c | 4 ++--
lib/format_text/format-text.c | 27 ++++++++++++++++++++++++++-
lib/metadata/metadata.h | 1 -
lib/metadata/vg.h | 1 +
test/shell/metadata.sh | 4 ++++
5 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/lib/format_text/export.c b/lib/format_text/export.c
index 841e06d..2a3f844 100644
--- a/lib/format_text/export.c
+++ b/lib/format_text/export.c
@@ -1086,7 +1086,7 @@ size_t text_vg_export_raw(struct volume_group *vg, const char *desc, char **buf)
return r;
}
-size_t export_vg_to_buffer(struct volume_group *vg, char **buf)
+static size_t _export_vg_to_buffer(struct volume_group *vg, char **buf)
{
return text_vg_export_raw(vg, "", buf);
}
@@ -1096,7 +1096,7 @@ struct dm_config_tree *export_vg_to_config_tree(struct volume_group *vg)
char *buf = NULL;
struct dm_config_tree *vg_cft;
- if (!export_vg_to_buffer(vg, &buf)) {
+ if (!_export_vg_to_buffer(vg, &buf)) {
log_error("Could not format metadata for VG %s.", vg->name);
return NULL;
}
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index 13b2c66..6873f19 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -493,6 +493,29 @@ static struct volume_group *_vg_read_precommit_raw(struct format_instance *fid,
return vg;
}
+#define MAX_DESC_LEN 2048
+
+static char *_build_desc_write(struct cmd_context *cmd, struct volume_group *vg)
+{
+ size_t len = strlen(cmd->cmd_line) + 32;
+ char *desc;
+
+ if (len > MAX_DESC_LEN)
+ len = MAX_DESC_LEN;
+
+ if (!(desc = zalloc(len)))
+ return_NULL;
+
+ vg->write_count++;
+
+ if (vg->write_count == 1)
+ dm_snprintf(desc, len, "Write from %s.", cmd->cmd_line);
+ else
+ dm_snprintf(desc, len, "Write[%u] from %s.", vg->write_count, cmd->cmd_line);
+
+ return desc;
+}
+
/*
* VG metadata updates:
*
@@ -576,9 +599,11 @@ static int _vg_write_raw(struct format_instance *fid, struct volume_group *vg,
new_buf = fidtc->raw_metadata_buf;
new_size = fidtc->raw_metadata_buf_size;
} else {
- new_size = text_vg_export_raw(vg, "", &new_buf);
+ char *desc = _build_desc_write(fid->fmt->cmd, vg);
+ new_size = text_vg_export_raw(vg, desc, &new_buf);
fidtc->raw_metadata_buf = new_buf;
fidtc->raw_metadata_buf_size = new_size;
+ free(desc);
}
if (!new_size || !new_buf) {
diff --git a/lib/metadata/metadata.h b/lib/metadata/metadata.h
index 63ee4a6..2fc0015 100644
--- a/lib/metadata/metadata.h
+++ b/lib/metadata/metadata.h
@@ -473,7 +473,6 @@ void lv_calculate_readahead(const struct logical_volume *lv, uint32_t *read_ahea
/*
* For internal metadata caching.
*/
-size_t export_vg_to_buffer(struct volume_group *vg, char **buf);
struct dm_config_tree *export_vg_to_config_tree(struct volume_group *vg);
struct volume_group *import_vg_from_config_tree(const struct dm_config_tree *cft,
struct format_instance *fid);
diff --git a/lib/metadata/vg.h b/lib/metadata/vg.h
index 6e89b33..2e21461 100644
--- a/lib/metadata/vg.h
+++ b/lib/metadata/vg.h
@@ -42,6 +42,7 @@ struct volume_group {
struct lvmcache_vginfo *vginfo;
uint32_t seqno; /* Metadata sequence number */
unsigned skip_validate_lock_args : 1;
+ uint32_t write_count; /* count the number of vg_write calls */
/*
* The parsed committed (on-disk) copy of this VG; is NULL if this VG is committed
diff --git a/test/shell/metadata.sh b/test/shell/metadata.sh
index a86bc0b..f5d6483 100644
--- a/test/shell/metadata.sh
+++ b/test/shell/metadata.sh
@@ -26,6 +26,10 @@ pvcreate --metadatacopies 0 "$dev5"
vgcreate $SHARED "$vg" "${DEVICES[@]}"
lvcreate -n $lv -l 1 -i5 -I256 $vg
+pvck --dump metadata "$dev1" > meta1
+grep "description = " meta1 > desc1
+grep "Write from lvcreate" desc1
+
pvchange -x n "$dev1"
pvchange -x y "$dev1"
vgchange -a n $vg
4 years, 10 months