[<prev] [next>] [day] [month] [year] [list]
Message-Id: <20060824210426.9c8a58d5.kamezawa.hiroyu@jp.fujitsu.com>
Date: Thu, 24 Aug 2006 21:04:26 +0900
From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@...fujitsu.com>
To: LKML <linux-kernel@...r.kernel.org>
Cc: ebiederm@...ssion.com, kamezawa.hiroyu@...fujitsu.com,
Andrew Morton <akpm@...l.org>, saito.tadashi@...t.fujitsu.com,
ak@...e.de
Subject: [RFC][PATCH] ps command race fix take 3 [4/4]
proc_root_open/releae/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@...fujitsu.com>
fs/proc/root.c | 33 +++++++++++++++++++++++++++++++++
1 files changed, 33 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/watch_head.h>
#include "internal.h"
@@ -118,14 +119,46 @@ static int proc_root_readdir(struct file
return ret;
}
+static int proc_root_open(struct inode *inode, struct file *filp)
+{
+ struct watch_head *wh;
+ wh = kzalloc(sizeof(*wh), GFP_KERNEL);
+ if (wh) {
+ filp->private_data = wh;
+ return 0;
+ }
+ return -ENOMEM;
+}
+
+static int proc_root_release(struct inode *inode, struct file *filp)
+{
+ struct watch_head *wh;
+ wh = filp->private_data;
+ rcu_read_lock();
+ wh_get_and_remove_watcher(wh);
+ rcu_read_unlock();
+ kfree(wh);
+ 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@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists