The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6076
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) === Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
From 436b6219af6a785d6891b4c0ef10467f5d9070fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@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 <stgra...@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 }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel