code: func (c *Cloud) endAttaching(i *awsInstance, volumeID awsVolumeID, mountDevice mountDevice) bool {
  	c.attachingMutex.Lock()
  	defer c.attachingMutex.Unlock()
  
  	existingVolumeID, found := c.attaching[i.nodeName][mountDevice]
  	if !found {
  		return false
  	}
  	if volumeID != existingVolumeID {
  		// This actually can happen, because getMountDevice combines the attaching map with the volumes
  		// attached to the instance (as reported by the EC2 API).  So if endAttaching comes after
  		// a 10 second poll delay, we might well have had a concurrent request to allocate a mountpoint,
  		// which because we allocate sequentially is _very_ likely to get the immediately freed volume
  		glog.Infof("endAttaching on device %q assigned to different volume: %q vs %q", mountDevice, volumeID, existingVolumeID)
  		return false
  	}
  	glog.V(2).Infof("Releasing in-process attachment entry: %s -> volume %s", mountDevice, volumeID)
  	delete(c.attaching[i.nodeName], mountDevice)
  	return true
  }
docs: // endAttaching removes the entry from the "attachments in progress" map
  // It returns true if it was found (and removed), false otherwise