Index: filefield_widget.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_widget.inc,v
retrieving revision 1.89
diff -u -r1.89 filefield_widget.inc
--- filefield_widget.inc	25 Jul 2009 04:35:03 -0000	1.89
+++ filefield_widget.inc	24 Apr 2010 01:16:06 -0000
@@ -415,10 +415,7 @@
     if ($file = field_file_load($element['fid']['#value'])) {
       $file = (object) $file;
       if ($file->status == FILE_STATUS_PERMANENT) {
-        // TODO: We could use field_file_references() here to reference any file
-        // but hook_file_delete() needs to be implemented first.
-        $references = module_invoke('filefield', 'file_references', $file);
-        if ($references['filefield'] == 0) {
+        if (field_file_references($file) == 0) {
           form_error($element, t('Referencing to the file used in the %field field is not allowed.', array('%field' => $element['#title'])));
         }
       }
Index: filefield.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield.module,v
retrieving revision 1.210
diff -u -r1.210 filefield.module
--- filefield.module	24 Apr 2010 00:14:17 -0000	1.210
+++ filefield.module	24 Apr 2010 01:16:05 -0000
@@ -620,7 +620,7 @@
  * Implementation of hook_file_delete().
  */
 function filefield_file_delete($file) {
-  // foreach  field... remove items referencing $file.
+  filefield_delete_file_references($file);
 }
 
 /**
@@ -972,3 +972,33 @@
 
   return $files;
 }
+
+/**
+ * Delete all node references of a file.
+ *
+ * @param $file
+ *   The file object for which to find references.
+ * @param $field
+ *   Optional. The CCK field array or field name as a string.
+ */
+function filefield_delete_file_references($file, $field = NULL) {
+  $fields = filefield_get_field_list(NULL, $field);
+  $file = (object) $file;
+
+  $references = filefield_get_file_references($file, $field);
+  foreach ($references as $nid => $node_references) {
+    foreach ($node_references as $vid) {
+      $node = node_load(array('vid' => $vid));
+      foreach ($fields as $field_name => $field) {
+        if (isset($node->$field_name)) {
+          foreach ($node->$field_name as $delta => $item) {
+            if ($item['fid'] == $file->fid) {
+              unset($node->$field_name[$delta]);
+            }
+          }
+        }
+      }
+      node_save($node);
+    }
+  }
+}
