Messages in this thread Patch in this message |  | | Date | Fri, 25 Aug 2006 18:29:43 +0900 | From | KAMEZAWA Hiroyuki <> | Subject | [RFC][PATCH] ps command race fix take 4 [4/4] proc root open/release/llseek |
| |
implements open/release/llseek ops are needed by new proc_pid_readdir()
llseek()'s offset is specified by 'bytes' but /proc root doesn't handle file->f_pos as bytes. So I disabled llseek for /proc for now.
Signed-Off-By: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
fs/proc/root.c | 34 ++++++++++++++++++++++++++++++++++ 1 files changed, 34 insertions(+)
Index: linux-2.6.18-rc4/fs/proc/root.c =================================================================== --- linux-2.6.18-rc4.orig/fs/proc/root.c +++ linux-2.6.18-rc4/fs/proc/root.c @@ -16,6 +16,7 @@ #include <linux/module.h> #include <linux/bitops.h> #include <linux/smp_lock.h> +#include <linux/adaptive_pointer.h> #include "internal.h" @@ -118,14 +119,47 @@ static int proc_root_readdir(struct file return ret; } +static int proc_root_open(struct inode *inode, struct file *filp) +{ + struct adaptive_pointer *ap; + ap = kzalloc(sizeof(*ap), GFP_KERNEL); + init_adaptive_pointer(ap); + if (ap) { + filp->private_data = ap; + return 0; + } + return -ENOMEM; +} + +static int proc_root_release(struct inode *inode, struct file *filp) +{ + struct adaptive_pointer *ap; + ap = filp->private_data; + rcu_read_lock(); + __ap_get_remove_pointer(ap); + rcu_read_unlock(); + kfree(ap); + filp->private_data = NULL; + return 0; +} + +static loff_t proc_root_llseek(struct file *file, loff_t off, int pos) +{ + /* pos is bytes...but we don't use fp->f_pos as bytes... */ + return -ENOTSUPP; +} + /* * The root /proc directory is special, as it has the * <pid> directories. Thus we don't use the generic * directory handling functions for that.. */ static struct file_operations proc_root_operations = { + .open = proc_root_open, .read = generic_read_dir, .readdir = proc_root_readdir, + .release = proc_root_release, + .llseek = proc_root_llseek, }; /* - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |