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

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) ===
Addresses an issue discovered in https://discuss.linuxcontainers.org/t/volume-block-mount-options-not-working/8049
From 31d86a624c5476ca60c11e8b566530442a53fe1d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 5 Jun 2020 09:41:49 +0100
Subject: [PATCH 1/6] lxd/storage/drivers/driver/ceph/utils: Removes
 getRBDFilesystem

Should use vol.ConfigBlockFilesystem() instead.

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/storage/drivers/driver_ceph_utils.go | 13 -------------
 1 file changed, 13 deletions(-)

diff --git a/lxd/storage/drivers/driver_ceph_utils.go 
b/lxd/storage/drivers/driver_ceph_utils.go
index 9e4b24d1ae..5cb653ea84 100644
--- a/lxd/storage/drivers/driver_ceph_utils.go
+++ b/lxd/storage/drivers/driver_ceph_utils.go
@@ -524,19 +524,6 @@ func (d *ceph) rbdListVolumeSnapshots(vol Volume) 
([]string, error) {
        return snapshots, nil
 }
 
-// getRBDFilesystem returns the filesystem the RBD storage volume is supposed 
to be created with.
-func (d *ceph) getRBDFilesystem(vol Volume) string {
-       if vol.config["block.filesystem"] != "" {
-               return vol.config["block.filesystem"]
-       }
-
-       if vol.poolConfig["volume.block.filesystem"] != "" {
-               return vol.poolConfig["volume.block.filesystem"]
-       }
-
-       return "ext4"
-}
-
 // getRBDMountOptions returns the mount options the storage volume is supposed 
to be mounted with
 // the option string that is returned needs to be passed to the approriate
 // helper (currently named "LXDResolveMountoptions") which will take on the job

From 2726319ebeaabba58d696bd79ccbe20eaa9170dd Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 5 Jun 2020 09:42:39 +0100
Subject: [PATCH 2/6] lxd/storage/drivers/driver/ceph: Replaces use of
 d.getRBDFilesystem with vol.ConfigBlockFilesystem

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/storage/drivers/driver_ceph_utils.go   |  4 ++--
 lxd/storage/drivers/driver_ceph_volumes.go | 14 +++++++-------
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/lxd/storage/drivers/driver_ceph_utils.go 
b/lxd/storage/drivers/driver_ceph_utils.go
index 5cb653ea84..7273a3db18 100644
--- a/lxd/storage/drivers/driver_ceph_utils.go
+++ b/lxd/storage/drivers/driver_ceph_utils.go
@@ -537,7 +537,7 @@ func (d *ceph) getRBDMountOptions(vol Volume) string {
                return vol.poolConfig["volume.block.mount_options"]
        }
 
-       if d.getRBDFilesystem(vol) == "btrfs" {
+       if vol.ConfigBlockFilesystem() == "btrfs" {
                return "user_subvol_rm_allowed,discard"
        }
 
@@ -1032,7 +1032,7 @@ func (d *ceph) getRBDVolumeName(vol Volume, snapName 
string, zombie bool, withPo
 
        // Only use filesystem suffix on filesystem type image volumes (for all 
content types).
        if vol.volType == VolumeTypeImage || vol.volType == 
cephVolumeTypeZombieImage {
-               parentName = fmt.Sprintf("%s_%s", parentName, 
d.getRBDFilesystem(vol))
+               parentName = fmt.Sprintf("%s_%s", parentName, 
vol.ConfigBlockFilesystem())
        }
 
        if vol.contentType == ContentTypeBlock {
diff --git a/lxd/storage/drivers/driver_ceph_volumes.go 
b/lxd/storage/drivers/driver_ceph_volumes.go
index ab3bd6c9ac..15a347fae2 100644
--- a/lxd/storage/drivers/driver_ceph_volumes.go
+++ b/lxd/storage/drivers/driver_ceph_volumes.go
@@ -139,7 +139,7 @@ func (d *ceph) CreateVolume(vol Volume, filler 
*VolumeFiller, op *operations.Ope
        revert.Add(func() { d.rbdUnmapVolume(vol, true) })
 
        // Get filesystem.
-       RBDFilesystem := d.getRBDFilesystem(vol)
+       RBDFilesystem := vol.ConfigBlockFilesystem()
 
        if vol.contentType == ContentTypeFS {
                _, err = makeFSType(RBDDevPath, RBDFilesystem, nil)
@@ -311,7 +311,7 @@ func (d *ceph) CreateVolumeFromCopy(vol Volume, srcVol 
Volume, copySnapshots boo
                if vol.contentType == ContentTypeFS {
                        // Re-generate the UUID. Do this first as ensuring 
permissions and setting quota can
                        // rely on being able to mount the volume.
-                       err = d.generateUUID(d.getRBDFilesystem(v), RBDDevPath)
+                       err = d.generateUUID(v.ConfigBlockFilesystem(), 
RBDDevPath)
                        if err != nil {
                                return err
                        }
@@ -587,7 +587,7 @@ func (d *ceph) CreateVolumeFromMigration(vol Volume, conn 
io.ReadWriteCloser, vo
        defer d.rbdUnmapVolume(vol, true)
 
        // Re-generate the UUID.
-       err = d.generateUUID(d.getRBDFilesystem(vol), RBDDevPath)
+       err = d.generateUUID(vol.ConfigBlockFilesystem(), RBDDevPath)
        if err != nil {
                return err
        }
@@ -824,7 +824,7 @@ func (d *ceph) SetVolumeQuota(vol Volume, size string, op 
*operations.Operation)
                return nil
        }
 
-       fsType := d.getRBDFilesystem(vol)
+       fsType := vol.ConfigBlockFilesystem()
 
        RBDDevPath, err := d.getRBDMappedDevPath(vol)
        if err != nil {
@@ -928,7 +928,7 @@ func (d *ceph) MountVolume(vol Volume, op 
*operations.Operation) (bool, error) {
                        return false, err
                }
 
-               RBDFilesystem := d.getRBDFilesystem(vol)
+               RBDFilesystem := vol.ConfigBlockFilesystem()
                mountFlags, mountOptions := 
resolveMountOptions(d.getRBDMountOptions(vol))
                err = TryMount(RBDDevPath, mountPath, RBDFilesystem, 
mountFlags, mountOptions)
                if err != nil {
@@ -1311,7 +1311,7 @@ func (d *ceph) MountVolumeSnapshot(snapVol Volume, op 
*operations.Operation) (bo
                        return false, nil
                }
 
-               RBDFilesystem := d.getRBDFilesystem(snapVol)
+               RBDFilesystem := snapVol.ConfigBlockFilesystem()
                mountFlags, mountOptions := 
resolveMountOptions(d.getRBDMountOptions(snapVol))
 
                if renegerateFilesystemUUIDNeeded(RBDFilesystem) {
@@ -1453,7 +1453,7 @@ func (d *ceph) RestoreVolume(vol Volume, snapshotName 
string, op *operations.Ope
        defer d.rbdUnmapVolume(snapVol, true)
 
        // Re-generate the UUID.
-       err = d.generateUUID(d.getRBDFilesystem(snapVol), RBDDevPath)
+       err = d.generateUUID(snapVol.ConfigBlockFilesystem(), RBDDevPath)
        if err != nil {
                return err
        }

From 38cb6ae9232f749373884e2be10e70587975e13a Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 5 Jun 2020 09:50:27 +0100
Subject: [PATCH 3/6] lxd/storage/drivers/volume: Adds ConfigBlockMountOptions
 function

Removes the need for driver specific logic in LVM and Ceph.

And defines defaultFilesystemMountOptions constant as "discard".

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/storage/drivers/volume.go | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/lxd/storage/drivers/volume.go b/lxd/storage/drivers/volume.go
index 60de988d7d..f343581549 100644
--- a/lxd/storage/drivers/volume.go
+++ b/lxd/storage/drivers/volume.go
@@ -25,6 +25,9 @@ const vmBlockFilesystemSize = "50MB"
 // DefaultFilesystem filesytem to use for block devices by default.
 const DefaultFilesystem = "ext4"
 
+// defaultFilesystemMountOpts mount options to use for filesystem block 
devices by default.
+const defaultFilesystemMountOptions = "discard"
+
 // volIDQuotaSkip is used to indicate to drivers that quotas should not be 
setup, used during backup import.
 const volIDQuotaSkip = int64(-1)
 
@@ -349,6 +352,17 @@ func (v Volume) ConfigBlockFilesystem() string {
        return DefaultFilesystem
 }
 
+// ConfigBlockMountOptions returns the filesystem mount options to use for 
block volumes. Returns config value
+// "block.mount_options" if defined in volume or pool's volume config, 
otherwise defaultFilesystemMountOptions.
+func (v Volume) ConfigBlockMountOptions() string {
+       fs := v.ExpandedConfig("block.mount_options")
+       if fs != "" {
+               return fs
+       }
+
+       return defaultFilesystemMountOptions
+}
+
 // ConfigSize returns the size to use when creating new a volume. Returns 
config value "size" if defined in volume
 // or pool's volume config, otherwise for block volumes and block-backed 
volumes the defaultBlockSize. For other
 // volumes an empty string is returned if no size is defined.

From 67869d0cdb2e557af70783cf1e78ca2a4e4d5f05 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 5 Jun 2020 09:51:16 +0100
Subject: [PATCH 4/6] lxd/storage/drivers/driver/ceph/utils: Removes
 getRBDMountOptions in place of vol.ConfigBlockMountOptions()

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/storage/drivers/driver_ceph_utils.go | 20 --------------------
 1 file changed, 20 deletions(-)

diff --git a/lxd/storage/drivers/driver_ceph_utils.go 
b/lxd/storage/drivers/driver_ceph_utils.go
index 7273a3db18..6c399b48a2 100644
--- a/lxd/storage/drivers/driver_ceph_utils.go
+++ b/lxd/storage/drivers/driver_ceph_utils.go
@@ -524,26 +524,6 @@ func (d *ceph) rbdListVolumeSnapshots(vol Volume) 
([]string, error) {
        return snapshots, nil
 }
 
-// getRBDMountOptions returns the mount options the storage volume is supposed 
to be mounted with
-// the option string that is returned needs to be passed to the approriate
-// helper (currently named "LXDResolveMountoptions") which will take on the job
-// of splitting it into appropriate flags and string options.
-func (d *ceph) getRBDMountOptions(vol Volume) string {
-       if vol.config["block.mount_options"] != "" {
-               return vol.config["block.mount_options"]
-       }
-
-       if vol.poolConfig["volume.block.mount_options"] != "" {
-               return vol.poolConfig["volume.block.mount_options"]
-       }
-
-       if vol.ConfigBlockFilesystem() == "btrfs" {
-               return "user_subvol_rm_allowed,discard"
-       }
-
-       return "discard"
-}
-
 // copyWithSnapshots creates a non-sparse copy of a container including its 
snapshots.
 // This does not introduce a dependency relation between the source RBD storage
 // volume and the target RBD storage volume.

From 9799d829be0165dd3b877fb039aabdd9bb032541 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 5 Jun 2020 09:52:01 +0100
Subject: [PATCH 5/6] lxd/storage/drivers/driver/lvm/utils: Removes
 volumeMountOptions in place of vol.ConfigBlockMountOptions()

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/storage/drivers/driver_lvm_utils.go | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/lxd/storage/drivers/driver_lvm_utils.go 
b/lxd/storage/drivers/driver_lvm_utils.go
index cabd70a97f..4db8cb5b6f 100644
--- a/lxd/storage/drivers/driver_lvm_utils.go
+++ b/lxd/storage/drivers/driver_lvm_utils.go
@@ -49,20 +49,6 @@ func (d *lvm) thinpoolName() string {
        return "LXDThinPool"
 }
 
-// mountOptions returns the mount options for volumes.
-func (d *lvm) volumeMountOptions(vol Volume) string {
-       if d.config["block.mount_options"] != "" {
-               return d.config["block.mount_options"]
-       }
-
-       // Use some special options if the filesystem for the volume is BTRFS.
-       if vol.ConfigBlockFilesystem() == "btrfs" {
-               return "user_subvol_rm_allowed,discard"
-       }
-
-       return "discard"
-}
-
 // openLoopFile opens a loopback file and disable auto detach.
 func (d *lvm) openLoopFile(source string) (*os.File, error) {
        if source == "" {

From 8a9d03a6d2899f05465520e832ca33c7be22fd24 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@canonical.com>
Date: Fri, 5 Jun 2020 09:52:40 +0100
Subject: [PATCH 6/6] lxd/storage/drivers: Replaces driver specific mount
 options resolution with vol.ConfigBlockMountOptions()

Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com>
---
 lxd/storage/drivers/driver_ceph_volumes.go | 4 ++--
 lxd/storage/drivers/driver_lvm_volumes.go  | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/lxd/storage/drivers/driver_ceph_volumes.go 
b/lxd/storage/drivers/driver_ceph_volumes.go
index 15a347fae2..b5e2af4b3f 100644
--- a/lxd/storage/drivers/driver_ceph_volumes.go
+++ b/lxd/storage/drivers/driver_ceph_volumes.go
@@ -929,7 +929,7 @@ func (d *ceph) MountVolume(vol Volume, op 
*operations.Operation) (bool, error) {
                }
 
                RBDFilesystem := vol.ConfigBlockFilesystem()
-               mountFlags, mountOptions := 
resolveMountOptions(d.getRBDMountOptions(vol))
+               mountFlags, mountOptions := 
resolveMountOptions(vol.ConfigBlockMountOptions())
                err = TryMount(RBDDevPath, mountPath, RBDFilesystem, 
mountFlags, mountOptions)
                if err != nil {
                        return false, err
@@ -1312,7 +1312,7 @@ func (d *ceph) MountVolumeSnapshot(snapVol Volume, op 
*operations.Operation) (bo
                }
 
                RBDFilesystem := snapVol.ConfigBlockFilesystem()
-               mountFlags, mountOptions := 
resolveMountOptions(d.getRBDMountOptions(snapVol))
+               mountFlags, mountOptions := 
resolveMountOptions(snapVol.ConfigBlockMountOptions())
 
                if renegerateFilesystemUUIDNeeded(RBDFilesystem) {
                        if RBDFilesystem == "xfs" {
diff --git a/lxd/storage/drivers/driver_lvm_volumes.go 
b/lxd/storage/drivers/driver_lvm_volumes.go
index 9fab452bb3..7b27aaf798 100644
--- a/lxd/storage/drivers/driver_lvm_volumes.go
+++ b/lxd/storage/drivers/driver_lvm_volumes.go
@@ -454,7 +454,7 @@ func (d *lvm) MountVolume(vol Volume, op 
*operations.Operation) (bool, error) {
                        return false, err
                }
 
-               mountFlags, mountOptions := 
resolveMountOptions(d.volumeMountOptions(vol))
+               mountFlags, mountOptions := 
resolveMountOptions(vol.ConfigBlockMountOptions())
                err = TryMount(volDevPath, mountPath, 
vol.ConfigBlockFilesystem(), mountFlags, mountOptions)
                if err != nil {
                        return false, errors.Wrapf(err, "Failed to mount LVM 
logical volume")
@@ -722,7 +722,7 @@ func (d *lvm) MountVolumeSnapshot(snapVol Volume, op 
*operations.Operation) (boo
                // Default to mounting the original snapshot directly. This may 
be changed below if a temporary
                // snapshot needs to be taken.
                mountVol := snapVol
-               mountFlags, mountOptions := 
resolveMountOptions(d.volumeMountOptions(mountVol))
+               mountFlags, mountOptions := 
resolveMountOptions(mountVol.ConfigBlockMountOptions())
 
                // Regenerate filesystem UUID if needed. This is because some 
filesystems do not allow mounting
                // multiple volumes that share the same UUID. As snapshotting a 
volume will copy its UUID we need
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to