[lxc-devel] [lxd/master] lxd/patches: Reset ZFS mountpoint/canmount

stgraber on Github lxc-bot at linuxcontainers.org
Fri Jan 24 10:03:51 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 370 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200124/175ab4bd/attachment.bin>
-------------- next part --------------
From 7b0b77b217e5315f3f4d48b7f88af199e0ef3347 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 24 Jan 2020 12:02:35 +0200
Subject: [PATCH] lxd/patches: Reset ZFS mountpoint/canmount
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #6765

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/patches.go                            |  7 +--
 lxd/storage/drivers/driver_btrfs.go       |  1 +
 lxd/storage/drivers/driver_cephfs.go      |  1 +
 lxd/storage/drivers/driver_dir.go         |  1 +
 lxd/storage/drivers/driver_lvm.go         |  1 +
 lxd/storage/drivers/driver_zfs.go         |  1 +
 lxd/storage/drivers/driver_zfs_patches.go | 62 +++++++++++++++++++++++
 7 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/lxd/patches.go b/lxd/patches.go
index 5be31ce745..046310a72a 100644
--- a/lxd/patches.go
+++ b/lxd/patches.go
@@ -78,7 +78,8 @@ var patches = []patch{
 	{name: "storage_api_rename_container_snapshots_dir_again_again", run: patchStorageApiRenameContainerSnapshotsDir},
 	{name: "clustering_add_roles", run: patchClusteringAddRoles},
 	{name: "clustering_add_roles_again", run: patchClusteringAddRoles},
-	{name: "storage_create_vm", run: patchStorageCreateVM},
+	{name: "storage_create_vm", run: patchGenericStorage},
+	{name: "storage_zfs_mount", run: patchGenericStorage},
 }
 
 type patch struct {
@@ -132,7 +133,7 @@ func patchesApplyAll(d *Daemon) error {
 }
 
 // Patches begin here
-func patchStorageCreateVM(name string, d *Daemon) error {
+func patchGenericStorage(name string, d *Daemon) error {
 	// Load all the pools.
 	pools, _ := d.cluster.StoragePools()
 
@@ -143,7 +144,7 @@ func patchStorageCreateVM(name string, d *Daemon) error {
 				return err
 			}
 
-			err = pool.ApplyPatch("storage_create_vm")
+			err = pool.ApplyPatch(name)
 			if err != nil {
 				return err
 			}
diff --git a/lxd/storage/drivers/driver_btrfs.go b/lxd/storage/drivers/driver_btrfs.go
index 999145eee2..93423a7dbd 100644
--- a/lxd/storage/drivers/driver_btrfs.go
+++ b/lxd/storage/drivers/driver_btrfs.go
@@ -30,6 +30,7 @@ func (d *btrfs) load() error {
 	// Register the patches.
 	d.patches = map[string]func() error{
 		"storage_create_vm": nil,
+		"storage_zfs_mount": nil,
 	}
 
 	// Done if previously loaded.
diff --git a/lxd/storage/drivers/driver_cephfs.go b/lxd/storage/drivers/driver_cephfs.go
index 37ee7bde83..2ffb1a46c6 100644
--- a/lxd/storage/drivers/driver_cephfs.go
+++ b/lxd/storage/drivers/driver_cephfs.go
@@ -28,6 +28,7 @@ func (d *cephfs) load() error {
 	// Register the patches.
 	d.patches = map[string]func() error{
 		"storage_create_vm": nil,
+		"storage_zfs_mount": nil,
 	}
 
 	// Done if previously loaded.
diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go
index 027cee0b3f..f1e8e89ea5 100644
--- a/lxd/storage/drivers/driver_dir.go
+++ b/lxd/storage/drivers/driver_dir.go
@@ -21,6 +21,7 @@ func (d *dir) load() error {
 	// Register the patches.
 	d.patches = map[string]func() error{
 		"storage_create_vm": nil,
+		"storage_zfs_mount": nil,
 	}
 
 	return nil
diff --git a/lxd/storage/drivers/driver_lvm.go b/lxd/storage/drivers/driver_lvm.go
index 90e984f014..8a614af018 100644
--- a/lxd/storage/drivers/driver_lvm.go
+++ b/lxd/storage/drivers/driver_lvm.go
@@ -33,6 +33,7 @@ func (d *lvm) load() error {
 	// Register the patches.
 	d.patches = map[string]func() error{
 		"storage_create_vm": nil,
+		"storage_zfs_mount": nil,
 	}
 
 	// Done if previously loaded.
diff --git a/lxd/storage/drivers/driver_zfs.go b/lxd/storage/drivers/driver_zfs.go
index 6c07712001..707b6bf25d 100644
--- a/lxd/storage/drivers/driver_zfs.go
+++ b/lxd/storage/drivers/driver_zfs.go
@@ -41,6 +41,7 @@ func (d *zfs) load() error {
 	// Register the patches.
 	d.patches = map[string]func() error{
 		"storage_create_vm": d.patchStorageCreateVM,
+		"storage_zfs_mount": d.patchStorageZFSMount,
 	}
 
 	// Done if previously loaded.
diff --git a/lxd/storage/drivers/driver_zfs_patches.go b/lxd/storage/drivers/driver_zfs_patches.go
index fc6eccd146..5fc1a9803b 100644
--- a/lxd/storage/drivers/driver_zfs_patches.go
+++ b/lxd/storage/drivers/driver_zfs_patches.go
@@ -1,7 +1,11 @@
 package drivers
 
 import (
+	"fmt"
 	"path/filepath"
+	"strings"
+
+	"github.com/lxc/lxd/shared"
 )
 
 func (d *zfs) patchStorageCreateVM() error {
@@ -19,3 +23,61 @@ func (d *zfs) patchStorageCreateVM() error {
 
 	return nil
 }
+
+func (d *zfs) patchStorageZFSMount() error {
+	datasets, err := d.getDatasets(d.config["zfs.pool_name"])
+	if err != nil {
+		return err
+	}
+
+	for _, dataset := range datasets {
+		// Skip snapshots.
+		if strings.Contains(dataset, "@") {
+			continue
+		}
+
+		// Skip block devices.
+		if strings.HasSuffix(dataset, ".block") {
+			continue
+		}
+
+		// Skip top level.
+		if !strings.Contains(dataset, "/") {
+			continue
+		}
+
+		// We only care about containers, images and custom volumes.
+		if !shared.StringInSlice(strings.SplitN(dataset, "/", 2)[0], []string{"containers", "images", "custom"}) {
+			continue
+		}
+
+		// Apply mountpoint changes.
+		oldMountPoint, err := d.getDatasetProperty(filepath.Join(d.config["zfs.pool_name"], dataset), "mountpoint")
+		if err != nil {
+			return err
+		}
+		newMountPoint := filepath.Join(shared.VarPath("storage-pools", d.name, dataset))
+
+		if oldMountPoint != newMountPoint {
+			err := d.setDatasetProperties(filepath.Join(d.config["zfs.pool_name"], dataset), fmt.Sprintf("mountpoint=%s", newMountPoint), "canmount=noauto")
+			if err != nil {
+				return err
+			}
+		}
+
+		// Apply canmount changes.
+		oldCanMount, err := d.getDatasetProperty(filepath.Join(d.config["zfs.pool_name"], dataset), "canmount")
+		if err != nil {
+			return err
+		}
+
+		if oldCanMount != "noauto" {
+			err := d.setDatasetProperties(filepath.Join(d.config["zfs.pool_name"], dataset), "canmount=noauto")
+			if err != nil {
+				return err
+			}
+		}
+	}
+
+	return nil
+}


More information about the lxc-devel mailing list