[libvirt] [PATCH] Implement LVM volume resize via lvresize

apolyakov@beget.ru posted 1 patch 6 years, 7 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20170830172330.6904-1-apolyakov@beget.ru
There is a newer version of this series
m4/virt-storage-lvm.m4                |  4 ++++
src/storage/storage_backend_logical.c | 22 ++++++++++++++++++++++
2 files changed, 26 insertions(+)
[libvirt] [PATCH] Implement LVM volume resize via lvresize
Posted by apolyakov@beget.ru 6 years, 7 months ago
From: Alexander Polyakov <apolyakov@beget.com>

Signed-off-by: Alexander Polyakov <apolyakov@beget.com>
---
 m4/virt-storage-lvm.m4                |  4 ++++
 src/storage/storage_backend_logical.c | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/m4/virt-storage-lvm.m4 b/m4/virt-storage-lvm.m4
index a0ccca7a0..0932995b4 100644
--- a/m4/virt-storage-lvm.m4
+++ b/m4/virt-storage-lvm.m4
@@ -30,6 +30,7 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_LVM], [
     AC_PATH_PROG([VGREMOVE], [vgremove], [], [$LIBVIRT_SBIN_PATH])
     AC_PATH_PROG([LVREMOVE], [lvremove], [], [$LIBVIRT_SBIN_PATH])
     AC_PATH_PROG([LVCHANGE], [lvchange], [], [$LIBVIRT_SBIN_PATH])
+    AC_PATH_PROG([LVRESIZE], [lvresize], [], [$LIBVIRT_SBIN_PATH])
     AC_PATH_PROG([VGCHANGE], [vgchange], [], [$LIBVIRT_SBIN_PATH])
     AC_PATH_PROG([VGSCAN], [vgscan], [], [$LIBVIRT_SBIN_PATH])
     AC_PATH_PROG([PVS], [pvs], [], [$LIBVIRT_SBIN_PATH])
@@ -44,6 +45,7 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_LVM], [
       if test -z "$VGREMOVE" ; then AC_MSG_ERROR([We need vgremove for LVM storage driver]) ; fi
       if test -z "$LVREMOVE" ; then AC_MSG_ERROR([We need lvremove for LVM storage driver]) ; fi
       if test -z "$LVCHANGE" ; then AC_MSG_ERROR([We need lvchange for LVM storage driver]) ; fi
+      if test -z "$LVRESIZE" ; then AC_MSG_ERROR([We need lvresize for LVM storage driver]) ; fi
       if test -z "$VGCHANGE" ; then AC_MSG_ERROR([We need vgchange for LVM storage driver]) ; fi
       if test -z "$VGSCAN" ; then AC_MSG_ERROR([We need vgscan for LVM storage driver]) ; fi
       if test -z "$PVS" ; then AC_MSG_ERROR([We need pvs for LVM storage driver]) ; fi
@@ -57,6 +59,7 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_LVM], [
       if test -z "$VGREMOVE" ; then with_storage_lvm=no ; fi
       if test -z "$LVREMOVE" ; then with_storage_lvm=no ; fi
       if test -z "$LVCHANGE" ; then with_storage_lvm=no ; fi
+      if test -z "$LVRESIZE" ; then with_storage_lvm=no ; fi
       if test -z "$VGCHANGE" ; then with_storage_lvm=no ; fi
       if test -z "$VGSCAN" ; then with_storage_lvm=no ; fi
       if test -z "$PVS" ; then with_storage_lvm=no ; fi
@@ -75,6 +78,7 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_LVM], [
       AC_DEFINE_UNQUOTED([VGREMOVE],["$VGREMOVE"],[Location of vgremove program])
       AC_DEFINE_UNQUOTED([LVREMOVE],["$LVREMOVE"],[Location of lvremove program])
       AC_DEFINE_UNQUOTED([LVCHANGE],["$LVCHANGE"],[Location of lvchange program])
+      AC_DEFINE_UNQUOTED([LVRESIZE],["$LVRESIZE"],[Location of lvresize program])
       AC_DEFINE_UNQUOTED([VGCHANGE],["$VGCHANGE"],[Location of vgchange program])
       AC_DEFINE_UNQUOTED([VGSCAN],["$VGSCAN"],[Location of vgscan program])
       AC_DEFINE_UNQUOTED([PVS],["$PVS"],[Location of pvs program])
diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
index 67f70e551..810e4ee88 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -1072,6 +1072,27 @@ virStorageBackendLogicalVolWipe(virConnectPtr conn,
     return -1;
 }
 
+static int
+virStorageBackendLogicalResizeVol(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                   virStoragePoolObjPtr pool,
+                                   virStorageVolDefPtr vol,
+                                   unsigned long long capacity,
+                                   unsigned int flags)
+{
+
+    virCheckFlags(0, -1);
+
+    (void)pool;
+    virCommandPtr cmd = virCommandNewArgList(LVRESIZE, "-L", NULL);
+    virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(capacity, 1024));
+    virCommandAddArgFormat(cmd, "%s", vol->target.path);
+    int ret = virCommandRun(cmd, NULL);
+
+    virCommandFree(cmd);
+    return ret;
+
+}
+
 virStorageBackend virStorageBackendLogical = {
     .type = VIR_STORAGE_POOL_LOGICAL,
 
@@ -1089,6 +1110,7 @@ virStorageBackend virStorageBackendLogical = {
     .uploadVol = virStorageBackendVolUploadLocal,
     .downloadVol = virStorageBackendVolDownloadLocal,
     .wipeVol = virStorageBackendLogicalVolWipe,
+    .resizeVol = virStorageBackendLogicalResizeVol,
 };
 
 
-- 
2.13.5

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] Implement LVM volume resize via lvresize
Posted by Peter Krempa 6 years, 6 months ago
On Wed, Aug 30, 2017 at 20:23:30 +0300, apolyakov@beget.ru wrote:
> From: Alexander Polyakov <apolyakov@beget.com>

Commit message is missing (and required). Please describe your change.

> 
> Signed-off-by: Alexander Polyakov <apolyakov@beget.com>
> ---
>  m4/virt-storage-lvm.m4                |  4 ++++
>  src/storage/storage_backend_logical.c | 22 ++++++++++++++++++++++
>  2 files changed, 26 insertions(+)

[...]

> diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
> index 67f70e551..810e4ee88 100644
> --- a/src/storage/storage_backend_logical.c
> +++ b/src/storage/storage_backend_logical.c
> @@ -1072,6 +1072,27 @@ virStorageBackendLogicalVolWipe(virConnectPtr conn,
>      return -1;
>  }
>  
> +static int
> +virStorageBackendLogicalResizeVol(virConnectPtr conn ATTRIBUTE_UNUSED,
> +                                   virStoragePoolObjPtr pool,
> +                                   virStorageVolDefPtr vol,
> +                                   unsigned long long capacity,
> +                                   unsigned int flags)
> +{
> +
> +    virCheckFlags(0, -1);

This won't allow shrinking of the volume. Also VIR_STORAGE_VOL_RESIZE_DELTA
looks simple enough to implement.

> +
> +    (void)pool;

Use ATTRIBUTE_UNUSED for the parameter.

> +    virCommandPtr cmd = virCommandNewArgList(LVRESIZE, "-L", NULL);
> +    virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(capacity, 1024));

Why don't you pass this through in bytes?

> +    virCommandAddArgFormat(cmd, "%s", vol->target.path);
> +    int ret = virCommandRun(cmd, NULL);

rest looks fine.
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] Implement LVM volume resize via lvresize
Posted by John Ferlan 6 years, 6 months ago

On 08/30/2017 01:23 PM, apolyakov@beget.ru wrote:
> From: Alexander Polyakov <apolyakov@beget.com>
> 
> Signed-off-by: Alexander Polyakov <apolyakov@beget.com>
> ---
>  m4/virt-storage-lvm.m4                |  4 ++++
>  src/storage/storage_backend_logical.c | 22 ++++++++++++++++++++++
>  2 files changed, 26 insertions(+)
> 
> diff --git a/m4/virt-storage-lvm.m4 b/m4/virt-storage-lvm.m4
> index a0ccca7a0..0932995b4 100644
> --- a/m4/virt-storage-lvm.m4
> +++ b/m4/virt-storage-lvm.m4
> @@ -30,6 +30,7 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_LVM], [
>      AC_PATH_PROG([VGREMOVE], [vgremove], [], [$LIBVIRT_SBIN_PATH])
>      AC_PATH_PROG([LVREMOVE], [lvremove], [], [$LIBVIRT_SBIN_PATH])
>      AC_PATH_PROG([LVCHANGE], [lvchange], [], [$LIBVIRT_SBIN_PATH])
> +    AC_PATH_PROG([LVRESIZE], [lvresize], [], [$LIBVIRT_SBIN_PATH])
>      AC_PATH_PROG([VGCHANGE], [vgchange], [], [$LIBVIRT_SBIN_PATH])
>      AC_PATH_PROG([VGSCAN], [vgscan], [], [$LIBVIRT_SBIN_PATH])
>      AC_PATH_PROG([PVS], [pvs], [], [$LIBVIRT_SBIN_PATH])
> @@ -44,6 +45,7 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_LVM], [
>        if test -z "$VGREMOVE" ; then AC_MSG_ERROR([We need vgremove for LVM storage driver]) ; fi
>        if test -z "$LVREMOVE" ; then AC_MSG_ERROR([We need lvremove for LVM storage driver]) ; fi
>        if test -z "$LVCHANGE" ; then AC_MSG_ERROR([We need lvchange for LVM storage driver]) ; fi
> +      if test -z "$LVRESIZE" ; then AC_MSG_ERROR([We need lvresize for LVM storage driver]) ; fi
>        if test -z "$VGCHANGE" ; then AC_MSG_ERROR([We need vgchange for LVM storage driver]) ; fi
>        if test -z "$VGSCAN" ; then AC_MSG_ERROR([We need vgscan for LVM storage driver]) ; fi
>        if test -z "$PVS" ; then AC_MSG_ERROR([We need pvs for LVM storage driver]) ; fi
> @@ -57,6 +59,7 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_LVM], [
>        if test -z "$VGREMOVE" ; then with_storage_lvm=no ; fi
>        if test -z "$LVREMOVE" ; then with_storage_lvm=no ; fi
>        if test -z "$LVCHANGE" ; then with_storage_lvm=no ; fi
> +      if test -z "$LVRESIZE" ; then with_storage_lvm=no ; fi
>        if test -z "$VGCHANGE" ; then with_storage_lvm=no ; fi
>        if test -z "$VGSCAN" ; then with_storage_lvm=no ; fi
>        if test -z "$PVS" ; then with_storage_lvm=no ; fi
> @@ -75,6 +78,7 @@ AC_DEFUN([LIBVIRT_STORAGE_CHECK_LVM], [
>        AC_DEFINE_UNQUOTED([VGREMOVE],["$VGREMOVE"],[Location of vgremove program])
>        AC_DEFINE_UNQUOTED([LVREMOVE],["$LVREMOVE"],[Location of lvremove program])
>        AC_DEFINE_UNQUOTED([LVCHANGE],["$LVCHANGE"],[Location of lvchange program])
> +      AC_DEFINE_UNQUOTED([LVRESIZE],["$LVRESIZE"],[Location of lvresize program])
>        AC_DEFINE_UNQUOTED([VGCHANGE],["$VGCHANGE"],[Location of vgchange program])
>        AC_DEFINE_UNQUOTED([VGSCAN],["$VGSCAN"],[Location of vgscan program])
>        AC_DEFINE_UNQUOTED([PVS],["$PVS"],[Location of pvs program])
> diff --git a/src/storage/storage_backend_logical.c b/src/storage/storage_backend_logical.c
> index 67f70e551..810e4ee88 100644
> --- a/src/storage/storage_backend_logical.c
> +++ b/src/storage/storage_backend_logical.c
> @@ -1072,6 +1072,27 @@ virStorageBackendLogicalVolWipe(virConnectPtr conn,
>      return -1;
>  }
>  
> +static int
> +virStorageBackendLogicalResizeVol(virConnectPtr conn ATTRIBUTE_UNUSED,
> +                                   virStoragePoolObjPtr pool,
> +                                   virStorageVolDefPtr vol,
> +                                   unsigned long long capacity,
> +                                   unsigned int flags)
> +{
> +
> +    virCheckFlags(0, -1);
> +
> +    (void)pool;
> +    virCommandPtr cmd = virCommandNewArgList(LVRESIZE, "-L", NULL);
> +    virCommandAddArgFormat(cmd, "%lluK", VIR_DIV_UP(capacity, 1024));
> +    virCommandAddArgFormat(cmd, "%s", vol->target.path);
> +    int ret = virCommandRun(cmd, NULL);

Beyond what Peter notes - does this work with both "regular" lv's and
"thin snapshot" lv's?  IOW Volumes created w/ "--type snapshot
--virtualsize".  This is not the (newer) "thin pool" lv's, but rather
the (older) style of sparse lv.

For a v2, please be sure to have a docs/news.xml as a second and
separate patch to indicate the Improvement.

John

> +
> +    virCommandFree(cmd);
> +    return ret;
> +
> +}
> +
>  virStorageBackend virStorageBackendLogical = {
>      .type = VIR_STORAGE_POOL_LOGICAL,
>  
> @@ -1089,6 +1110,7 @@ virStorageBackend virStorageBackendLogical = {
>      .uploadVol = virStorageBackendVolUploadLocal,
>      .downloadVol = virStorageBackendVolDownloadLocal,
>      .wipeVol = virStorageBackendLogicalVolWipe,
> +    .resizeVol = virStorageBackendLogicalResizeVol,
>  };
>  
>  
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list