[lxc-devel] [lxd/master] lxd/storage: Fix bad UsedBy check
stgraber on Github
lxc-bot at linuxcontainers.org
Wed Aug 14 02:51:57 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 354 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190813/d76232f3/attachment.bin>
-------------- next part --------------
From 436b6219af6a785d6891b4c0ef10467f5d9070fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 13 Aug 2019 22:45:35 -0400
Subject: [PATCH] lxd/storage: Fix bad UsedBy check
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/storage.go | 9 +--------
lxd/storage_btrfs.go | 2 +-
lxd/storage_ceph.go | 2 +-
lxd/storage_cephfs.go | 2 +-
lxd/storage_dir.go | 2 +-
lxd/storage_lvm.go | 2 +-
lxd/storage_volumes.go | 8 ++++----
lxd/storage_volumes_snapshot.go | 2 +-
lxd/storage_volumes_utils.go | 17 ++++++-----------
lxd/storage_zfs.go | 2 +-
10 files changed, 18 insertions(+), 30 deletions(-)
diff --git a/lxd/storage.go b/lxd/storage.go
index a880b1aae4..56ef5c11ea 100644
--- a/lxd/storage.go
+++ b/lxd/storage.go
@@ -469,18 +469,11 @@ func storagePoolVolumeAttachInit(s *state.State, poolName string, volumeName str
// get mountpoint of storage volume
remapPath := getStoragePoolVolumeMountPoint(poolName, volumeName)
- // Convert the volume type name to our internal integer representation.
- volumeTypeName, err := storagePoolVolumeTypeToName(volumeType)
- if err != nil {
- return nil, err
- }
-
if !nextIdmap.Equals(lastIdmap) {
logger.Debugf("Shifting storage volume")
if !shared.IsTrue(poolVolumePut.Config["security.shifted"]) {
- volumeUsedBy, err := storagePoolVolumeUsedByContainersGet(s,
- "default", volumeName, volumeTypeName)
+ volumeUsedBy, err := storagePoolVolumeUsedByContainersGet(s, "default", poolName, volumeName)
if err != nil {
return nil, err
}
diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index e4b0328ed5..043b2f7aad 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -743,7 +743,7 @@ func (s *storageBtrfs) StoragePoolVolumeRename(newName string) error {
return err
}
- usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.volume.Name, storagePoolVolumeTypeNameCustom)
+ usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.pool.Name, s.volume.Name)
if err != nil {
return err
}
diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index ec4bd72736..e603190047 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -663,7 +663,7 @@ func (s *storageCeph) StoragePoolVolumeRename(newName string) error {
return err
}
- usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.volume.Name, storagePoolVolumeTypeNameCustom)
+ usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.pool.Name, s.volume.Name)
if err != nil {
return err
}
diff --git a/lxd/storage_cephfs.go b/lxd/storage_cephfs.go
index f95933c3f1..7f4d5f86ec 100644
--- a/lxd/storage_cephfs.go
+++ b/lxd/storage_cephfs.go
@@ -584,7 +584,7 @@ func (s *storageCephFs) StoragePoolVolumeRename(newName string) error {
logger.Infof(`Renaming CEPHFS storage volume on storage pool "%s" from "%s" to "%s`, s.pool.Name, s.volume.Name, newName)
// Sanity check
- usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.volume.Name, storagePoolVolumeTypeNameCustom)
+ usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.pool.Name, s.volume.Name)
if err != nil {
return err
}
diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go
index 87e5261ee4..967a4656f1 100644
--- a/lxd/storage_dir.go
+++ b/lxd/storage_dir.go
@@ -464,7 +464,7 @@ func (s *storageDir) StoragePoolVolumeRename(newName string) error {
return err
}
- usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.volume.Name, storagePoolVolumeTypeNameCustom)
+ usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.pool.Name, s.volume.Name)
if err != nil {
return err
}
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index eac2d7780c..d805035435 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -877,7 +877,7 @@ func (s *storageLvm) StoragePoolVolumeRename(newName string) error {
return err
}
- usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.volume.Name, storagePoolVolumeTypeNameCustom)
+ usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.pool.Name, s.volume.Name)
if err != nil {
return err
}
diff --git a/lxd/storage_volumes.go b/lxd/storage_volumes.go
index 771b8ac670..38250235d0 100644
--- a/lxd/storage_volumes.go
+++ b/lxd/storage_volumes.go
@@ -134,7 +134,7 @@ func storagePoolVolumesGet(d *Daemon, r *http.Request) Response {
version.APIVersion, poolName, apiEndpoint, volume.Name))
}
} else {
- volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), project, volume.Name, volume.Type)
+ volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), project, poolName, volume.Name, volume.Type)
if err != nil {
return InternalError(err)
}
@@ -209,7 +209,7 @@ func storagePoolVolumesTypeGet(d *Daemon, r *http.Request) Response {
continue
}
- volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), project, vol.Name, vol.Type)
+ volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), project, poolName, vol.Name, vol.Type)
if err != nil {
return SmartError(err)
}
@@ -703,7 +703,7 @@ func storagePoolVolumeTypeGet(d *Daemon, r *http.Request, volumeTypeName string)
return SmartError(err)
}
- volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), project, volume.Name, volume.Type)
+ volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), project, poolName, volume.Name, volume.Type)
if err != nil {
return SmartError(err)
}
@@ -995,7 +995,7 @@ func storagePoolVolumeTypeDelete(d *Daemon, r *http.Request, volumeTypeName stri
return BadRequest(fmt.Errorf("storage volumes of type \"%s\" cannot be deleted with the storage api", volumeTypeName))
}
- volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), project, volumeName, volumeTypeName)
+ volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), project, poolName, volumeName, volumeTypeName)
if err != nil {
return SmartError(err)
}
diff --git a/lxd/storage_volumes_snapshot.go b/lxd/storage_volumes_snapshot.go
index 17acfc403d..3b2b2cfa10 100644
--- a/lxd/storage_volumes_snapshot.go
+++ b/lxd/storage_volumes_snapshot.go
@@ -202,7 +202,7 @@ func storagePoolVolumeSnapshotsTypeGet(d *Daemon, r *http.Request) Response {
continue
}
- volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), "default", vol.Name, vol.Type)
+ volumeUsedBy, err := storagePoolVolumeUsedByGet(d.State(), "default", poolName, vol.Name, vol.Type)
if err != nil {
return SmartError(err)
}
diff --git a/lxd/storage_volumes_utils.go b/lxd/storage_volumes_utils.go
index ca695152c7..db0bb12221 100644
--- a/lxd/storage_volumes_utils.go
+++ b/lxd/storage_volumes_utils.go
@@ -241,26 +241,22 @@ func storagePoolVolumeSnapshotUpdate(state *state.State, poolName string, volume
return nil
}
-func storagePoolVolumeUsedByContainersGet(s *state.State, project, volumeName string,
- volumeTypeName string) ([]string, error) {
+func storagePoolVolumeUsedByContainersGet(s *state.State, project, poolName string, volumeName string) ([]string, error) {
cts, err := containerLoadByProject(s, project)
if err != nil {
return []string{}, err
}
ctsUsingVolume := []string{}
- volumeNameWithType := fmt.Sprintf("%s/%s", volumeTypeName, volumeName)
for _, c := range cts {
- for _, dev := range c.LocalDevices() {
+ for _, dev := range c.ExpandedDevices() {
if dev["type"] != "disk" {
continue
}
- // Make sure that we don't compare against stuff like
- // "container////bla" but only against "container/bla".
- cleanSource := filepath.Clean(dev["source"])
- if cleanSource == volumeName || cleanSource == volumeNameWithType {
+ if dev["pool"] == poolName && dev["source"] == volumeName {
ctsUsingVolume = append(ctsUsingVolume, c.Name())
+ break
}
}
}
@@ -438,7 +434,7 @@ func storagePoolVolumeUsedByRunningContainersWithProfilesGet(s *state.State,
}
// volumeUsedBy = append(volumeUsedBy, fmt.Sprintf("/%s/containers/%s", version.APIVersion, ct))
-func storagePoolVolumeUsedByGet(s *state.State, project, volumeName string, volumeTypeName string) ([]string, error) {
+func storagePoolVolumeUsedByGet(s *state.State, project, poolName string, volumeName string, volumeTypeName string) ([]string, error) {
// Handle container volumes
if volumeTypeName == "container" {
cName, sName, snap := containerGetParentAndSnapshotName(volumeName)
@@ -456,8 +452,7 @@ func storagePoolVolumeUsedByGet(s *state.State, project, volumeName string, volu
}
// Look for containers using this volume
- ctsUsingVolume, err := storagePoolVolumeUsedByContainersGet(s,
- project, volumeName, volumeTypeName)
+ ctsUsingVolume, err := storagePoolVolumeUsedByContainersGet(s, project, poolName, volumeName)
if err != nil {
return []string{}, err
}
diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index 1d1a892b91..5d9500b9b8 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -724,7 +724,7 @@ func (s *storageZfs) StoragePoolVolumeRename(newName string) error {
logger.Infof(`Renaming ZFS storage volume on storage pool "%s" from "%s" to "%s`,
s.pool.Name, s.volume.Name, newName)
- usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.volume.Name, storagePoolVolumeTypeNameCustom)
+ usedBy, err := storagePoolVolumeUsedByContainersGet(s.s, "default", s.pool.Name, s.volume.Name)
if err != nil {
return err
}
More information about the lxc-devel
mailing list