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

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) ===
Closes #3284.

Signed-off-by: Christian Brauner <[email protected]>
From be8bd339793f8b0a8f83ef4b8e83a6d8f468bcc7 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Thu, 4 May 2017 17:56:51 +0200
Subject: [PATCH 1/2] lvm: resolve mount options properly

Closes #3284.

Signed-off-by: Christian Brauner <[email protected]>
---
 lxd/storage_lvm.go | 51 +++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 37 insertions(+), 14 deletions(-)

diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 61849fc..1c87d17 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -228,16 +228,39 @@ type storageLvm struct {
        storageShared
 }
 
-func (s *storageLvm) getLvmBlockMountOptions() string {
-       if s.volume.Config["block.mount_options"] != "" {
-               return s.volume.Config["block.mount_options"]
+func (s *storageLvm) getLvmBlockMountOptions() (uintptr, string) {
+       opts := s.volume.Config["block.mount_options"]
+
+       if opts == "" {
+               opts = s.pool.Config["volume.block.mount_options"]
+       }
+
+       if opts == "" {
+               return 0, "discard"
        }
 
-       if s.pool.Config["volume.block.mount_options"] != "" {
-               return s.pool.Config["volume.block.mount_options"]
+       mountFlags := uintptr(0)
+       tmp := strings.SplitN(opts, ",", -1)
+       for i := 0; i < len(tmp); i++ {
+               opt := tmp[i]
+               do, ok := MountOptions[opt]
+               if !ok {
+                       continue
+               }
+
+               if do.unset {
+                       mountFlags &= ^do.flag
+               } else {
+                       mountFlags |= do.flag
+               }
+
+               copy(tmp[i:], tmp[i+1:])
+               tmp[len(tmp)-1] = ""
+               tmp = tmp[:len(tmp)-1]
+               i--
        }
 
-       return "discard"
+       return mountFlags, strings.Join(tmp, ",")
 }
 
 func (s *storageLvm) getLvmFilesystem() string {
@@ -784,7 +807,7 @@ func (s *storageLvm) StoragePoolVolumeMount() (bool, error) 
{
 
        customPoolVolumeMntPoint := getStoragePoolVolumeMountPoint(s.pool.Name, 
s.volume.Name)
        poolName := s.getOnDiskPoolName()
-       mountOptions := s.getLvmBlockMountOptions()
+       mountFlags, mountOptions := s.getLvmBlockMountOptions()
        lvFsType := s.getLvmFilesystem()
        volumeType, err := storagePoolVolumeTypeNameToAPIEndpoint(s.volume.Type)
        if err != nil {
@@ -810,7 +833,7 @@ func (s *storageLvm) StoragePoolVolumeMount() (bool, error) 
{
        var customerr error
        ourMount := false
        if !shared.IsMountPoint(customPoolVolumeMntPoint) {
-               customerr = tryMount(lvmVolumePath, customPoolVolumeMntPoint, 
lvFsType, 0, mountOptions)
+               customerr = tryMount(lvmVolumePath, customPoolVolumeMntPoint, 
lvFsType, mountFlags, mountOptions)
                ourMount = true
        }
 
@@ -1493,7 +1516,7 @@ func (s *storageLvm) ContainerMount(c container) (bool, 
error) {
        lvFsType := s.getLvmFilesystem()
        poolName := s.getOnDiskPoolName()
        containerLvmPath := getLvmDevPath(poolName, 
storagePoolVolumeAPIEndpointContainers, containerLvmName)
-       mountOptions := s.getLvmBlockMountOptions()
+       mountFlags, mountOptions := s.getLvmBlockMountOptions()
 
        containerMntPoint := getContainerMountPoint(s.pool.Name, name)
        if shared.IsSnapshot(name) {
@@ -1518,7 +1541,7 @@ func (s *storageLvm) ContainerMount(c container) (bool, 
error) {
        var mounterr error
        ourMount := false
        if !shared.IsMountPoint(containerMntPoint) {
-               mounterr = tryMount(containerLvmPath, containerMntPoint, 
lvFsType, 0, mountOptions)
+               mounterr = tryMount(containerLvmPath, containerMntPoint, 
lvFsType, mountFlags, mountOptions)
                ourMount = true
        }
 
@@ -1862,11 +1885,11 @@ func (s *storageLvm) ContainerSnapshotStart(container 
container) (bool, error) {
        }
 
        lvFsType := s.getLvmFilesystem()
-       mountOptions := s.getLvmBlockMountOptions()
+       mountFlags, mountOptions := s.getLvmBlockMountOptions()
        containerMntPoint := getSnapshotMountPoint(s.pool.Name, containerName)
 
        if !shared.IsMountPoint(containerMntPoint) {
-               err = tryMount(containerLvmPath, containerMntPoint, lvFsType, 
0, mountOptions)
+               err = tryMount(containerLvmPath, containerMntPoint, lvFsType, 
mountFlags, mountOptions)
                if err != nil {
                        return false, fmt.Errorf("Error mounting snapshot LV 
path='%s': %s", containerMntPoint, err)
                }
@@ -2058,8 +2081,8 @@ func (s *storageLvm) ImageMount(fingerprint string) 
(bool, error) {
 
        poolName := s.getOnDiskPoolName()
        lvmVolumePath := getLvmDevPath(poolName, 
storagePoolVolumeAPIEndpointImages, fingerprint)
-       lvmMountOptions := s.getLvmBlockMountOptions()
-       err := tryMount(lvmVolumePath, imageMntPoint, lvmFstype, 0, 
lvmMountOptions)
+       mountFlags, mountOptions := s.getLvmBlockMountOptions()
+       err := tryMount(lvmVolumePath, imageMntPoint, lvmFstype, mountFlags, 
mountOptions)
        if err != nil {
                logger.Errorf(fmt.Sprintf("Error mounting image LV for 
unpacking: %s", err))
                return false, fmt.Errorf("Error mounting image LV: %v", err)

From 8844cba69d65ecfed5afdc0233b3dea1010b8f1e Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Thu, 4 May 2017 18:02:56 +0200
Subject: [PATCH 2/2] test: add mount option test for lvm

Closes #3284.

Signed-off-by: Christian Brauner <[email protected]>
---
 test/suites/storage.sh | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/test/suites/storage.sh b/test/suites/storage.sh
index 2ddbb46..8b2038c 100644
--- a/test/suites/storage.sh
+++ b/test/suites/storage.sh
@@ -176,6 +176,8 @@ test_storage() {
       lxc storage create "lxdtest-$(basename 
"${LXD_DIR}")-valid-lvm-pool-config-pool22" lvm lvm.use_thinpool=true
       lxc storage create "lxdtest-$(basename 
"${LXD_DIR}")-valid-lvm-pool-config-pool23" lvm lvm.use_thinpool=true 
lvm.thinpool_name="lxdtest-$(basename "${LXD_DIR}")-valid-lvm-pool-config"
       lxc storage create "lxdtest-$(basename 
"${LXD_DIR}")-valid-lvm-pool-config-pool24" lvm rsync.bwlimit=1024
+      lxc storage create "lxdtest-$(basename 
"${LXD_DIR}")-valid-lvm-pool-config-pool25" lvm 
volume.block.mount_options="rw,strictatime,discard"
+      lxc storage set "lxdtest-$(basename 
"${LXD_DIR}")-valid-lvm-pool-config-pool25" volume.block.mount_options 
"rw,lazytime"
     fi
 
     # Set default storage pool for image import.
@@ -658,6 +660,9 @@ test_storage() {
 
       lxc storage delete "lxdtest-$(basename 
"${LXD_DIR}")-valid-lvm-pool-config-pool24"
       vgremove -ff "lxdtest-$(basename "${LXD_DIR}")-non-thinpool-pool24" || 
true
+
+      lxc storage delete "lxdtest-$(basename 
"${LXD_DIR}")-valid-lvm-pool-config-pool25"
+      vgremove -ff "lxdtest-$(basename "${LXD_DIR}")-non-thinpool-pool25" || 
true
     fi
   )
 
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to