code: func (ctrl *PersistentVolumeController) findDeletablePlugin(volume *v1.PersistentVolume) (vol.DeletableVolumePlugin, error) {
  	// Find a plugin. Try to find the same plugin that provisioned the volume
  	var plugin vol.DeletableVolumePlugin
  	if metav1.HasAnnotation(volume.ObjectMeta, annDynamicallyProvisioned) {
  		provisionPluginName := volume.Annotations[annDynamicallyProvisioned]
  		if provisionPluginName != "" {
  			plugin, err := ctrl.volumePluginMgr.FindDeletablePluginByName(provisionPluginName)
  			if err != nil {
  				if !strings.HasPrefix(provisionPluginName, "kubernetes.io/") {
  					// External provisioner is requested, do not report error
  					return nil, nil
  				}
  				return nil, err
  			}
  			return plugin, nil
  		}
  	}
  
  	// The plugin that provisioned the volume was not found or the volume
  	// was not dynamically provisioned. Try to find a plugin by spec.
  	spec := vol.NewSpecFromPersistentVolume(volume, false)
  	plugin, err := ctrl.volumePluginMgr.FindDeletablePluginBySpec(spec)
  	if err != nil {
  		// No deleter found. Emit an event and mark the volume Failed.
  		return nil, fmt.Errorf("Error getting deleter volume plugin for volume %q: %v", volume.Name, err)
  	}
  	return plugin, nil
  }
docs: // findDeletablePlugin finds a deleter plugin for a given volume. It returns
  // either the deleter plugin or nil when an external deleter is requested.