[lxc-devel] [lxd/master] dir: make sure pool is mounted

brauner on Github lxc-bot at linuxcontainers.org
Thu Oct 12 18:20:46 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/20171012/cf880f86/attachment.bin>
-------------- next part --------------
From 2b6e15a2f5e159898edc6bc8ad543ffe454b8ed9 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Thu, 12 Oct 2017 20:19:18 +0200
Subject: [PATCH] dir: make sure pool is mounted

Closes #3938.

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 lxd/storage_dir.go | 137 +++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 123 insertions(+), 14 deletions(-)

diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go
index 487cc8991..dc2a5a5b7 100644
--- a/lxd/storage_dir.go
+++ b/lxd/storage_dir.go
@@ -289,6 +289,14 @@ func (s *storageDir) GetContainerPoolInfo() (int64, string, string) {
 func (s *storageDir) StoragePoolUpdate(writable *api.StoragePoolPut, changedConfig []string) error {
 	logger.Infof(`Updating DIR storage pool "%s"`, s.pool.Name)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	changeable := changeableStoragePoolProperties["dir"]
 	unchangeable := []string{}
 	for _, change := range changedConfig {
@@ -311,13 +319,21 @@ func (s *storageDir) StoragePoolUpdate(writable *api.StoragePoolPut, changedConf
 func (s *storageDir) StoragePoolVolumeCreate() error {
 	logger.Infof("Creating DIR storage volume \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	source := s.pool.Config["source"]
 	if source == "" {
 		return fmt.Errorf("no \"source\" property found for the storage pool")
 	}
 
 	storageVolumePath := getStoragePoolVolumeMountPoint(s.pool.Name, s.volume.Name)
-	err := os.MkdirAll(storageVolumePath, 0711)
+	err = os.MkdirAll(storageVolumePath, 0711)
 	if err != nil {
 		return err
 	}
@@ -334,12 +350,17 @@ func (s *storageDir) StoragePoolVolumeDelete() error {
 		return fmt.Errorf("no \"source\" property found for the storage pool")
 	}
 
+	_, err := s.StoragePoolUmount()
+	if err != nil {
+		return err
+	}
+
 	storageVolumePath := getStoragePoolVolumeMountPoint(s.pool.Name, s.volume.Name)
 	if !shared.PathExists(storageVolumePath) {
 		return nil
 	}
 
-	err := os.RemoveAll(storageVolumePath)
+	err = os.RemoveAll(storageVolumePath)
 	if err != nil {
 		return err
 	}
@@ -370,6 +391,14 @@ func (s *storageDir) StoragePoolVolumeUmount() (bool, error) {
 func (s *storageDir) StoragePoolVolumeUpdate(writable *api.StorageVolumePut, changedConfig []string) error {
 	logger.Infof(`Updating DIR storage volume "%s"`, s.pool.Name)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	changeable := changeableStoragePoolVolumeProperties["dir"]
 	unchangeable := []string{}
 	for _, change := range changedConfig {
@@ -395,13 +424,21 @@ func (s *storageDir) ContainerStorageReady(name string) bool {
 func (s *storageDir) ContainerCreate(container container) error {
 	logger.Debugf("Creating empty DIR storage volume for container \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	source := s.pool.Config["source"]
 	if source == "" {
 		return fmt.Errorf("no \"source\" property found for the storage pool")
 	}
 
 	containerMntPoint := getContainerMountPoint(s.pool.Name, container.Name())
-	err := createContainerMountpoint(containerMntPoint, container.Path(), container.IsPrivileged())
+	err = createContainerMountpoint(containerMntPoint, container.Path(), container.IsPrivileged())
 	if err != nil {
 		return err
 	}
@@ -427,6 +464,14 @@ func (s *storageDir) ContainerCreate(container container) error {
 func (s *storageDir) ContainerCreateFromImage(container container, imageFingerprint string) error {
 	logger.Debugf("Creating DIR storage volume for container \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	source := s.pool.Config["source"]
 	if source == "" {
 		return fmt.Errorf("no \"source\" property found for the storage pool")
@@ -435,7 +480,7 @@ func (s *storageDir) ContainerCreateFromImage(container container, imageFingerpr
 	privileged := container.IsPrivileged()
 	containerName := container.Name()
 	containerMntPoint := getContainerMountPoint(s.pool.Name, containerName)
-	err := createContainerMountpoint(containerMntPoint, container.Path(), privileged)
+	err = createContainerMountpoint(containerMntPoint, container.Path(), privileged)
 	if err != nil {
 		return err
 	}
@@ -483,6 +528,14 @@ func (s *storageDir) ContainerDelete(container container) error {
 		return fmt.Errorf("no \"source\" property found for the storage pool")
 	}
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	// Delete the container on its storage pool:
 	// ${POOL}/containers/<container_name>
 	containerName := container.Name()
@@ -498,7 +551,7 @@ func (s *storageDir) ContainerDelete(container container) error {
 		}
 	}
 
-	err := deleteContainerMountpoint(containerMntPoint, container.Path(), s.GetStorageTypeName())
+	err = deleteContainerMountpoint(containerMntPoint, container.Path(), s.GetStorageTypeName())
 	if err != nil {
 		return err
 	}
@@ -584,6 +637,14 @@ func (s *storageDir) copySnapshot(target container, source container) error {
 func (s *storageDir) ContainerCopy(target container, source container, containerOnly bool) error {
 	logger.Debugf("Copying DIR container storage %s -> %s.", source.Name(), target.Name())
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	ourStart, err := source.StorageStart()
 	if err != nil {
 		return err
@@ -642,16 +703,24 @@ func (s *storageDir) ContainerCopy(target container, source container, container
 }
 
 func (s *storageDir) ContainerMount(c container) (bool, error) {
-	return true, nil
+	return s.StoragePoolMount()
 }
 
 func (s *storageDir) ContainerUmount(name string, path string) (bool, error) {
-	return true, nil
+	return s.StoragePoolUmount()
 }
 
 func (s *storageDir) ContainerRename(container container, newName string) error {
 	logger.Debugf("Renaming DIR storage volume for container \"%s\" from %s -> %s.", s.volume.Name, s.volume.Name, newName)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	source := s.pool.Config["source"]
 	if source == "" {
 		return fmt.Errorf("no \"source\" property found for the storage pool")
@@ -661,7 +730,7 @@ func (s *storageDir) ContainerRename(container container, newName string) error
 	oldContainerSymlink := shared.VarPath("containers", container.Name())
 	newContainerMntPoint := getContainerMountPoint(s.pool.Name, newName)
 	newContainerSymlink := shared.VarPath("containers", newName)
-	err := renameContainerMountpoint(oldContainerMntPoint, oldContainerSymlink, newContainerMntPoint, newContainerSymlink)
+	err = renameContainerMountpoint(oldContainerMntPoint, oldContainerSymlink, newContainerMntPoint, newContainerSymlink)
 	if err != nil {
 		return err
 	}
@@ -702,6 +771,14 @@ func (s *storageDir) ContainerRename(container container, newName string) error
 func (s *storageDir) ContainerRestore(container container, sourceContainer container) error {
 	logger.Debugf("Restoring DIR storage volume for container \"%s\" from %s -> %s.", s.volume.Name, sourceContainer.Name(), container.Name())
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	targetPath := container.Path()
 	sourcePath := sourceContainer.Path()
 
@@ -728,10 +805,18 @@ func (s *storageDir) ContainerGetUsage(container container) (int64, error) {
 func (s *storageDir) ContainerSnapshotCreate(snapshotContainer container, sourceContainer container) error {
 	logger.Debugf("Creating DIR storage volume for snapshot \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	// Create the path for the snapshot.
 	targetContainerName := snapshotContainer.Name()
 	targetContainerMntPoint := getSnapshotMountPoint(s.pool.Name, targetContainerName)
-	err := os.MkdirAll(targetContainerMntPoint, 0711)
+	err = os.MkdirAll(targetContainerMntPoint, 0711)
 	if err != nil {
 		return err
 	}
@@ -800,10 +885,18 @@ onSuccess:
 func (s *storageDir) ContainerSnapshotCreateEmpty(snapshotContainer container) error {
 	logger.Debugf("Creating empty DIR storage volume for snapshot \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	// Create the path for the snapshot.
 	targetContainerName := snapshotContainer.Name()
 	targetContainerMntPoint := getSnapshotMountPoint(s.pool.Name, targetContainerName)
-	err := os.MkdirAll(targetContainerMntPoint, 0711)
+	err = os.MkdirAll(targetContainerMntPoint, 0711)
 	if err != nil {
 		return err
 	}
@@ -869,13 +962,21 @@ func dirSnapshotDeleteInternal(poolName string, snapshotName string) error {
 func (s *storageDir) ContainerSnapshotDelete(snapshotContainer container) error {
 	logger.Debugf("Deleting DIR storage volume for snapshot \"%s\" on storage pool \"%s\".", s.volume.Name, s.pool.Name)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	source := s.pool.Config["source"]
 	if source == "" {
 		return fmt.Errorf("no \"source\" property found for the storage pool")
 	}
 
 	snapshotContainerName := snapshotContainer.Name()
-	err := dirSnapshotDeleteInternal(s.pool.Name, snapshotContainerName)
+	err = dirSnapshotDeleteInternal(s.pool.Name, snapshotContainerName)
 	if err != nil {
 		return err
 	}
@@ -887,11 +988,19 @@ func (s *storageDir) ContainerSnapshotDelete(snapshotContainer container) error
 func (s *storageDir) ContainerSnapshotRename(snapshotContainer container, newName string) error {
 	logger.Debugf("Renaming DIR storage volume for snapshot \"%s\" from %s -> %s.", s.volume.Name, s.volume.Name, newName)
 
+	ourMount, err := s.StoragePoolMount()
+	if err != nil {
+		return err
+	}
+	if ourMount {
+		defer s.StoragePoolUmount()
+	}
+
 	// Rename the mountpoint for the snapshot:
 	// ${POOL}/snapshots/<old_snapshot_name> to ${POOL}/snapshots/<new_snapshot_name>
 	oldSnapshotMntPoint := getSnapshotMountPoint(s.pool.Name, snapshotContainer.Name())
 	newSnapshotMntPoint := getSnapshotMountPoint(s.pool.Name, newName)
-	err := os.Rename(oldSnapshotMntPoint, newSnapshotMntPoint)
+	err = os.Rename(oldSnapshotMntPoint, newSnapshotMntPoint)
 	if err != nil {
 		return err
 	}
@@ -901,11 +1010,11 @@ func (s *storageDir) ContainerSnapshotRename(snapshotContainer container, newNam
 }
 
 func (s *storageDir) ContainerSnapshotStart(container container) (bool, error) {
-	return true, nil
+	return s.StoragePoolMount()
 }
 
 func (s *storageDir) ContainerSnapshotStop(container container) (bool, error) {
-	return true, nil
+	return s.StoragePoolUmount()
 }
 
 func (s *storageDir) ImageCreate(fingerprint string) error {


More information about the lxc-devel mailing list