code: func (kl *Kubelet) makeBlockVolumes(pod *v1.Pod, container *v1.Container, podVolumes kubecontainer.VolumeMap, blkutil volumepathhandler.BlockVolumePathHandler) ([]kubecontainer.DeviceInfo, error) {
  	var devices []kubecontainer.DeviceInfo
  	for _, device := range container.VolumeDevices {
  		// check path is absolute
  		if !filepath.IsAbs(device.DevicePath) {
  			return nil, fmt.Errorf("error DevicePath `%s` must be an absolute path", device.DevicePath)
  		}
  		vol, ok := podVolumes[device.Name]
  		if !ok || vol.BlockVolumeMapper == nil {
  			klog.Errorf("Block volume cannot be satisfied for container %q, because the volume is missing or the volume mapper is nil: %+v", container.Name, device)
  			return nil, fmt.Errorf("cannot find volume %q to pass into container %q", device.Name, container.Name)
  		}
  		// Get a symbolic link associated to a block device under pod device path
  		dirPath, volName := vol.BlockVolumeMapper.GetPodDeviceMapPath()
  		symlinkPath := path.Join(dirPath, volName)
  		if islinkExist, checkErr := blkutil.IsSymlinkExist(symlinkPath); checkErr != nil {
  			return nil, checkErr
  		} else if islinkExist {
  			// Check readOnly in PVCVolumeSource and set read only permission if it's true.
  			permission := "mrw"
  			if vol.ReadOnly {
  				permission = "r"
  			}
  			klog.V(4).Infof("Device will be attached to container %q. Path on host: %v", container.Name, symlinkPath)
  			devices = append(devices, kubecontainer.DeviceInfo{PathOnHost: symlinkPath, PathInContainer: device.DevicePath, Permissions: permission})
  		}
  	}
  
  	return devices, nil
  }
docs: // makeBlockVolumes maps the raw block devices specified in the path of the container
  // Experimental