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(); } }