diff --git a/internal/rbd/controllerserver.go b/internal/rbd/controllerserver.go index 7457befc8..ec230ec66 100644 --- a/internal/rbd/controllerserver.go +++ b/internal/rbd/controllerserver.go @@ -629,8 +629,10 @@ func flattenTemporaryClonedImages(ctx context.Context, rbdVol *rbdVolume, cr *ut } // If we start flattening all the snapshots at one shot the volume // creation time will be affected,so we will flatten only the extra - // snapshots. - extraSnapshots := min(len(snaps)-int(minSnapshotsOnImageToStartFlatten), len(children)) + // snapshots. Use the min of the extra snapshots and the number of children + // to avoid scenario where number of children are less than the extra snapshots. + // This occurs when the child images are in trash and not yet deleted. + extraSnapshots := min((len(snaps) - int(minSnapshotsOnImageToStartFlatten)), len(children)) children = children[:extraSnapshots] err = flattenClonedRbdImages( ctx, diff --git a/internal/rbd/snapshot.go b/internal/rbd/snapshot.go index ba6f640ab..8fd0bfa12 100644 --- a/internal/rbd/snapshot.go +++ b/internal/rbd/snapshot.go @@ -276,6 +276,10 @@ func (rv *rbdVolume) NewSnapshotByID( return nil, err } + // set the features for the clone image. + f := []string{librbd.FeatureNameLayering, librbd.FeatureNameDeepFlatten} + rv.ImageFeatureSet = librbd.FeatureSetFromNames(f) + options, err := rv.constructImageOptions(ctx) if err != nil { return nil, err