code: func (d *flexVolumeDetacher) UnmountDevice(deviceMountPath string) error {
  
  	pathExists, pathErr := mount.PathExists(deviceMountPath)
  	if !pathExists {
  		klog.Warningf("Warning: Unmount skipped because path does not exist: %v", deviceMountPath)
  		return nil
  	}
  	if pathErr != nil && !mount.IsCorruptedMnt(pathErr) {
  		return fmt.Errorf("Error checking path: %v", pathErr)
  	}
  
  	notmnt, err := isNotMounted(d.plugin.host.GetMounter(d.plugin.GetPluginName()), deviceMountPath)
  	if err != nil {
  		if mount.IsCorruptedMnt(err) {
  			notmnt = false // Corrupted error is assumed to be mounted.
  		} else {
  			return err
  		}
  	}
  
  	if notmnt {
  		klog.Warningf("Warning: Path: %v already unmounted", deviceMountPath)
  	} else {
  		call := d.plugin.NewDriverCall(unmountDeviceCmd)
  		call.Append(deviceMountPath)
  
  		_, err := call.Run()
  		if isCmdNotSupportedErr(err) {
  			err = (*detacherDefaults)(d).UnmountDevice(deviceMountPath)
  		}
  		if err != nil {
  			return err
  		}
  	}
  
  	// Flexvolume driver may remove the directory. Ignore if it does.
  	if pathExists, pathErr := mount.PathExists(deviceMountPath); pathErr != nil {
  		return fmt.Errorf("Error checking if path exists: %v", pathErr)
  	} else if !pathExists {
  		return nil
  	}
  	return os.Remove(deviceMountPath)
  }
docs: // UnmountDevice is part of the volume.Detacher interface.