code: func (attacher *rbdAttacher) MountDevice(spec *volume.Spec, devicePath string, deviceMountPath string) error {
  	klog.V(4).Infof("rbd: mouting device %s to %s", devicePath, deviceMountPath)
  	notMnt, err := attacher.mounter.IsLikelyNotMountPoint(deviceMountPath)
  	if err != nil {
  		if os.IsNotExist(err) {
  			if err := os.MkdirAll(deviceMountPath, 0750); err != nil {
  				return err
  			}
  			notMnt = true
  		} else {
  			return err
  		}
  	}
  	if !notMnt {
  		return nil
  	}
  	fstype, err := getVolumeSourceFSType(spec)
  	if err != nil {
  		return err
  	}
  	ro, err := getVolumeSourceReadOnly(spec)
  	if err != nil {
  		return err
  	}
  	options := []string{}
  	if ro {
  		options = append(options, "ro")
  	}
  	mountOptions := volutil.MountOptionFromSpec(spec, options...)
  	err = attacher.mounter.FormatAndMount(devicePath, deviceMountPath, fstype, mountOptions)
  	if err != nil {
  		os.Remove(deviceMountPath)
  		return fmt.Errorf("rbd: failed to mount device %s at %s (fstype: %s), error %v", devicePath, deviceMountPath, fstype, err)
  	}
  	klog.V(3).Infof("rbd: successfully mount device %s at %s (fstype: %s)", devicePath, deviceMountPath, fstype)
  	return nil
  }
docs: // MountDevice implements Attacher.MountDevice. It is called by the kubelet to
  // mount device at the given mount path.
  // This method is idempotent, callers are responsible for retrying on failure.