From: Gunnar Beutner Date: Tue, 11 Oct 2011 16:50:52 +0000 (-0700) Subject: Fixed invalid resource re-use in file_find() X-Git-Tag: spl-0.6.0-rc6~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=763b2f3b57af1febb0fd72c4976992e672a350b4;p=spl Fixed invalid resource re-use in file_find() File descriptors are a per-process resource. The same descriptor in different processes can refer to different files. find_file() incorrectly assumed that file descriptors are globally unique. Signed-off-by: Brian Behlendorf Closes ZFS issue #386 --- diff --git a/include/sys/vnode.h b/include/sys/vnode.h index 7d655e5..36605ca 100644 --- a/include/sys/vnode.h +++ b/include/sys/vnode.h @@ -158,6 +158,7 @@ typedef struct vnode { typedef struct vn_file { int f_fd; /* linux fd for lookup */ + struct task_struct *f_task; /* linux task this fd belongs to */ struct file *f_file; /* linux file struct */ atomic_t f_ref; /* ref count */ kmutex_t f_lock; /* struct lock */ diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c index c466431..1b5cc5a 100644 --- a/module/spl/spl-vnode.c +++ b/module/spl/spl-vnode.c @@ -511,7 +511,7 @@ file_find(int fd) ASSERT(spin_is_locked(&vn_file_lock)); list_for_each_entry(fp, &vn_file_list, f_list) { - if (fd == fp->f_fd) { + if (fd == fp->f_fd && fp->f_task == current) { ASSERT(atomic_read(&fp->f_ref) != 0); return fp; } @@ -550,6 +550,7 @@ vn_getf(int fd) mutex_enter(&fp->f_lock); fp->f_fd = fd; + fp->f_task = current; fp->f_offset = 0; atomic_inc(&fp->f_ref);