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

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

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.

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, };
participants (3)
-
apolyakov@beget.ru
-
John Ferlan
-
Peter Krempa