code: func (b *volumeBinder) getPodVolumes(pod *v1.Pod) (boundClaims []*v1.PersistentVolumeClaim, unboundClaimsDelayBinding []*v1.PersistentVolumeClaim, unboundClaimsImmediate []*v1.PersistentVolumeClaim, err error) {
  	boundClaims = []*v1.PersistentVolumeClaim{}
  	unboundClaimsImmediate = []*v1.PersistentVolumeClaim{}
  	unboundClaimsDelayBinding = []*v1.PersistentVolumeClaim{}
  
  	for _, vol := range pod.Spec.Volumes {
  		volumeBound, pvc, err := b.isVolumeBound(pod.Namespace, &vol)
  		if err != nil {
  			return nil, nil, nil, err
  		}
  		if pvc == nil {
  			continue
  		}
  		if volumeBound {
  			boundClaims = append(boundClaims, pvc)
  		} else {
  			delayBindingMode, err := IsDelayBindingMode(pvc, b.classLister)
  			if err != nil {
  				return nil, nil, nil, err
  			}
  			// Prebound PVCs are treated as unbound immediate binding
  			if delayBindingMode && pvc.Spec.VolumeName == "" {
  				// Scheduler path
  				unboundClaimsDelayBinding = append(unboundClaimsDelayBinding, pvc)
  			} else {
  				// !delayBindingMode || pvc.Spec.VolumeName != ""
  				// Immediate binding should have already been bound
  				unboundClaimsImmediate = append(unboundClaimsImmediate, pvc)
  			}
  		}
  	}
  	return boundClaims, unboundClaimsDelayBinding, unboundClaimsImmediate, nil
  }
docs: // getPodVolumes returns a pod's PVCs separated into bound, unbound with delayed binding (including provisioning)
  // and unbound with immediate binding (including prebound)