diff --git a/internal/rbd/nodeserver.go b/internal/rbd/nodeserver.go index 793fcf62d..9a993f1b9 100644 --- a/internal/rbd/nodeserver.go +++ b/internal/rbd/nodeserver.go @@ -386,8 +386,6 @@ func (ns *NodeServer) stageTransaction( var err error var readOnly bool - var feature bool - var depth uint var cr *util.Credentials cr, err = util.NewUserCredentials(req.GetSecrets()) @@ -403,29 +401,11 @@ func (ns *NodeServer) stageTransaction( volOptions.readOnly = true } - if kernelRelease == "" { - // fetch the current running kernel info - kernelRelease, err = util.GetKernelVersion() - if err != nil { - return transaction, err - } - } - if !util.CheckKernelSupport(kernelRelease, deepFlattenSupport) && !skipForceFlatten { - feature, err = volOptions.checkImageChainHasFeature(ctx, librbd.FeatureDeepFlatten) - if err != nil { - return transaction, err - } - depth, err = volOptions.getCloneDepth(ctx) - if err != nil { - return transaction, err - } - if feature || depth != 0 { - err = volOptions.flattenRbdImage(ctx, cr, true, rbdHardMaxCloneDepth, rbdSoftMaxCloneDepth) - if err != nil { - return transaction, err - } - } + err = flattenImageBeforeMapping(ctx, volOptions, cr) + if err != nil { + return transaction, err } + // Mapping RBD image var devicePath string devicePath, err = attachRBDImage(ctx, volOptions, devicePath, cr) @@ -481,6 +461,41 @@ func (ns *NodeServer) stageTransaction( return transaction, err } +func flattenImageBeforeMapping( + ctx context.Context, + volOptions *rbdVolume, + cr *util.Credentials) error { + var err error + var feature bool + var depth uint + + if kernelRelease == "" { + // fetch the current running kernel info + kernelRelease, err = util.GetKernelVersion() + if err != nil { + return err + } + } + if !util.CheckKernelSupport(kernelRelease, deepFlattenSupport) && !skipForceFlatten { + feature, err = volOptions.checkImageChainHasFeature(ctx, librbd.FeatureDeepFlatten) + if err != nil { + return err + } + depth, err = volOptions.getCloneDepth(ctx) + if err != nil { + return err + } + if feature || depth != 0 { + err = volOptions.flattenRbdImage(ctx, cr, true, rbdHardMaxCloneDepth, rbdSoftMaxCloneDepth) + if err != nil { + return err + } + } + } + + return nil +} + func (ns *NodeServer) undoStagingTransaction( ctx context.Context, req *csi.NodeStageVolumeRequest,