On Tue, 2013-10-01 at 23:04 +0100, Al Viro wrote: > On Tue, Oct 01, 2013 at 02:41:58PM -0700, Eric Dumazet wrote: > > Maybe I am missing something obvious ? > > Yes. do_execve_common() starts with unshare_files(); there can be > no other thread capable of modifying that descriptor table. Hmm, then what's the point of using spin_lock() here ? This gives wrong hints ;) diff --git a/fs/file.c b/fs/file.c index 4a78f98..cdbca0d 100644 --- a/fs/file.c +++ b/fs/file.c @@ -615,11 +615,10 @@ void do_close_on_exec(struct files_struct *files) struct fdtable *fdt; /* exec unshares first */ - spin_lock(&files->file_lock); + fdt = files_fdtable(files); for (i = 0; ; i++) { unsigned long set; unsigned fd = i * BITS_PER_LONG; - fdt = files_fdtable(files); if (fd >= fdt->max_fds) break; set = fdt->close_on_exec[i]; @@ -635,14 +634,11 @@ void do_close_on_exec(struct files_struct *files) continue; rcu_assign_pointer(fdt->fd[fd], NULL); __put_unused_fd(files, fd); - spin_unlock(&files->file_lock); filp_close(file, files); cond_resched(); - spin_lock(&files->file_lock); } } - spin_unlock(&files->file_lock); } struct file *fget(unsigned int fd) -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html