code: func (m *sioMgr) DetachVolume(volName string) error {
  	client, err := m.getClient()
  	if err != nil {
  		return err
  	}
  	iid, err := client.IID()
  	if err != nil {
  		klog.Error(log("failed to get instanceID: %v", err))
  		return err
  	}
  
  	vol, err := client.FindVolume(volName)
  	if err != nil {
  		return err
  	}
  	if !m.isSdcMappedToVol(iid, vol) {
  		klog.Warning(log(
  			"skipping detached, vol %s not attached to instance %s",
  			volName, iid,
  		))
  		return nil
  	}
  
  	if err := client.DetachVolume(sioVolumeID(vol.ID)); err != nil {
  		klog.Error(log("failed to detach vol %s: %v", volName, err))
  		return err
  	}
  
  	klog.V(4).Info(log("volume %s detached successfully", volName))
  
  	return nil
  }
docs: // DetachVolume detaches the name ScaleIO volume from an instance