diff -up linux-2.6.18.i686/kernel/exit.c.orig linux-2.6.18.i686/kernel/exit.c
--- linux-2.6.18.i686/kernel/exit.c.orig	2010-11-26 20:29:13.000000000 +0800
+++ linux-2.6.18.i686/kernel/exit.c	2010-11-26 20:29:37.000000000 +0800
@@ -443,7 +443,9 @@ static void close_files(struct files_str
 	 * ->file_lock because this is the last reference to the
 	 * files structure.
 	 */
+	rcu_read_lock();
 	fdt = files_fdtable(files);
+	rcu_read_unlock();
 	for (;;) {
 		unsigned long set;
 		i = j * __NFDBITS;
@@ -487,12 +489,14 @@ void fastcall put_files_struct(struct fi
 		 * at the end of the RCU grace period. Otherwise,
 		 * you can free files immediately.
 		 */
+		rcu_read_lock();
 		fdt = files_fdtable(files);
 		if (fdt == &files->fdtab)
 			fdt->free_files = files;
 		else
 			kmem_cache_free(files_cachep, files);
 		free_fdtable(fdt);
+		rcu_read_unlock();
 	}
 }
 
