From ceafca6ddfec12ab2e4a316a7aeee651c1281914 Mon Sep 17 00:00:00 2001 From: Madhu Rajanna Date: Wed, 12 Jan 2022 14:23:40 +0530 Subject: [PATCH] rbd: disallow creating small size volume from snapshot as per the CSI standard the size is optional parameter, as we are allowing the restore to a bigger size today we need to block the restore to a smaller size as its a have side effects like data corruption. Note:- Even though this check is present in kubernetes sidecar as CSI is CO independent adding the check here. Signed-off-by: Madhu Rajanna --- internal/rbd/controllerserver.go | 6 ++++++ internal/rbd/rbd_util.go | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index bef83e771..d7ad52950 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -215,6 +215,12 @@ func checkValidCreateVolumeRequest(rbdVol, parentVol *rbdVolume, rbdSnap *rbdSna if err != nil { return status.Errorf(codes.InvalidArgument, "cannot restore from snapshot %s: %s", rbdSnap, err.Error()) } + + err = rbdSnap.isCompabitableClone(&rbdVol.rbdImage) + if err != nil { + return status.Errorf(codes.InvalidArgument, "cannot restore from snapshot %s: %s", rbdSnap, err.Error()) + } + case parentVol != nil: err = parentVol.isCompatibleEncryption(&rbdVol.rbdImage) if err != nil { diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index ef2a5ad55..1c1cc7f9a 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -1993,6 +1993,17 @@ func (ri *rbdImage) isCompatibleEncryption(dst *rbdImage) error { return nil } +func (ri *rbdImage) isCompabitableClone(dst *rbdImage) error { + if dst.VolSize < ri.VolSize { + return fmt.Errorf( + "volume size %d is smaller than source volume size %d", + dst.VolSize, + ri.VolSize) + } + + return nil +} + func (ri *rbdImage) isCompatibleThickProvision(dst *rbdVolume) error { thick, err := ri.isThickProvisioned() if err != nil {