diff --git a/core/includes/file.inc b/core/includes/file.inc
index 675a2d5..e9006fc 100644
--- a/core/includes/file.inc
+++ b/core/includes/file.inc
@@ -1283,19 +1283,12 @@ function file_create_filename($basename, $directory) {
 /**
  * Deletes a file and its database record.
  *
- * If the $force parameter is not TRUE, file_usage_list() will be called to
- * determine if the file is being used by any modules. If the file is being
- * used the delete will be canceled.
+ * Instead of calling this function directly, it is recommended to use the
+ * helper function file_delete_unused() or alternatively call file_usage_list()
+ * and check if there are remaining usages of this file.
  *
  * @param $file
  *   A file object.
- * @param $force
- *   Boolean indicating that the file should be deleted even if the file is
- *   reported as in use by the file_usage table.
- *
- * @return mixed
- *   TRUE for success, FALSE in the event of an error, or an array if the file
- *   is being used by any modules.
  *
  * @see file_unmanaged_delete()
  * @see file_usage_list()
@@ -1303,39 +1296,38 @@ function file_create_filename($basename, $directory) {
  * @see hook_file_predelete()
  * @see hook_file_delete()
  */
-function file_delete(stdClass $file, $force = FALSE) {
-  if (!file_valid_uri($file->uri)) {
-    if (($realpath = drupal_realpath($file->uri)) !== FALSE) {
-      watchdog('file', 'File %file (%realpath) could not be deleted because it is not a valid URI. This may be caused by improper use of file_delete() or a missing stream wrapper.', array('%file' => $file->uri, '%realpath' => $realpath));
-    }
-    else {
-      watchdog('file', 'File %file could not be deleted because it is not a valid URI. This may be caused by improper use of file_delete() or a missing stream wrapper.', array('%file' => $file->uri));
-    }
-    drupal_set_message(t('The specified file %file could not be deleted because it is not a valid URI. More information is available in the system log.', array('%file' => $file->uri)), 'error');
-    return FALSE;
-  }
-
-  // If any module still has a usage entry in the file_usage table, the file
-  // will not be deleted, but file_delete() will return a populated array
-  // that tests as TRUE.
-  if (!$force && ($references = file_usage_list($file))) {
-    return $references;
-  }
-
+function file_delete(stdClass $file) {
   // Let other modules clean up any references to the file prior to deletion.
   module_invoke_all('file_predelete', $file);
   module_invoke_all('entity_predelete', $file, 'file');
 
-  // Make sure the file is deleted before removing its row from the
-  // database, so UIs can still find the file in the database.
-  if (file_unmanaged_delete($file->uri)) {
-    db_delete('file_managed')->condition('fid', $file->fid)->execute();
-    db_delete('file_usage')->condition('fid', $file->fid)->execute();
+  // Attempt to delete the file on the filesystem. Failures will be logged in
+  // watchdog.
+  file_unmanaged_delete($file->uri);
 
-    // Let other modules respond to file deletion.
-    module_invoke_all('file_delete', $file);
-    module_invoke_all('entity_delete', $file, 'file');
+  db_delete('file_managed')->condition('fid', $file->fid)->execute();
+  db_delete('file_usage')->condition('fid', $file->fid)->execute();
 
+  // Let other modules respond to file deletion.
+  module_invoke_all('file_delete', $file);
+  module_invoke_all('entity_delete', $file, 'file');
+}
+
+/**
+ * Deletes a file and its database record if it is unused.
+ *
+ * @param $file
+ *   The file object.
+ *
+ * @return
+ *   TRUE if the file was deleted, FALSE otherwise.
+ *
+ * @see file_delete()
+ */
+function file_delete_unused($file) {
+  $usage = file_usage_list($file);
+  if (empty($usage)) {
+    file_delete($file);
     return TRUE;
   }
   return FALSE;
diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc
index a1a2ef9..a1ff9d7 100644
--- a/core/modules/file/file.field.inc
+++ b/core/modules/file/file.field.inc
@@ -353,7 +353,7 @@ function file_field_delete_file($item, $field, $entity_type, $id, $count = 1) {
   $file_usage = file_usage_list($file);
   if ($file->status == 0 || !empty($file_usage['file'])) {
     file_usage_delete($file, 'file', $entity_type, $id, $count);
-    return file_delete($file);
+    return file_delete_unused($file);
   }
 
   // Even if the file is not deleted, return TRUE to indicate the file field
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 200a335..06176a9 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -3055,7 +3055,10 @@ function system_cron() {
     if ($file = file_load($row->fid)) {
       $references = file_usage_list($file);
       if (empty($references)) {
-        if (!file_delete($file)) {
+        if (file_exists($file->uri)) {
+          file_delete($file);
+        }
+        else {
           watchdog('file system', 'Could not delete temporary file "%path" during garbage collection', array('%path' => $file->uri), WATCHDOG_ERROR);
         }
       }
diff --git a/core/modules/system/tests/file.test b/core/modules/system/tests/file.test
index c5eced1..7605091 100644
--- a/core/modules/system/tests/file.test
+++ b/core/modules/system/tests/file.test
@@ -1562,7 +1562,7 @@ class FileDeleteTest extends FileHookTestCase {
 
     // Check that deletion removes the file and database record.
     $this->assertTrue(is_file($file->uri), t('File exists.'));
-    $this->assertIdentical(file_delete($file), TRUE, t('Delete worked.'));
+    file_delete($file);
     $this->assertFileHooksCalled(array('delete'));
     $this->assertFalse(file_exists($file->uri), t('Test file has actually been deleted.'));
     $this->assertFalse(file_load($file->fid), t('File was removed from the database.'));
@@ -1577,7 +1577,7 @@ class FileDeleteTest extends FileHookTestCase {
     file_usage_add($file, 'testing', 'test', 1);
 
     file_usage_delete($file, 'testing', 'test', 1);
-    file_delete($file);
+    $this->assertFalse(file_delete_unused($file), 'File was not deleted');
     $usage = file_usage_list($file);
     $this->assertEqual($usage['testing']['test'], array(1 => 1), t('Test file is still in use.'));
     $this->assertTrue(file_exists($file->uri), t('File still exists on the disk.'));
@@ -1587,7 +1587,7 @@ class FileDeleteTest extends FileHookTestCase {
     file_test_reset();
 
     file_usage_delete($file, 'testing', 'test', 1);
-    file_delete($file);
+    $this->assertTrue(file_delete_unused($file), 'Unused file was deleted');
     $usage = file_usage_list($file);
     $this->assertFileHooksCalled(array('delete'));
     $this->assertTrue(empty($usage), t('File usage data was removed.'));
