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

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) ===
This is pushing some of the bits from the btrfs pull request with minor edits as well as fixes I've had to prepare to get clean test runs with the old drivers removed.
From 39fd96ee317334026363fd4720a81b078eff1196 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.h...@canonical.com>
Date: Thu, 28 Nov 2019 19:47:57 +0100
Subject: [PATCH 1/6] lxd/storage: Create image volume DB entry

This creates an image volume DB entry if the backend supports optimized
images.

Signed-off-by: Thomas Hipp <thomas.h...@canonical.com>
---
 lxd/storage/backend_lxd.go | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lxd/storage/backend_lxd.go b/lxd/storage/backend_lxd.go
index 151434ab6c..7d3f265458 100644
--- a/lxd/storage/backend_lxd.go
+++ b/lxd/storage/backend_lxd.go
@@ -1600,6 +1600,11 @@ func (b *lxdBackend) EnsureImage(fingerprint string, op 
*operations.Operation) e
                return err
        }
 
+       err = VolumeDBCreate(b.state, b.name, fingerprint, "", 
db.StoragePoolVolumeTypeNameImage, false, nil)
+       if err != nil {
+               return err
+       }
+
        return nil
 }
 

From dc1bdad831d1e4507bebc4fbdf6beb5f425b246a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Thu, 12 Dec 2019 14:45:09 -0500
Subject: [PATCH 2/6] lxd/images: Port to new storage functions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/images.go | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/lxd/images.go b/lxd/images.go
index 989c89cbc9..bcc0c1b5b1 100644
--- a/lxd/images.go
+++ b/lxd/images.go
@@ -1367,6 +1367,21 @@ func pruneExpiredImages(ctx context.Context, d *Daemon) 
error {
 }
 
 func doDeleteImageFromPool(state *state.State, fingerprint string, storagePool 
string) error {
+       // New storage pool handling.
+       pool, err := storagePools.GetPoolByName(state, storagePool)
+       if err != storageDrivers.ErrUnknownDriver {
+               if err != nil {
+                       return err
+               }
+
+               err = pool.DeleteImage(fingerprint, nil)
+               if err != nil {
+                       return err
+               }
+
+               return nil
+       }
+
        // Initialize a new storage interface.
        s, err := storagePoolVolumeImageInit(state, storagePool, fingerprint)
        if err != nil {

From 6e166ff9b06d02a96557b334aebe2e1c39f239ff Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.h...@canonical.com>
Date: Thu, 14 Nov 2019 10:59:51 +0100
Subject: [PATCH 3/6] lxd/storage: Move storage_cgo.go to drivers package

Signed-off-by: Thomas Hipp <thomas.h...@canonical.com>
---
 lxd/storage/{storage_cgo.go => drivers/driver_cgo.go} | 6 +++---
 lxd/storage_btrfs.go                                  | 3 ++-
 lxd/storage_lvm.go                                    | 7 ++++---
 3 files changed, 9 insertions(+), 7 deletions(-)
 rename lxd/storage/{storage_cgo.go => drivers/driver_cgo.go} (98%)

diff --git a/lxd/storage/storage_cgo.go b/lxd/storage/drivers/driver_cgo.go
similarity index 98%
rename from lxd/storage/storage_cgo.go
rename to lxd/storage/drivers/driver_cgo.go
index 879e94ff54..fd066095e1 100644
--- a/lxd/storage/storage_cgo.go
+++ b/lxd/storage/drivers/driver_cgo.go
@@ -1,7 +1,7 @@
 // +build linux
 // +build cgo
 
-package storage
+package drivers
 
 import (
        "fmt"
@@ -29,8 +29,8 @@ import (
 #include <sys/stat.h>
 #include <sys/types.h>
 
-#include "../include/macro.h"
-#include "../include/memory_utils.h"
+#include "../../include/macro.h"
+#include "../../include/memory_utils.h"
 
 #define LXD_MAXPATH 4096
 #define LXD_NUMSTRLEN64 21
diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index 60eebee01e..fcceb6859a 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -25,6 +25,7 @@ import (
        "github.com/lxc/lxd/lxd/rsync"
        "github.com/lxc/lxd/lxd/state"
        driver "github.com/lxc/lxd/lxd/storage"
+       "github.com/lxc/lxd/lxd/storage/drivers"
        "github.com/lxc/lxd/lxd/util"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
@@ -428,7 +429,7 @@ func (s *storageBtrfs) StoragePoolMount() (bool, error) {
                        // Since we mount the loop device LO_FLAGS_AUTOCLEAR is
                        // fine since the loop device will be kept around for as
                        // long as the mount exists.
-                       loopF, loopErr := driver.PrepareLoopDev(source, 
driver.LoFlagsAutoclear)
+                       loopF, loopErr := drivers.PrepareLoopDev(source, 
drivers.LoFlagsAutoclear)
                        if loopErr != nil {
                                return false, loopErr
                        }
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 51b46e935b..f9a5880221 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -20,6 +20,7 @@ import (
        "github.com/lxc/lxd/lxd/project"
        "github.com/lxc/lxd/lxd/rsync"
        driver "github.com/lxc/lxd/lxd/storage"
+       "github.com/lxc/lxd/lxd/storage/drivers"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
        "github.com/lxc/lxd/shared/ioprogress"
@@ -397,7 +398,7 @@ func (s *storageLvm) StoragePoolDelete() error {
        if s.loopInfo != nil {
                // Set LO_FLAGS_AUTOCLEAR before we remove the loop file
                // otherwise we will get EBADF.
-               err = driver.SetAutoclearOnLoopDev(int(s.loopInfo.Fd()))
+               err = drivers.SetAutoclearOnLoopDev(int(s.loopInfo.Fd()))
                if err != nil {
                        logger.Warnf("Failed to set LO_FLAGS_AUTOCLEAR on loop 
device: %s, manual cleanup needed", err)
                }
@@ -469,12 +470,12 @@ func (s *storageLvm) StoragePoolMount() (bool, error) {
 
        if filepath.IsAbs(source) && !shared.IsBlockdevPath(source) {
                // Try to prepare new loop device.
-               loopF, loopErr := driver.PrepareLoopDev(source, 0)
+               loopF, loopErr := drivers.PrepareLoopDev(source, 0)
                if loopErr != nil {
                        return false, loopErr
                }
                // Make sure that LO_FLAGS_AUTOCLEAR is unset.
-               loopErr = driver.UnsetAutoclearOnLoopDev(int(loopF.Fd()))
+               loopErr = drivers.UnsetAutoclearOnLoopDev(int(loopF.Fd()))
                if loopErr != nil {
                        return false, loopErr
                }

From c8ebc4301d48026b10c15d93bea813d6fbc20ad9 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.h...@canonical.com>
Date: Wed, 4 Dec 2019 10:48:02 +0100
Subject: [PATCH 4/6] lxd/storage/drivers: Add FS and mount functions

This adds some filesystem and mount functions to the drivers package.

Signed-off-by: Thomas Hipp <thomas.h...@canonical.com>
---
 lxd/storage/drivers/utils.go | 96 ++++++++++++++++++++++++++++++++++++
 1 file changed, 96 insertions(+)

diff --git a/lxd/storage/drivers/utils.go b/lxd/storage/drivers/utils.go
index 54cb77c16f..3acc916a2f 100644
--- a/lxd/storage/drivers/utils.go
+++ b/lxd/storage/drivers/utils.go
@@ -5,6 +5,7 @@ import (
        "io/ioutil"
        "os"
        "path/filepath"
+       "strings"
        "time"
 
        "golang.org/x/sys/unix"
@@ -14,6 +15,11 @@ import (
        "github.com/lxc/lxd/shared/api"
 )
 
+// MkfsOptions represents options for filesystem creation.
+type MkfsOptions struct {
+       Label string
+}
+
 func wipeDirectory(path string) error {
        // List all entries
        entries, err := ioutil.ReadDir(path)
@@ -235,3 +241,93 @@ func createSparseFile(filePath string, sizeBytes int64) 
error {
 
        return nil
 }
+
+// MakeFSType creates the provided filesystem.
+func MakeFSType(path string, fsType string, options *MkfsOptions) (string, 
error) {
+       var err error
+       var msg string
+
+       fsOptions := options
+       if fsOptions == nil {
+               fsOptions = &MkfsOptions{}
+       }
+
+       cmd := []string{fmt.Sprintf("mkfs.%s", fsType), path}
+       if fsOptions.Label != "" {
+               cmd = append(cmd, "-L", fsOptions.Label)
+       }
+
+       if fsType == "ext4" {
+               cmd = append(cmd, "-E", 
"nodiscard,lazy_itable_init=0,lazy_journal_init=0")
+       }
+
+       msg, err = shared.TryRunCommand(cmd[0], cmd[1:]...)
+       if err != nil {
+               return msg, err
+       }
+
+       return "", nil
+}
+
+// Export the mount options map since we might find it useful in other parts of
+// LXD.
+type mountOptions struct {
+       capture bool
+       flag    uintptr
+}
+
+// mountOptions represents a list of possible mount options.
+var mountOptions = map[string]mountOptions{
+       "async":         {false, unix.MS_SYNCHRONOUS},
+       "atime":         {false, unix.MS_NOATIME},
+       "bind":          {true, unix.MS_BIND},
+       "defaults":      {true, 0},
+       "dev":           {false, unix.MS_NODEV},
+       "diratime":      {false, unix.MS_NODIRATIME},
+       "dirsync":       {true, unix.MS_DIRSYNC},
+       "exec":          {false, unix.MS_NOEXEC},
+       "lazytime":      {true, unix.MS_LAZYTIME},
+       "mand":          {true, unix.MS_MANDLOCK},
+       "noatime":       {true, unix.MS_NOATIME},
+       "nodev":         {true, unix.MS_NODEV},
+       "nodiratime":    {true, unix.MS_NODIRATIME},
+       "noexec":        {true, unix.MS_NOEXEC},
+       "nomand":        {false, unix.MS_MANDLOCK},
+       "norelatime":    {false, unix.MS_RELATIME},
+       "nostrictatime": {false, unix.MS_STRICTATIME},
+       "nosuid":        {true, unix.MS_NOSUID},
+       "rbind":         {true, unix.MS_BIND | unix.MS_REC},
+       "relatime":      {true, unix.MS_RELATIME},
+       "remount":       {true, unix.MS_REMOUNT},
+       "ro":            {true, unix.MS_RDONLY},
+       "rw":            {false, unix.MS_RDONLY},
+       "strictatime":   {true, unix.MS_STRICTATIME},
+       "suid":          {false, unix.MS_NOSUID},
+       "sync":          {true, unix.MS_SYNCHRONOUS},
+}
+
+// ResolveMountOptions resolves the provided mount options.
+func ResolveMountOptions(options string) (uintptr, string) {
+       mountFlags := uintptr(0)
+       tmp := strings.SplitN(options, ",", -1)
+       for i := 0; i < len(tmp); i++ {
+               opt := tmp[i]
+               do, ok := MountOptions[opt]
+               if !ok {
+                       continue
+               }
+
+               if do.capture {
+                       mountFlags |= do.flag
+               } else {
+                       mountFlags &= ^do.flag
+               }
+
+               copy(tmp[i:], tmp[i+1:])
+               tmp[len(tmp)-1] = ""
+               tmp = tmp[:len(tmp)-1]
+               i--
+       }
+
+       return mountFlags, strings.Join(tmp, ",")
+}

From 05c7d265279a9205b88d3f649e859bd449dd7ae9 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.h...@canonical.com>
Date: Wed, 4 Dec 2019 10:49:04 +0100
Subject: [PATCH 5/6] lxd: Use FS and mount functions from drivers package

This changes the storage code to use the filesystem and mount functions
from the drivers package.

Signed-off-by: Thomas Hipp <thomas.h...@canonical.com>
---
 lxd/storage_btrfs.go      |  8 ++++----
 lxd/storage_ceph.go       | 11 ++++++-----
 lxd/storage_ceph_utils.go |  7 ++++---
 lxd/storage_lvm.go        |  8 ++++----
 lxd/storage_lvm_utils.go  |  3 ++-
 5 files changed, 20 insertions(+), 17 deletions(-)

diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index fcceb6859a..556e50e917 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -163,7 +163,7 @@ func (s *storageBtrfs) StoragePoolCreate() error {
                        return fmt.Errorf("Failed to create sparse file %s: 
%s", source, err)
                }
 
-               output, err := driver.MakeFSType(source, "btrfs", 
&driver.MkfsOptions{Label: s.pool.Name})
+               output, err := drivers.MakeFSType(source, "btrfs", 
&drivers.MkfsOptions{Label: s.pool.Name})
                if err != nil {
                        return fmt.Errorf("Failed to create the BTRFS pool: %v 
(%s)", err, output)
                }
@@ -174,7 +174,7 @@ func (s *storageBtrfs) StoragePoolCreate() error {
                if filepath.IsAbs(source) {
                        isBlockDev = shared.IsBlockdevPath(source)
                        if isBlockDev {
-                               output, err := driver.MakeFSType(source, 
"btrfs", &driver.MkfsOptions{Label: s.pool.Name})
+                               output, err := drivers.MakeFSType(source, 
"btrfs", &drivers.MkfsOptions{Label: s.pool.Name})
                                if err != nil {
                                        return fmt.Errorf("Failed to create the 
BTRFS pool: %v (%s)", err, output)
                                }
@@ -222,7 +222,7 @@ func (s *storageBtrfs) StoragePoolCreate() error {
 
        var err1 error
        var devUUID string
-       mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getBtrfsMountOptions())
+       mountFlags, mountOptions := 
drivers.ResolveMountOptions(s.getBtrfsMountOptions())
        mountFlags |= s.remount
        if isBlockDev && filepath.IsAbs(source) {
                devUUID, _ = shared.LookupUUIDByBlockDevPath(source)
@@ -415,7 +415,7 @@ func (s *storageBtrfs) StoragePoolMount() (bool, error) {
                return false, nil
        }
 
-       mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getBtrfsMountOptions())
+       mountFlags, mountOptions := 
drivers.ResolveMountOptions(s.getBtrfsMountOptions())
        mountSource := source
        isBlockDev := shared.IsBlockdevPath(source)
        if filepath.IsAbs(source) {
diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index 6596bdbd5d..750112b03c 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -23,6 +23,7 @@ import (
        "github.com/lxc/lxd/lxd/project"
        "github.com/lxc/lxd/lxd/rsync"
        driver "github.com/lxc/lxd/lxd/storage"
+       storageDrivers "github.com/lxc/lxd/lxd/storage/drivers"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
        "github.com/lxc/lxd/shared/ioprogress"
@@ -372,7 +373,7 @@ func (s *storageCeph) StoragePoolVolumeCreate() error {
        RBDFilesystem := s.getRBDFilesystem()
        logger.Debugf(`Retrieved filesystem type "%s" of RBD storage volume 
"%s" on storage pool "%s"`, RBDFilesystem, s.volume.Name, s.pool.Name)
 
-       output, err := driver.MakeFSType(RBDDevPath, RBDFilesystem, nil)
+       output, err := storageDrivers.MakeFSType(RBDDevPath, RBDFilesystem, nil)
        if err != nil {
                logger.Errorf(`Failed to create filesystem type "%s" on device 
path "%s" for RBD storage volume "%s" on storage pool "%s": %v (%s)`, 
RBDFilesystem, RBDDevPath, s.volume.Name, s.pool.Name, err, output)
                return err
@@ -522,7 +523,7 @@ func (s *storageCeph) StoragePoolVolumeMount() (bool, 
error) {
                RBDDevPath, ret = getRBDMappedDevPath(s.ClusterName, 
s.OSDPoolName,
                        storagePoolVolumeTypeNameCustom, s.volume.Name, true,
                        s.UserName)
-               mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getRBDMountOptions())
+               mountFlags, mountOptions := 
storageDrivers.ResolveMountOptions(s.getRBDMountOptions())
                customerr = driver.TryMount(
                        RBDDevPath,
                        volumeMntPoint,
@@ -1833,7 +1834,7 @@ func (s *storageCeph) ContainerSnapshotStart(c 
instance.Instance) (bool, error)
 
        containerMntPoint := driver.GetSnapshotMountPoint(c.Project(), 
s.pool.Name, containerName)
        RBDFilesystem := s.getRBDFilesystem()
-       mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getRBDMountOptions())
+       mountFlags, mountOptions := 
storageDrivers.ResolveMountOptions(s.getRBDMountOptions())
        if RBDFilesystem == "xfs" {
                idx := strings.Index(mountOptions, "nouuid")
                if idx < 0 {
@@ -2105,7 +2106,7 @@ func (s *storageCeph) ImageCreate(fingerprint string, 
tracker *ioprogress.Progre
 
                // get filesystem
                RBDFilesystem := s.getRBDFilesystem()
-               output, err := driver.MakeFSType(RBDDevPath, RBDFilesystem, nil)
+               output, err := storageDrivers.MakeFSType(RBDDevPath, 
RBDFilesystem, nil)
                if err != nil {
                        logger.Errorf(`Failed to create filesystem "%s" for RBD 
storage volume for image "%s" on storage pool "%s": %v (%s)`, RBDFilesystem, 
fingerprint, s.pool.Name, err, output)
                        return err
@@ -2340,7 +2341,7 @@ func (s *storageCeph) ImageMount(fingerprint string) 
(bool, error) {
 
        RBDFilesystem := s.getRBDFilesystem()
        RBDMountOptions := s.getRBDMountOptions()
-       mountFlags, mountOptions := 
driver.LXDResolveMountoptions(RBDMountOptions)
+       mountFlags, mountOptions := 
storageDrivers.ResolveMountOptions(RBDMountOptions)
        RBDDevPath, ret := getRBDMappedDevPath(s.ClusterName, s.OSDPoolName,
                storagePoolVolumeTypeNameImage, fingerprint, true, s.UserName)
        errMsg := fmt.Sprintf("Failed to mount RBD device %s onto %s",
diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go
index f5d5b75f74..0a2abbdd98 100644
--- a/lxd/storage_ceph_utils.go
+++ b/lxd/storage_ceph_utils.go
@@ -20,6 +20,7 @@ import (
        "github.com/lxc/lxd/lxd/project"
        "github.com/lxc/lxd/lxd/rsync"
        driver "github.com/lxc/lxd/lxd/storage"
+       "github.com/lxc/lxd/lxd/storage/drivers"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
        "github.com/lxc/lxd/shared/logger"
@@ -1684,7 +1685,7 @@ func (s *storageCeph) cephRBDVolumeBackupCreate(tmpPath 
string, backup backup.Ba
        }
 
        // Mount the volume
-       mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getRBDMountOptions())
+       mountFlags, mountOptions := 
drivers.ResolveMountOptions(s.getRBDMountOptions())
        err = driver.TryMount(RBDDevPath, tmpContainerMntPoint, RBDFilesystem, 
mountFlags, mountOptions)
        if err != nil {
                logger.Errorf("Failed to mount RBD device %s onto %s: %s", 
RBDDevPath, tmpContainerMntPoint, err)
@@ -1771,7 +1772,7 @@ func (s *storageCeph) doContainerCreate(projectName, name 
string, privileged boo
 
        // get filesystem
        RBDFilesystem := s.getRBDFilesystem()
-       output, err := driver.MakeFSType(RBDDevPath, RBDFilesystem, nil)
+       output, err := drivers.MakeFSType(RBDDevPath, RBDFilesystem, nil)
        if err != nil {
                logger.Errorf(`Failed to create filesystem type "%s" on device 
path "%s" for RBD storage volume for container "%s" on storage pool "%s": %v 
(%s)`, RBDFilesystem, RBDDevPath, name, s.pool.Name, err, output)
                return err
@@ -1838,7 +1839,7 @@ func (s *storageCeph) doContainerMount(projectName 
string, name string) (bool, e
                        s.OSDPoolName, storagePoolVolumeTypeNameContainer,
                        volumeName, true, s.UserName)
                if ret >= 0 {
-                       mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getRBDMountOptions())
+                       mountFlags, mountOptions := 
drivers.ResolveMountOptions(s.getRBDMountOptions())
                        mounterr = driver.TryMount(RBDDevPath, 
containerMntPoint,
                                RBDFilesystem, mountFlags, mountOptions)
                        ourMount = true
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index f9a5880221..2a8d924972 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -629,7 +629,7 @@ func (s *storageLvm) StoragePoolVolumeMount() (bool, error) 
{
        var customerr error
        ourMount := false
        if !shared.IsMountPoint(customPoolVolumeMntPoint) {
-               mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getLvmMountOptions())
+               mountFlags, mountOptions := 
drivers.ResolveMountOptions(s.getLvmMountOptions())
                customerr = driver.TryMount(lvmVolumePath, 
customPoolVolumeMntPoint, lvFsType, mountFlags, mountOptions)
                ourMount = true
        }
@@ -1271,7 +1271,7 @@ func (s *storageLvm) doContainerMount(project, name 
string, snap bool) (bool, er
        var mounterr error
        ourMount := false
        if !shared.IsMountPoint(containerMntPoint) {
-               mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getLvmMountOptions())
+               mountFlags, mountOptions := 
drivers.ResolveMountOptions(s.getLvmMountOptions())
                if snap && lvFsType == "xfs" {
                        idx := strings.Index(mountOptions, "nouuid")
                        if idx < 0 {
@@ -1602,7 +1602,7 @@ func (s *storageLvm) ContainerSnapshotStart(container 
instance.Instance) (bool,
        containerMntPoint := driver.GetSnapshotMountPoint(container.Project(), 
s.pool.Name, containerName)
        if !shared.IsMountPoint(containerMntPoint) {
                mntOptString := s.getLvmMountOptions()
-               mountFlags, mountOptions := 
driver.LXDResolveMountoptions(mntOptString)
+               mountFlags, mountOptions := 
drivers.ResolveMountOptions(mntOptString)
 
                if lvFsType == "xfs" {
                        idx := strings.Index(mountOptions, "nouuid")
@@ -2023,7 +2023,7 @@ func (s *storageLvm) ImageMount(fingerprint string) 
(bool, error) {
 
        poolName := s.getOnDiskPoolName()
        lvmVolumePath := getLvmDevPath("default", poolName, 
storagePoolVolumeAPIEndpointImages, fingerprint)
-       mountFlags, mountOptions := 
driver.LXDResolveMountoptions(s.getLvmMountOptions())
+       mountFlags, mountOptions := 
drivers.ResolveMountOptions(s.getLvmMountOptions())
        err := driver.TryMount(lvmVolumePath, imageMntPoint, lvmFstype, 
mountFlags, mountOptions)
        if err != nil {
                logger.Errorf(fmt.Sprintf("Error mounting image LV for 
unpacking: %s", err))
diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index cec7c223f9..ae3085f8e6 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -17,6 +17,7 @@ import (
        "github.com/lxc/lxd/lxd/rsync"
        "github.com/lxc/lxd/lxd/state"
        driver "github.com/lxc/lxd/lxd/storage"
+       storageDrivers "github.com/lxc/lxd/lxd/storage/drivers"
        "github.com/lxc/lxd/shared"
        "github.com/lxc/lxd/shared/api"
        "github.com/lxc/lxd/shared/logger"
@@ -856,7 +857,7 @@ func lvmCreateLv(projectName, vgName string, thinPoolName 
string, lvName string,
 
        fsPath := getLvmDevPath(projectName, vgName, volumeType, lvName)
 
-       output, err = driver.MakeFSType(fsPath, lvFsType, nil)
+       output, err = storageDrivers.MakeFSType(fsPath, lvFsType, nil)
        if err != nil {
                logger.Errorf("Filesystem creation failed: %v (%s)", err, 
output)
                return fmt.Errorf("Error making filesystem on image LV: %v 
(%s)", err, output)

From a3db7d19ec49341b1b8ece8dd0fdbb5f54467cda Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.h...@canonical.com>
Date: Wed, 4 Dec 2019 10:49:51 +0100
Subject: [PATCH 6/6] lxd/storage: Remove FS and mount functions

This removes some filesystem and mount function from the storage package
which are now located in the storage/drivers package.

Signed-off-by: Thomas Hipp <thomas.h...@canonical.com>
---
 lxd/storage/utils.go | 58 --------------------------------------------
 1 file changed, 58 deletions(-)

diff --git a/lxd/storage/utils.go b/lxd/storage/utils.go
index db4eb0f1ff..1ec383dcbc 100644
--- a/lxd/storage/utils.go
+++ b/lxd/storage/utils.go
@@ -31,11 +31,6 @@ var baseDirectories = map[drivers.VolumeType][]string{
 // VolumeUsedByInstancesWithProfiles returns a slice containing the names of 
instances using a volume.
 var VolumeUsedByInstancesWithProfiles func(s *state.State, poolName string, 
volumeName string, volumeTypeName string, runningOnly bool) ([]string, error)
 
-// MkfsOptions represents options for filesystem creation.
-type MkfsOptions struct {
-       Label string
-}
-
 // Export the mount options map since we might find it useful in other parts of
 // LXD.
 type mountOptions struct {
@@ -73,32 +68,6 @@ var MountOptions = map[string]mountOptions{
        "sync":          {true, unix.MS_SYNCHRONOUS},
 }
 
-// LXDResolveMountoptions resolves the provided mount options.
-func LXDResolveMountoptions(options string) (uintptr, string) {
-       mountFlags := uintptr(0)
-       tmp := strings.SplitN(options, ",", -1)
-       for i := 0; i < len(tmp); i++ {
-               opt := tmp[i]
-               do, ok := MountOptions[opt]
-               if !ok {
-                       continue
-               }
-
-               if do.capture {
-                       mountFlags |= do.flag
-               } else {
-                       mountFlags &= ^do.flag
-               }
-
-               copy(tmp[i:], tmp[i+1:])
-               tmp[len(tmp)-1] = ""
-               tmp = tmp[:len(tmp)-1]
-               i--
-       }
-
-       return mountFlags, strings.Join(tmp, ",")
-}
-
 // TryMount tries mounting a filesystem multiple times. This is useful for 
unreliable backends.
 func TryMount(src string, dst string, fs string, flags uintptr, options 
string) error {
        var err error
@@ -225,33 +194,6 @@ func LXDUsesPool(dbObj *db.Cluster, onDiskPoolName string, 
driver string, onDisk
        return false, "", nil
 }
 
-// MakeFSType creates the provided filesystem.
-func MakeFSType(path string, fsType string, options *MkfsOptions) (string, 
error) {
-       var err error
-       var msg string
-
-       fsOptions := options
-       if fsOptions == nil {
-               fsOptions = &MkfsOptions{}
-       }
-
-       cmd := []string{fmt.Sprintf("mkfs.%s", fsType), path}
-       if fsOptions.Label != "" {
-               cmd = append(cmd, "-L", fsOptions.Label)
-       }
-
-       if fsType == "ext4" {
-               cmd = append(cmd, "-E", 
"nodiscard,lazy_itable_init=0,lazy_journal_init=0")
-       }
-
-       msg, err = shared.TryRunCommand(cmd[0], cmd[1:]...)
-       if err != nil {
-               return msg, err
-       }
-
-       return "", nil
-}
-
 // FSGenerateNewUUID generates a UUID for the given path for btrfs and xfs 
filesystems.
 func FSGenerateNewUUID(fstype string, lvpath string) (string, error) {
        switch fstype {
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to