Skip to content

Commit

Permalink
Skip LVM filesystem check on LV reduction
Browse files Browse the repository at this point in the history
Since LVM v2.03.17 (lvmteam/lvm2@f6f2737), reducing a logical volume (LV) requires the LV to be active due to the default 'checksize' option, which requires an active LV. This results in the following error when attempting to reduce a non-active LV:

----
err=[\'  The LV must be active to safely reduce (see --fs options.)\']'
----

To resolve this, we now check if the LVM version is newer than 2.03.17. If so, we bypass the 'checksize' by using the '--fs ignore' option. This approach is viable because the oVirt engine already handles checksize, making lvreduce redundant.

Signed-off-by: Brooklyn Dewolf <[email protected]>
  • Loading branch information
BrooklynDewolf committed May 23, 2024
1 parent d206f0b commit 4b9e111
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/vdsm/osinfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,7 @@ def package_versions():
'qemu-kvm': ('qemu-kvm', 'qemu-kvm-rhev', 'qemu-kvm-ev'),
'spice-server': ('spice-server',),
'vdsm': ('vdsm',),
'lvm2': ('lvm2', 'lvm2-libs'),
}

if glusterEnabled:
Expand Down Expand Up @@ -281,6 +282,7 @@ def package_versions():
'qemu-kvm': 'qemu-kvm',
'spice-server': 'libspice-server1',
'vdsm': 'vdsmd',
'lvm2': 'lvm2',
}

if glusterEnabled:
Expand Down
13 changes: 13 additions & 0 deletions lib/vdsm/storage/lvm.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

from vdsm import constants
from vdsm import utils
from vdsm import osinfo
from vdsm.common import commands
from vdsm.common import errors
from vdsm.common import logutils
Expand Down Expand Up @@ -240,6 +241,15 @@ def __getattr__(self, attrName):
USE_DEVICES = config.get("lvm", "config_method").lower() == "devices"


def _get_lvm_version():
packages = osinfo.package_versions()
lvm_version = tuple(
int(v)
for v in packages['lvm2']['version'].split('.')
)
return lvm_version


def _prepare_device_set(devs):
devices = set(d.strip() for d in chain(devs, USER_DEV_LIST))
devices.discard('')
Expand Down Expand Up @@ -1781,12 +1791,15 @@ def extendLV(vgName, lvName, size_mb, refresh=True):


def reduceLV(vgName, lvName, size_mb, force=False):
lvm_version = _get_lvm_version()
log.info("Reducing LV %s/%s to %s megabytes (force=%s)",
vgName, lvName, size_mb, force)
cmd = ("lvreduce",) + LVM_NOBACKUP
if force:
cmd += ("--force",)
cmd += ("--size", "%sm" % (size_mb,), "%s/%s" % (vgName, lvName))
if lvm_version >= (2, 3, 17):
cmd += ("--fs", "ignore")

try:
_lvminfo.run_command(cmd, devices=_lvminfo._getVGDevs((vgName,)))
Expand Down

0 comments on commit 4b9e111

Please sign in to comment.