The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/3812
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) === Closes #3801
From 437416cf38745633a36e2d257a07ff9f444b1f60 Mon Sep 17 00:00:00 2001 From: Alberto Donato <[email protected]> Date: Mon, 18 Sep 2017 12:33:34 +0200 Subject: [PATCH 1/3] storage: extend makeFSType, remove duplicated mkfs.* code Signed-off-by: Alberto Donato <[email protected]> --- lxd/storage_btrfs.go | 8 ++------ lxd/storage_ceph.go | 6 +++--- lxd/storage_lvm_utils.go | 12 +----------- lxd/storage_utils.go | 30 +++++++++++++++++++++--------- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index 0b58dd135..b78b415ad 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -133,9 +133,7 @@ func (s *storageBtrfs) StoragePoolCreate() error { return fmt.Errorf("Failed to create sparse file %s: %s", source, err) } - output, err := shared.RunCommand( - "mkfs.btrfs", - "-L", s.pool.Name, source) + output, err := makeFSType(source, "btrfs", &mkfsOptions{label: s.pool.Name}) if err != nil { return fmt.Errorf("Failed to create the BTRFS pool: %s", output) } @@ -146,9 +144,7 @@ func (s *storageBtrfs) StoragePoolCreate() error { if filepath.IsAbs(source) { isBlockDev = shared.IsBlockdevPath(source) if isBlockDev { - output, err := shared.RunCommand( - "mkfs.btrfs", - "-L", s.pool.Name, source) + output, err := makeFSType(source, "btrfs", &mkfsOptions{label: s.pool.Name}) if err != nil { return fmt.Errorf("Failed to create the BTRFS pool: %s", output) } diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go index d665527c4..c73a4b4d8 100644 --- a/lxd/storage_ceph.go +++ b/lxd/storage_ceph.go @@ -417,7 +417,7 @@ func (s *storageCeph) StoragePoolVolumeCreate() error { `"%s" on storage pool "%s"`, RBDFilesystem, s.volume.Name, s.pool.Name) - msg, err := makeFSType(RBDDevPath, RBDFilesystem) + msg, err := 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 `+ @@ -794,7 +794,7 @@ func (s *storageCeph) ContainerCreate(container container) error { `for container "%s" on storage pool "%s"`, RBDFilesystem, containerName, s.pool.Name) - msg, err := makeFSType(RBDDevPath, RBDFilesystem) + msg, err := makeFSType(RBDDevPath, RBDFilesystem, nil) if err != nil { logger.Errorf(`Failed to create filesystem type "%s" on `+ `device path "%s" for RBD storage volume for `+ @@ -2220,7 +2220,7 @@ func (s *storageCeph) ImageCreate(fingerprint string) error { // get filesystem RBDFilesystem := s.getRBDFilesystem() - msg, err := makeFSType(RBDDevPath, RBDFilesystem) + msg, err := makeFSType(RBDDevPath, RBDFilesystem, nil) if err != nil { logger.Errorf(`Failed to create filesystem "%s" for RBD `+ `storage volume for image "%s" on storage `+ diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go index 6deacaad1..1383e0c6e 100644 --- a/lxd/storage_lvm_utils.go +++ b/lxd/storage_lvm_utils.go @@ -826,17 +826,7 @@ func lvmCreateLv(vgName string, thinPoolName string, lvName string, lvFsType str fsPath := getLvmDevPath(vgName, volumeType, lvName) - switch lvFsType { - case "xfs": - output, err = shared.TryRunCommand("mkfs.xfs", fsPath) - default: - // default = ext4 - output, err = shared.TryRunCommand( - "mkfs.ext4", - "-E", "nodiscard,lazy_itable_init=0,lazy_journal_init=0", - fsPath) - } - + output, err = makeFSType(fsPath, lvFsType, nil) if err != nil { logger.Errorf("Filesystem creation failed: %s.", output) return fmt.Errorf("Error making filesystem on image LV: %v", err) diff --git a/lxd/storage_utils.go b/lxd/storage_utils.go index 6e5588b47..8d26f9a1f 100644 --- a/lxd/storage_utils.go +++ b/lxd/storage_utils.go @@ -2,6 +2,7 @@ package main import ( "database/sql" + "fmt" "os" "strings" "syscall" @@ -11,6 +12,11 @@ import ( "github.com/lxc/lxd/shared" ) +// 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 { @@ -181,19 +187,25 @@ func lxdUsesPool(dbObj *sql.DB, onDiskPoolName string, driver string, onDiskProp return false, "", nil } -func makeFSType(path string, fsType string) (string, error) { +func makeFSType(path string, fsType string, options *mkfsOptions) (string, error) { var err error var msg string - switch fsType { - case "xfs": - msg, err = shared.TryRunCommand("mkfs.xfs", path) - default: - msg, err = shared.TryRunCommand( - "mkfs.ext4", - "-E", "nodiscard,lazy_itable_init=0,lazy_journal_init=0", - path) + 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 } From 2ba5bd1f08147fb8da40b69afeaf4c6ea5878f61 Mon Sep 17 00:00:00 2001 From: Alberto Donato <[email protected]> Date: Mon, 18 Sep 2017 15:01:47 +0200 Subject: [PATCH 2/3] storage: support volume.block.filesystem=btrfs Signed-off-by: Alberto Donato <[email protected]> --- lxd/daemon_config.go | 2 +- lxd/storage_pools_config.go | 2 +- lxd/storage_volumes_config.go | 2 +- test/suites/storage.sh | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lxd/daemon_config.go b/lxd/daemon_config.go index c74214e50..35b63220f 100644 --- a/lxd/daemon_config.go +++ b/lxd/daemon_config.go @@ -191,7 +191,7 @@ func daemonConfigInit(db *sql.DB) error { "images.remote_cache_expiry": {valueType: "int", defaultValue: "10", trigger: daemonConfigTriggerExpiry}, // Keys deprecated since the implementation of the storage api. - "storage.lvm_fstype": {valueType: "string", defaultValue: "ext4", validValues: []string{"ext4", "xfs"}, validator: storageDeprecatedKeys}, + "storage.lvm_fstype": {valueType: "string", defaultValue: "ext4", validValues: []string{"btrfs", "ext4", "xfs"}, validator: storageDeprecatedKeys}, "storage.lvm_mount_options": {valueType: "string", defaultValue: "discard", validator: storageDeprecatedKeys}, "storage.lvm_thinpool_name": {valueType: "string", defaultValue: "LXDPool", validator: storageDeprecatedKeys}, "storage.lvm_vg_name": {valueType: "string", validator: storageDeprecatedKeys}, diff --git a/lxd/storage_pools_config.go b/lxd/storage_pools_config.go index 0782052f9..293b2062a 100644 --- a/lxd/storage_pools_config.go +++ b/lxd/storage_pools_config.go @@ -60,7 +60,7 @@ var storagePoolConfigKeys = map[string]func(value string) error{ // valid drivers: ceph, lvm "volume.block.filesystem": func(value string) error { - return shared.IsOneOf(value, []string{"ext4", "xfs"}) + return shared.IsOneOf(value, []string{"btrfs", "ext4", "xfs"}) }, "volume.block.mount_options": shared.IsAny, diff --git a/lxd/storage_volumes_config.go b/lxd/storage_volumes_config.go index 37ac53877..e1d0ee64c 100644 --- a/lxd/storage_volumes_config.go +++ b/lxd/storage_volumes_config.go @@ -11,7 +11,7 @@ import ( var storageVolumeConfigKeys = map[string]func(value string) error{ "block.mount_options": shared.IsAny, "block.filesystem": func(value string) error { - return shared.IsOneOf(value, []string{"ext4", "xfs"}) + return shared.IsOneOf(value, []string{"btrfs", "ext4", "xfs"}) }, "size": func(value string) error { if value == "" { diff --git a/test/suites/storage.sh b/test/suites/storage.sh index 6eadf4307..4342d83b0 100644 --- a/test/suites/storage.sh +++ b/test/suites/storage.sh @@ -202,6 +202,7 @@ test_storage() { 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" + lxc storage create "lxdtest-$(basename "${LXD_DIR}")-valid-lvm-pool-config-pool26" lvm volume.block.filesystem=btrfs fi # Set default storage pool for image import. From 8b942c27ff9a203e335ee7950d2e7b3ac27c5c4a Mon Sep 17 00:00:00 2001 From: Alberto Donato <[email protected]> Date: Mon, 18 Sep 2017 15:29:51 +0200 Subject: [PATCH 3/3] storage: add storage_block_filesystem_btrfs API extension Signed-off-by: Alberto Donato <[email protected]> --- doc/api-extensions.md | 4 ++++ lxd/api_1.0.go | 1 + 2 files changed, 5 insertions(+) diff --git a/doc/api-extensions.md b/doc/api-extensions.md index 35666d77b..404856f80 100644 --- a/doc/api-extensions.md +++ b/doc/api-extensions.md @@ -330,3 +330,7 @@ This records the actual source passed to LXD during storage pool creation. This introduces the "ceph.osd.force_reuse" property for the ceph storage driver. When set to "true" LXD will reuse a osd storage pool that is already in use by another LXD instance. + +## storage\_block\_filesystem\_btrfs +This adds support for btrfs as a storage volume filesystem, in addition to ext4 +and xfs. diff --git a/lxd/api_1.0.go b/lxd/api_1.0.go index 9f81cc463..7b68acdb3 100644 --- a/lxd/api_1.0.go +++ b/lxd/api_1.0.go @@ -125,6 +125,7 @@ func api10Get(d *Daemon, r *http.Request) Response { "resource_limits", "storage_volatile_initial_source", "storage_ceph_force_osd_reuse", + "storage_block_filesystem_btrfs", }, APIStatus: "stable", APIVersion: version.APIVersion,
_______________________________________________ lxc-devel mailing list [email protected] http://lists.linuxcontainers.org/listinfo/lxc-devel
