[RFC][PATCH] ps command race fix take 4 [4/4] proc rootopen/release/llseek

From: KAMEZAWA Hiroyuki
Date: Fri Aug 25 2006 - 05:24:17 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 | 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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/