[lxc-devel] [lxd/master] lvm: resolve mount options properly

brauner on Github lxc-bot at linuxcontainers.org
Thu May 4 16:04:09 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 381 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170504/71a47b60/attachment.bin>
-------------- next part --------------
From be8bd339793f8b0a8f83ef4b8e83a6d8f468bcc7 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
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 <christian.brauner at ubuntu.com>
---
 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 <christian.brauner at ubuntu.com>
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 <christian.brauner at ubuntu.com>
---
 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
   )
 


More information about the lxc-devel mailing list