parent
efcd310f88
commit
d2b663602b
48
0004-vgimportclone-fix-importing-PV-without-metadata.patch
Normal file
48
0004-vgimportclone-fix-importing-PV-without-metadata.patch
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
From 8f7b4456ad93c3907a82fd03d0feceb9785e3bfc Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Teigland <teigland@redhat.com>
|
||||||
|
Date: Thu, 5 Jan 2023 14:28:31 -0600
|
||||||
|
Subject: [PATCH 1/3] vgimportclone: fix importing PV without metadata
|
||||||
|
|
||||||
|
If one of the PVs in the VG does not hold metadata, then the
|
||||||
|
command would fail, thinking that PV was from a different VG.
|
||||||
|
Also add missing free on that error path.
|
||||||
|
|
||||||
|
(cherry picked from commit c4b898a53eec39bc28b5451e7fde87945303a644)
|
||||||
|
---
|
||||||
|
tools/vgimportclone.c | 6 ++++--
|
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tools/vgimportclone.c b/tools/vgimportclone.c
|
||||||
|
index 60ef20762..93fa3b18d 100644
|
||||||
|
--- a/tools/vgimportclone.c
|
||||||
|
+++ b/tools/vgimportclone.c
|
||||||
|
@@ -203,7 +203,7 @@ int vgimportclone(struct cmd_context *cmd, int argc, char **argv)
|
||||||
|
struct device *dev;
|
||||||
|
struct device_list *devl;
|
||||||
|
struct dm_list other_devs;
|
||||||
|
- struct volume_group *vg, *error_vg;
|
||||||
|
+ struct volume_group *vg, *error_vg = NULL;
|
||||||
|
const char *vgname;
|
||||||
|
char base_vgname[NAME_LEN] = { 0 };
|
||||||
|
char tmp_vgname[NAME_LEN] = { 0 };
|
||||||
|
@@ -322,7 +322,7 @@ int vgimportclone(struct cmd_context *cmd, int argc, char **argv)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!(vgname = lvmcache_vgname_from_info(info))) {
|
||||||
|
+ if (!(vgname = lvmcache_vgname_from_info(info)) || is_orphan_vg(vgname)) {
|
||||||
|
/* The PV may not have metadata, this will be resolved in
|
||||||
|
the process_each_vg/vg_read at the end. */
|
||||||
|
continue;
|
||||||
|
@@ -503,6 +503,8 @@ retry_name:
|
||||||
|
}
|
||||||
|
ret = ECMD_PROCESSED;
|
||||||
|
out:
|
||||||
|
+ if (error_vg)
|
||||||
|
+ release_vg(error_vg);
|
||||||
|
unlock_devices_file(cmd);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.39.1
|
||||||
|
|
89
0005-lvmdbusd-Move-get_error_msg-to-utils.patch
Normal file
89
0005-lvmdbusd-Move-get_error_msg-to-utils.patch
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
From 4e34edd6e4e52328dd77b6a55aeadd9b0454c743 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Tony Asleson <tasleson@redhat.com>
|
||||||
|
Date: Tue, 29 Nov 2022 10:00:39 -0600
|
||||||
|
Subject: [PATCH 2/3] lvmdbusd: Move get_error_msg to utils
|
||||||
|
|
||||||
|
Moving this so we can re-use outside of lvm_shell_proxy.
|
||||||
|
|
||||||
|
(cherry picked from commit 8f60c494515ddccb20e4afb804edb6b9599e65c0)
|
||||||
|
---
|
||||||
|
daemons/lvmdbusd/lvm_shell_proxy.py.in | 23 +++--------------------
|
||||||
|
daemons/lvmdbusd/utils.py | 17 +++++++++++++++++
|
||||||
|
2 files changed, 20 insertions(+), 20 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemons/lvmdbusd/lvm_shell_proxy.py.in b/daemons/lvmdbusd/lvm_shell_proxy.py.in
|
||||||
|
index ac6d51e65..37d73218b 100755
|
||||||
|
--- a/daemons/lvmdbusd/lvm_shell_proxy.py.in
|
||||||
|
+++ b/daemons/lvmdbusd/lvm_shell_proxy.py.in
|
||||||
|
@@ -28,7 +28,7 @@ except ImportError:
|
||||||
|
|
||||||
|
import lvmdbusd.cfg as cfg
|
||||||
|
from lvmdbusd.utils import log_debug, log_error, add_no_notify, make_non_block,\
|
||||||
|
- read_decoded, extract_stack_trace, LvmBug
|
||||||
|
+ read_decoded, extract_stack_trace, LvmBug, get_error_msg
|
||||||
|
|
||||||
|
SHELL_PROMPT = "lvm> "
|
||||||
|
|
||||||
|
@@ -191,24 +191,7 @@ class LVMShellProxy(object):
|
||||||
|
def get_last_log(self):
|
||||||
|
self._write_cmd('lastlog\n')
|
||||||
|
report_json = self._read_response()[1]
|
||||||
|
- return LVMShellProxy.get_error_msg(report_json)
|
||||||
|
-
|
||||||
|
- @staticmethod
|
||||||
|
- def get_error_msg(report_json):
|
||||||
|
- # Get the error message from the returned JSON
|
||||||
|
- if 'log' in report_json:
|
||||||
|
- error_msg = ""
|
||||||
|
- # Walk the entire log array and build an error string
|
||||||
|
- for log_entry in report_json['log']:
|
||||||
|
- if log_entry['log_type'] == "error":
|
||||||
|
- if error_msg:
|
||||||
|
- error_msg += ', ' + log_entry['log_message']
|
||||||
|
- else:
|
||||||
|
- error_msg = log_entry['log_message']
|
||||||
|
-
|
||||||
|
- return error_msg
|
||||||
|
-
|
||||||
|
- return None
|
||||||
|
+ return get_error_msg(report_json)
|
||||||
|
|
||||||
|
def call_lvm(self, argv, debug=False):
|
||||||
|
rc = 1
|
||||||
|
@@ -245,7 +228,7 @@ class LVMShellProxy(object):
|
||||||
|
# report json too.
|
||||||
|
error_msg = self.get_last_log()
|
||||||
|
if error_msg is None:
|
||||||
|
- error_msg = LVMShellProxy.get_error_msg(report_json)
|
||||||
|
+ error_msg = get_error_msg(report_json)
|
||||||
|
if error_msg is None:
|
||||||
|
error_msg = 'No error reason provided! (missing "log" section)'
|
||||||
|
|
||||||
|
diff --git a/daemons/lvmdbusd/utils.py b/daemons/lvmdbusd/utils.py
|
||||||
|
index 5aecb1fff..0b81591b2 100644
|
||||||
|
--- a/daemons/lvmdbusd/utils.py
|
||||||
|
+++ b/daemons/lvmdbusd/utils.py
|
||||||
|
@@ -859,3 +859,20 @@ class LvmDebugData:
|
||||||
|
self._close_fd()
|
||||||
|
# In case lvm_complete doesn't get called.
|
||||||
|
self._remove_file()
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+def get_error_msg(report_json):
|
||||||
|
+ # Get the error message from the returned JSON
|
||||||
|
+ if 'log' in report_json:
|
||||||
|
+ error_msg = ""
|
||||||
|
+ # Walk the entire log array and build an error string
|
||||||
|
+ for log_entry in report_json['log']:
|
||||||
|
+ if log_entry['log_type'] == "error":
|
||||||
|
+ if error_msg:
|
||||||
|
+ error_msg += ', ' + log_entry['log_message']
|
||||||
|
+ else:
|
||||||
|
+ error_msg = log_entry['log_message']
|
||||||
|
+
|
||||||
|
+ return error_msg
|
||||||
|
+
|
||||||
|
+ return None
|
||||||
|
--
|
||||||
|
2.39.1
|
||||||
|
|
@ -0,0 +1,79 @@
|
|||||||
|
From 0441d340e752427d0d355a85e5e5e465e911a102 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Tony Asleson <tasleson@redhat.com>
|
||||||
|
Date: Tue, 29 Nov 2022 10:04:17 -0600
|
||||||
|
Subject: [PATCH 3/3] lvmdbusd: Add command_log_selection to command line
|
||||||
|
|
||||||
|
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2145114
|
||||||
|
(cherry picked from commit e63b0c7262f50ab43fcde1c50b6d880acab68407)
|
||||||
|
---
|
||||||
|
daemons/lvmdbusd/cmdhandler.py | 33 +++++++++++++++++----------------
|
||||||
|
1 file changed, 17 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/daemons/lvmdbusd/cmdhandler.py b/daemons/lvmdbusd/cmdhandler.py
|
||||||
|
index 0c7bd8528..9a76db4c9 100644
|
||||||
|
--- a/daemons/lvmdbusd/cmdhandler.py
|
||||||
|
+++ b/daemons/lvmdbusd/cmdhandler.py
|
||||||
|
@@ -17,7 +17,7 @@ import os
|
||||||
|
|
||||||
|
from lvmdbusd import cfg
|
||||||
|
from lvmdbusd.utils import pv_dest_ranges, log_debug, log_error, add_no_notify,\
|
||||||
|
- make_non_block, read_decoded, extract_stack_trace, LvmBug, add_config_option
|
||||||
|
+ make_non_block, read_decoded, extract_stack_trace, LvmBug, add_config_option, get_error_msg
|
||||||
|
from lvmdbusd.lvm_shell_proxy import LVMShellProxy
|
||||||
|
|
||||||
|
try:
|
||||||
|
@@ -121,6 +121,9 @@ def call_lvm(command, debug=False, line_cb=None,
|
||||||
|
command.insert(0, cfg.LVM_CMD)
|
||||||
|
command = add_no_notify(command)
|
||||||
|
|
||||||
|
+ # Ensure we get an error message when we fork & exec the lvm command line
|
||||||
|
+ command = add_config_option(command, "--config", 'log/command_log_selection="log_context!=''"')
|
||||||
|
+
|
||||||
|
process = Popen(command, stdout=PIPE, stderr=PIPE, close_fds=True,
|
||||||
|
env=os.environ)
|
||||||
|
|
||||||
|
@@ -167,7 +170,17 @@ def call_lvm(command, debug=False, line_cb=None,
|
||||||
|
if debug or (process.returncode != 0 and (process.returncode != 5 and "fullreport" in command)):
|
||||||
|
_debug_c(command, process.returncode, (stdout_text, stderr_text))
|
||||||
|
|
||||||
|
- return process.returncode, stdout_text, stderr_text
|
||||||
|
+ try:
|
||||||
|
+ report_json = json.loads(stdout_text)
|
||||||
|
+ except json.decoder.JSONDecodeError:
|
||||||
|
+ # Some lvm commands don't return json even though we are asking for it to do so.
|
||||||
|
+ return process.returncode, stdout_text, stderr_text
|
||||||
|
+
|
||||||
|
+ error_msg = get_error_msg(report_json)
|
||||||
|
+ if error_msg:
|
||||||
|
+ stderr_text += error_msg
|
||||||
|
+
|
||||||
|
+ return process.returncode, report_json, stderr_text
|
||||||
|
else:
|
||||||
|
if cfg.run.value == 0:
|
||||||
|
raise SystemExit
|
||||||
|
@@ -619,20 +632,8 @@ def lvm_full_report_json():
|
||||||
|
rc, out, err = call(cmd)
|
||||||
|
# When we have an exported vg the exit code of lvs or fullreport will be 5
|
||||||
|
if rc == 0 or rc == 5:
|
||||||
|
- # If the 'call' implementation is lvmshell, the out is a dictionary as lvmshell has to
|
||||||
|
- # parse the output to get the exit value. When doing fork & exec, out is a string
|
||||||
|
- # representing the JSON. TODO: Make this consistent between implementations.
|
||||||
|
- if cfg.SHELL_IN_USE:
|
||||||
|
- assert(type(out) == dict)
|
||||||
|
- return out
|
||||||
|
- else:
|
||||||
|
- try:
|
||||||
|
- return json.loads(out)
|
||||||
|
- except json.decoder.JSONDecodeError as joe:
|
||||||
|
- log_error("JSONDecodeError %s, \n JSON=\n%s\n" %
|
||||||
|
- (str(joe), out))
|
||||||
|
- raise LvmBug("'fullreport' returned invalid JSON")
|
||||||
|
-
|
||||||
|
+ assert(type(out) == dict)
|
||||||
|
+ return out
|
||||||
|
raise LvmBug("'fullreport' exited with code '%d'" % rc)
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
2.39.1
|
||||||
|
|
14
lvm2.spec
14
lvm2.spec
@ -63,7 +63,7 @@ Version: 2.03.17
|
|||||||
#Release: 0.1.20211115git%{shortcommit}%{?dist}%{?rel_suffix}
|
#Release: 0.1.20211115git%{shortcommit}%{?dist}%{?rel_suffix}
|
||||||
Release: 4%{?dist}%{?rel_suffix}
|
Release: 4%{?dist}%{?rel_suffix}
|
||||||
%else
|
%else
|
||||||
Release: 4%{?dist}%{?rel_suffix}
|
Release: 5%{?dist}%{?rel_suffix}
|
||||||
%endif
|
%endif
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
URL: http://sourceware.org/lvm2
|
URL: http://sourceware.org/lvm2
|
||||||
@ -78,6 +78,11 @@ Patch1: 0001-device_id-fix-segfault-verifying-serial-for-non-pv.patch
|
|||||||
Patch2: 0002-lvextend-fix-overprovisioning-check-for-thin-lvs.patch
|
Patch2: 0002-lvextend-fix-overprovisioning-check-for-thin-lvs.patch
|
||||||
# BZ 2157591:
|
# BZ 2157591:
|
||||||
Patch3: 0003-lvresize-fix-cryptsetup-resize-in-helper.patch
|
Patch3: 0003-lvresize-fix-cryptsetup-resize-in-helper.patch
|
||||||
|
# BZ 2158619:
|
||||||
|
Patch4: 0004-vgimportclone-fix-importing-PV-without-metadata.patch
|
||||||
|
# BZ 2164044:
|
||||||
|
Patch5: 0005-lvmdbusd-Move-get_error_msg-to-utils.patch
|
||||||
|
Patch6: 0006-lvmdbusd-Add-command_log_selection-to-command-line.patch
|
||||||
|
|
||||||
BuildRequires: make
|
BuildRequires: make
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
@ -141,6 +146,9 @@ or more physical volumes and creating one or more logical volumes
|
|||||||
%patch1 -p1 -b .backup1
|
%patch1 -p1 -b .backup1
|
||||||
%patch2 -p1 -b .backup2
|
%patch2 -p1 -b .backup2
|
||||||
%patch3 -p1 -b .backup3
|
%patch3 -p1 -b .backup3
|
||||||
|
%patch4 -p1 -b .backup4
|
||||||
|
%patch5 -p1 -b .backup5
|
||||||
|
%patch6 -p1 -b .backup6
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%global _default_pid_dir /run
|
%global _default_pid_dir /run
|
||||||
@ -712,6 +720,10 @@ An extensive functional testsuite for LVM2.
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Jan 27 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.17-5
|
||||||
|
- Fix vgimportclone fail if PV has no metadata.
|
||||||
|
- Fix lvmdbusd missing stderr for commands not returning JSON.
|
||||||
|
|
||||||
* Fri Jan 06 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.17-4
|
* Fri Jan 06 2023 Marian Csontos <mcsontos@redhat.com> - 2.03.17-4
|
||||||
- Fix missing warning on thin pool over provisioning.
|
- Fix missing warning on thin pool over provisioning.
|
||||||
- Fix infinite recursion in lvresize_fs_helper when resizing LUKS device.
|
- Fix infinite recursion in lvresize_fs_helper when resizing LUKS device.
|
||||||
|
Loading…
Reference in New Issue
Block a user