code: func (oe *operationExecutor) ReconstructVolumeOperation(
  	volumeMode v1.PersistentVolumeMode,
  	plugin volume.VolumePlugin,
  	mapperPlugin volume.BlockVolumePlugin,
  	uid types.UID,
  	podName volumetypes.UniquePodName,
  	volumeSpecName string,
  	volumePath string,
  	pluginName string) (*volume.Spec, error) {
  
  	// Filesystem Volume case
  	if volumeMode == v1.PersistentVolumeFilesystem {
  		// Create volumeSpec from mount path
  		klog.V(5).Infof("Starting operationExecutor.ReconstructVolumepodName")
  		volumeSpec, err := plugin.ConstructVolumeSpec(volumeSpecName, volumePath)
  		if err != nil {
  			return nil, err
  		}
  		return volumeSpec, nil
  	}
  
  	// Block Volume case
  	// Create volumeSpec from mount path
  	klog.V(5).Infof("Starting operationExecutor.ReconstructVolume")
  	if mapperPlugin == nil {
  		return nil, fmt.Errorf("Could not find block volume plugin %q (spec.Name: %q) pod %q (UID: %q)",
  			pluginName,
  			volumeSpecName,
  			podName,
  			uid)
  	}
  	// volumePath contains volumeName on the path. In the case of block volume, {volumeName} is symbolic link
  	// corresponding to raw block device.
  	// ex. volumePath: pods/{podUid}}/{DefaultKubeletVolumeDevicesDirName}/{escapeQualifiedPluginName}/{volumeName}
  	volumeSpec, err := mapperPlugin.ConstructBlockVolumeSpec(uid, volumeSpecName, volumePath)
  	if err != nil {
  		return nil, err
  	}
  	return volumeSpec, nil
  }
docs: // ReconstructVolumeOperation return a func to create volumeSpec from mount path