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 {