Index: libnautilus-private/nautilus-file.c
===================================================================
--- libnautilus-private/nautilus-file.c	(Revision 12965)
+++ libnautilus-private/nautilus-file.c	(Arbeitskopie)
@@ -5418,10 +5418,23 @@
 void
 nautilus_file_changed (NautilusFile *file)
 {
-	GList fake_list;
+ 	GList fake_list;
+	static GHashTable *current_change_emissions = NULL;
+ 
+	g_assert (NAUTILUS_IS_FILE (file));
 
-	g_return_if_fail (NAUTILUS_IS_FILE (file));
+	if (current_change_emissions == NULL) {
+		current_change_emissions = eel_g_hash_table_new_free_at_exit
+			(g_str_hash, g_str_equal, "nautilus-file.c: current_change_emissions");
+	}
 
+	if (g_hash_table_lookup (current_change_emissions, file)) {
+		/* don't recurse forever! */
+		return;
+	}
+
+	g_hash_table_insert (current_change_emissions, file, GUINT_TO_POINTER (1));
+
 	if (nautilus_file_is_self_owned (file)) {
 		nautilus_file_emit_changed (file);
 	} else {
@@ -5431,6 +5444,8 @@
 		nautilus_directory_emit_change_signals
 			(file->details->directory, &fake_list);
 	}
+
+	g_hash_table_remove (current_change_emissions, file);
 }
 
 /**
@@ -5473,7 +5488,6 @@
 
 	g_assert (NAUTILUS_IS_FILE (file));
 
-
 	/* Invalidate the emblem compare cache. -- This is not the cleanest
 	 * place to do it but it is the one guaranteed bottleneck through
 	 * which all change notifications pass.
