The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/3850

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From 69b496ea4077806db9d81b07436804af5e77ff54 Mon Sep 17 00:00:00 2001
From: Alberto Donato <[email protected]>
Date: Mon, 25 Sep 2017 14:31:02 -0400
Subject: [PATCH 1/4] storage/utils: add growFileSystem helper

Signed-off-by: Alberto Donato <[email protected]>
---
 lxd/storage_lvm_utils.go | 15 +--------------
 lxd/storage_utils.go     | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index e12884e0e..28850a443 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -57,20 +57,7 @@ func (s *storageLvm) lvExtend(lvPath string, lvSize int64, 
fsType string, fsMntP
                        `volume type %d`, volumeType)
        }
 
-       switch fsType {
-       case "xfs":
-               msg, err = shared.TryRunCommand("xfs_growfs", fsMntPoint)
-       default:
-               // default = ext4
-               msg, err = shared.TryRunCommand("resize2fs", lvPath)
-       }
-       if err != nil {
-               logger.Errorf("could not extend underlying %s filesystem for LV 
\"%s\": %s", fsType, lvPath, msg)
-               return fmt.Errorf("could not extend underlying %s filesystem 
for LV \"%s\": %s", fsType, lvPath, msg)
-       }
-
-       logger.Debugf("extended underlying %s filesystem for LV \"%s\"", 
fsType, lvPath)
-       return nil
+       return growFileSystem(fsType, fsMntPoint, lvPath)
 }
 
 func (s *storageLvm) lvReduce(lvPath string, lvSize int64, fsType string, 
fsMntPoint string, volumeType int, data interface{}) error {
diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go
index 8d26f9a1f..df1df29ed 100644
--- a/lxd/storage_utils.go
+++ b/lxd/storage_utils.go
@@ -10,6 +10,7 @@ import (
 
        "github.com/lxc/lxd/lxd/db"
        "github.com/lxc/lxd/shared"
+       "github.com/lxc/lxd/shared/logger"
 )
 
 // Options for filesystem creation
@@ -224,3 +225,27 @@ func xfsGenerateNewUUID(lvpath string) (string, error) {
 
        return "", nil
 }
+
+func growFileSystem(fsType string, devPath string, mntpoint string) error {
+       var msg string
+       var err error
+       switch fsType {
+       case "": // if not specified, default to ext4
+               fallthrough
+       case "ext4":
+               msg, err = shared.TryRunCommand("resize2fs", mntpoint)
+       case "xfs":
+               msg, err = shared.TryRunCommand("xfs_growfs", devPath)
+       default:
+               return fmt.Errorf(`Unsupported filesystem type "%s"`, fsType)
+       }
+
+       if err != nil {
+               errorMsg := fmt.Sprintf(`Could not extend underlying %s 
filesystem for "%s": %s`, fsType, devPath, msg)
+               logger.Errorf(errorMsg)
+               return fmt.Errorf(errorMsg)
+       }
+
+       logger.Debugf(`extended underlying %s filesystem for "%s"`, fsType, 
devPath)
+       return nil
+}

From 083ad93250fb7126edba9749398df933abacca2f Mon Sep 17 00:00:00 2001
From: Alberto Donato <[email protected]>
Date: Mon, 25 Sep 2017 14:55:29 -0400
Subject: [PATCH 2/4] storage/utils: add shrinkFileSystem helper

Signed-off-by: Alberto Donato <[email protected]>
---
 lxd/storage_lvm_utils.go | 18 ++++--------------
 lxd/storage_utils.go     | 28 +++++++++++++++++++++++++++-
 2 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index 28850a443..546fd4241 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -101,21 +101,11 @@ func (s *storageLvm) lvReduce(lvPath string, lvSize 
int64, fsType string, fsMntP
                                `storage volume type %d`, volumeType)
                }
 
-               msg, err = shared.TryRunCommand("e2fsck", "-f", "-y", lvPath)
-               if err != nil {
-                       return err
-               }
+       }
 
-               // don't assume resize2fs semantics are sane (because they
-               // aren't)
-               kbSize := lvSize / 1024
-               ext4LvSizeString := strconv.FormatInt(kbSize, 10)
-               ext4LvSizeString += "K"
-               msg, err = shared.TryRunCommand("resize2fs", lvPath, 
ext4LvSizeString)
-               if err != nil {
-                       logger.Errorf("could not reduce underlying %s 
filesystem for LV \"%s\": %s", fsType, lvPath, msg)
-                       return fmt.Errorf("could not reduce underlying %s 
filesystem for LV \"%s\": %s", fsType, lvPath, msg)
-               }
+       err = shrinkFileSystem(fsType, lvPath, lvSize)
+       if err != nil {
+               return err
        }
 
        msg, err = shared.TryRunCommand(
diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go
index df1df29ed..64946175f 100644
--- a/lxd/storage_utils.go
+++ b/lxd/storage_utils.go
@@ -237,7 +237,7 @@ func growFileSystem(fsType string, devPath string, mntpoint 
string) error {
        case "xfs":
                msg, err = shared.TryRunCommand("xfs_growfs", devPath)
        default:
-               return fmt.Errorf(`Unsupported filesystem type "%s"`, fsType)
+               return fmt.Errorf(`Growing not supported for filesystem type 
"%s"`, fsType)
        }
 
        if err != nil {
@@ -249,3 +249,29 @@ func growFileSystem(fsType string, devPath string, 
mntpoint string) error {
        logger.Debugf(`extended underlying %s filesystem for "%s"`, fsType, 
devPath)
        return nil
 }
+
+func shrinkFileSystem(fsType string, devPath string, byteSize int64) error {
+       var msg string
+       var err error
+       switch fsType {
+       case "": // if not specified, default to ext4
+               fallthrough
+       case "ext4":
+               msg, err = shared.TryRunCommand("e2fsck", "-f", "-y", devPath)
+               if err != nil {
+                       return err
+               }
+               kbSize := byteSize / 1024
+               msg, err = shared.TryRunCommand("resize2fs", devPath, 
fmt.Sprintf("%dK", kbSize))
+
+       default:
+               return fmt.Errorf(`Shrinking not supported for filesystem type 
"%s"`, fsType)
+       }
+
+       if err != nil {
+               errorMsg := fmt.Sprintf(`Could not reduce underlying %s 
filesystem for "%s": %s`, fsType, devPath, msg)
+               logger.Errorf(errorMsg)
+               return fmt.Errorf(errorMsg)
+       }
+       return nil
+}

From 871672b4325e2ff5568a4b015dd140e746d8fd6b Mon Sep 17 00:00:00 2001
From: Alberto Donato <[email protected]>
Date: Mon, 25 Sep 2017 15:00:58 -0400
Subject: [PATCH 3/4] storage/ceph: use [grow|shrink]FileSystem helpers

Signed-off-by: Alberto Donato <[email protected]>
---
 lxd/storage_ceph_utils.go | 42 +++++-------------------------------------
 1 file changed, 5 insertions(+), 37 deletions(-)

diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go
index 10504fa2d..5fe5609c0 100644
--- a/lxd/storage_ceph_utils.go
+++ b/lxd/storage_ceph_utils.go
@@ -1587,26 +1587,11 @@ func (s *storageCeph) rbdShrink(path string, size 
int64, fsType string,
                        return fmt.Errorf(`Resizing not implemented for `+
                                `storage volume type %d`, volumeType)
                }
+       }
 
-               msg, err = shared.TryRunCommand("e2fsck", "-f", "-y", path)
-               if err != nil {
-                       return err
-               }
-
-               // don't assume resize2fs semantics are sane (because they
-               // aren't)
-               kbSize := size / 1024
-               ext4SizeString := strconv.FormatInt(kbSize, 10)
-               ext4SizeString += "K"
-               msg, err = shared.TryRunCommand("resize2fs", path, 
ext4SizeString)
-               if err != nil {
-                       logger.Errorf(`Could not reduce underlying %s `+
-                               `filesystem for RBD storage volume "%s": %s`,
-                               fsType, path, msg)
-                       return fmt.Errorf(`Could not reduce underlying %s `+
-                               `filesystem for RBD storage volume "%s": %s`,
-                               fsType, path, msg)
-               }
+       err = shrinkFileSystem(fsType, path, size)
+       if err != nil {
+               return err
        }
 
        msg, err = shared.TryRunCommand(
@@ -1680,22 +1665,5 @@ func (s *storageCeph) rbdGrow(path string, size int64, 
fsType string,
                        %s`, path, msg)
        }
 
-       switch fsType {
-       case "xfs":
-               msg, err = shared.TryRunCommand("xfs_growfs", fsMntPoint)
-       default:
-               // default = ext4
-               msg, err = shared.TryRunCommand("resize2fs", path)
-       }
-       if err != nil {
-               logger.Errorf(`Could not extend underlying %s `+
-                       `filesystem for RBD storage volume "%s": %s`,
-                       fsType, path, msg)
-               return fmt.Errorf(`Could not extend underlying %s `+
-                       `filesystem for RBD storage volume "%s": %s`,
-                       fsType, path, msg)
-       }
-
-       logger.Debugf("extended underlying %s filesystem for LV \"%s\"", 
fsType, path)
-       return nil
+       return growFileSystem(fsType, path, fsMntPoint)
 }

From dc93a29be5f3748fc84fc58e7785d34b6e2f66d2 Mon Sep 17 00:00:00 2001
From: Alberto Donato <[email protected]>
Date: Mon, 25 Sep 2017 16:57:39 -0400
Subject: [PATCH 4/4] storage/utils: add shrinkVolumeFilesystem helper

Signed-off-by: Alberto Donato <[email protected]>
---
 lxd/storage_ceph_utils.go | 46 +++++++++++++---------------------------------
 lxd/storage_lvm_utils.go  | 37 ++++---------------------------------
 lxd/storage_utils.go      | 39 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 56 insertions(+), 66 deletions(-)

diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go
index 5fe5609c0..a6510e848 100644
--- a/lxd/storage_ceph_utils.go
+++ b/lxd/storage_ceph_utils.go
@@ -1556,44 +1556,24 @@ func (s *storageCeph) rbdShrink(path string, size 
int64, fsType string,
                        `less than 1MB`)
        }
 
-       volumeTypeName := ""
-       switch fsType {
-       case "xfs":
-               logger.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, 
and restore are required")
-               return fmt.Errorf("xfs filesystems cannot be shrunk: dump, 
mkfs, and restore are required")
-       default:
-               // default = ext4
-               switch volumeType {
-               case storagePoolVolumeTypeContainer:
-                       c := data.(container)
-                       ourMount, err := c.StorageStop()
-                       if err != nil {
-                               return err
-                       }
-                       if !ourMount {
-                               defer c.StorageStart()
-                       }
-                       volumeTypeName = storagePoolVolumeTypeNameContainer
-               case storagePoolVolumeTypeCustom:
-                       ourMount, err := s.StoragePoolVolumeUmount()
-                       if err != nil {
-                               return err
-                       }
-                       if !ourMount {
-                               defer s.StoragePoolVolumeMount()
-                       }
-                       volumeTypeName = storagePoolVolumeTypeNameCustom
-               default:
-                       return fmt.Errorf(`Resizing not implemented for `+
-                               `storage volume type %d`, volumeType)
-               }
+       cleanupFunc, err := shrinkVolumeFilesystem(s, volumeType, fsType, path, 
size, data)
+       if cleanupFunc != nil {
+               defer cleanupFunc()
        }
-
-       err = shrinkFileSystem(fsType, path, size)
        if err != nil {
                return err
        }
 
+       volumeTypeName := ""
+       switch volumeType {
+       case storagePoolVolumeTypeContainer:
+               volumeTypeName = storagePoolVolumeTypeNameContainer
+       case storagePoolVolumeTypeCustom:
+               volumeTypeName = storagePoolVolumeTypeNameCustom
+       default:
+               return fmt.Errorf(`Resizing not implemented for `+
+                       `storage volume type %d`, volumeType)
+       }
        msg, err = shared.TryRunCommand(
                "rbd",
                "resize",
diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index 546fd4241..62e61d7c6 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -70,44 +70,15 @@ func (s *storageLvm) lvReduce(lvPath string, lvSize int64, 
fsType string, fsMntP
                return fmt.Errorf(`The size of the storage volume would be ` +
                        `less than 1MB`)
        }
-
-       lvSizeString := strconv.FormatInt(lvSize, 10)
-       switch fsType {
-       case "xfs":
-               logger.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, 
and restore are required")
-               return fmt.Errorf("xfs filesystems cannot be shrunk: dump, 
mkfs, and restore are required")
-       default:
-               // default = ext4
-               switch volumeType {
-               case storagePoolVolumeTypeContainer:
-                       c := data.(container)
-                       ourMount, err := c.StorageStop()
-                       if err != nil {
-                               return err
-                       }
-                       if !ourMount {
-                               defer c.StorageStart()
-                       }
-               case storagePoolVolumeTypeCustom:
-                       ourMount, err := s.StoragePoolVolumeUmount()
-                       if err != nil {
-                               return err
-                       }
-                       if !ourMount {
-                               defer s.StoragePoolVolumeMount()
-                       }
-               default:
-                       return fmt.Errorf(`Resizing not implemented for `+
-                               `storage volume type %d`, volumeType)
-               }
-
+       cleanupFunc, err := shrinkVolumeFilesystem(s, volumeType, fsType, 
lvPath, lvSize, data)
+       if cleanupFunc != nil {
+               defer cleanupFunc()
        }
-
-       err = shrinkFileSystem(fsType, lvPath, lvSize)
        if err != nil {
                return err
        }
 
+       lvSizeString := strconv.FormatInt(lvSize, 10)
        msg, err = shared.TryRunCommand(
                "lvreduce",
                "-L", lvSizeString+"B",
diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go
index 64946175f..81171a0fd 100644
--- a/lxd/storage_utils.go
+++ b/lxd/storage_utils.go
@@ -275,3 +275,42 @@ func shrinkFileSystem(fsType string, devPath string, 
byteSize int64) error {
        }
        return nil
 }
+
+func shrinkVolumeFilesystem(s storage, volumeType int, fsType string, devPath 
string, byteSize int64, data interface{}) (func() (bool, error), error) {
+       var cleanupFunc func() (bool, error)
+       switch fsType {
+       case "xfs":
+               logger.Errorf("xfs filesystems cannot be shrunk: dump, mkfs, 
and restore are required")
+               return nil, fmt.Errorf("xfs filesystems cannot be shrunk: dump, 
mkfs, and restore are required")
+       case "": // if not specified, default to ext4
+               fallthrough
+       case "ext4":
+               switch volumeType {
+               case storagePoolVolumeTypeContainer:
+                       c := data.(container)
+                       ourMount, err := c.StorageStop()
+                       if err != nil {
+                               return nil, err
+                       }
+                       if !ourMount {
+                               cleanupFunc = c.StorageStart
+                       }
+               case storagePoolVolumeTypeCustom:
+                       ourMount, err := s.StoragePoolVolumeUmount()
+                       if err != nil {
+                               return nil, err
+                       }
+                       if !ourMount {
+                               cleanupFunc = s.StoragePoolVolumeMount
+                       }
+               default:
+                       return nil, fmt.Errorf(`Resizing not implemented for 
storage volume type %d`, volumeType)
+               }
+
+       default:
+               return nil, fmt.Errorf(`Shrinking not supported for filesystem 
type "%s"`, fsType)
+       }
+
+       err := shrinkFileSystem(fsType, devPath, byteSize)
+       return cleanupFunc, err
+}
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to