Messages in this thread | | | Date | Wed, 15 Feb 2012 20:06:22 +0100 | From | Oleg Nesterov <> | Subject | Re: + syscalls-x86-add-__nr_kcmp-syscall-v8.patch added to -mm tree |
| |
On 02/15, Cyrill Gorcunov wrote: > > On Wed, Feb 15, 2012 at 07:10:08PM +0400, Cyrill Gorcunov wrote: > > On Wed, Feb 15, 2012 at 03:36:06PM +0100, Oleg Nesterov wrote: > > > > > > task->files can be NULL, we can race with exit_files(). > > > > So I need to call get_files_struct. Thanks Oleg! > > > > Something like below I think, right? (it seems this > patc doesn't hit lenux-next yet, so here is interdiff > output) > > Cyrill > --- > diff -u linux-2.6.git/kernel/kcmp.c linux-2.6.git/kernel/kcmp.c > --- linux-2.6.git/kernel/kcmp.c > +++ linux-2.6.git/kernel/kcmp.c > @@ -44,16 +44,25 @@ > static struct file * > get_file_raw_ptr(struct task_struct *task, unsigned int idx) > { > + struct files_struct *files; > struct fdtable *fdt; > struct file *file; > > - spin_lock(&task->files->file_lock); > - fdt = files_fdtable(task->files); > + files = get_files_struct(task); > + if (!files) > + return NULL; > + > + rcu_read_lock(); > + > + fdt = files_fdtable(files); > if (idx < fdt->max_fds) > file = fdt->fd[idx]; > else > file = NULL; > - spin_unlock(&task->files->file_lock); > + > + rcu_read_unlock(); > + > + put_files_struct(files);
I think this should work. Or you can simply do
struct file *file = NULL;
task_lock(task); rcu_read_lock(); if (task->files) file = fcheck_files(task->files, idx); rcu_read_unlock(); task_unlock(task);
Oleg.
| |