code: func GetBindVolumeToClaim(volume *v1.PersistentVolume, claim *v1.PersistentVolumeClaim) (*v1.PersistentVolume, bool, error) {
  	dirty := false
  
  	// Check if the volume was already bound (either by user or by controller)
  	shouldSetBoundByController := false
  	if !IsVolumeBoundToClaim(volume, claim) {
  		shouldSetBoundByController = true
  	}
  
  	// The volume from method args can be pointing to watcher cache. We must not
  	// modify these, therefore create a copy.
  	volumeClone := volume.DeepCopy()
  
  	// Bind the volume to the claim if it is not bound yet
  	if volume.Spec.ClaimRef == nil ||
  		volume.Spec.ClaimRef.Name != claim.Name ||
  		volume.Spec.ClaimRef.Namespace != claim.Namespace ||
  		volume.Spec.ClaimRef.UID != claim.UID {
  
  		claimRef, err := reference.GetReference(scheme.Scheme, claim)
  		if err != nil {
  			return nil, false, fmt.Errorf("Unexpected error getting claim reference: %v", err)
  		}
  		volumeClone.Spec.ClaimRef = claimRef
  		dirty = true
  	}
  
  	// Set annBoundByController if it is not set yet
  	if shouldSetBoundByController && !metav1.HasAnnotation(volumeClone.ObjectMeta, annBoundByController) {
  		metav1.SetMetaDataAnnotation(&volumeClone.ObjectMeta, annBoundByController, "yes")
  		dirty = true
  	}
  
  	return volumeClone, dirty, nil
  }
docs: // GetBindVolumeToClaim returns a new volume which is bound to given claim. In
  // addition, it returns a bool which indicates whether we made modification on
  // original volume.