[RFC][PATCH] ps command race fix take 3 [4/4] proc_root_open/releae/llseek

From: KAMEZAWA Hiroyuki
Date: Thu Aug 24 2006 - 07:58:50 EST


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@xxxxxxxxxxxxxx>

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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/