diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index b20c439de..4f9d535ac 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -222,11 +222,21 @@ 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.isCompatibleThickProvision(rbdVol) + 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 { return status.Errorf(codes.InvalidArgument, "cannot clone from volume %s: %s", parentVol, err.Error()) } + + err = parentVol.isCompatibleThickProvision(rbdVol) + if err != nil { + return status.Errorf(codes.InvalidArgument, "cannot clone from volume %s: %s", parentVol, err.Error()) + } } return nil } diff --git a/internal/rbd/rbd_util.go b/internal/rbd/rbd_util.go index 2276862b7..ae6c769bc 100644 --- a/internal/rbd/rbd_util.go +++ b/internal/rbd/rbd_util.go @@ -1613,3 +1613,19 @@ func (ri *rbdImage) isCompatibleEncryption(dst *rbdImage) error { return nil } + +func (ri *rbdImage) isCompatibleThickProvision(dst *rbdVolume) error { + thick, err := ri.isThickProvisioned() + if err != nil { + return err + } + switch { + case thick && !dst.ThickProvision: + return fmt.Errorf("cannot create thin volume from thick volume %q", ri) + + case !thick && dst.ThickProvision: + return fmt.Errorf("cannot create thick volume from thin volume %q", ri) + } + + return nil +}