From: Cyrill Gorcunov <gorcunov@openvz.org>
To: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Cc: Al Viro <viro@zeniv.linux.org.uk>,
Alexey Dobriyan <adobriyan@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
Pavel Emelyanov <xemul@parallels.com>,
James Bottomley <jbottomley@parallels.com>,
Matthew Helsley <matt.helsley@gmail.com>,
Cyrill Gorcunov <gorcunov@openvz.org>,
Al Viro <viro@ZenIV.linux.org.uk>
Subject: [patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file
Date: Wed, 15 Aug 2012 13:21:18 +0400 [thread overview]
Message-ID: <20120815092409.424674336@openvz.org> (raw)
In-Reply-To: 20120815092116.700948346@openvz.org
[-- Attachment #1: seq-fdinfo-seq-ops-6 --]
[-- Type: text/plain, Size: 5151 bytes --]
This patch converts /proc/pid/fdinfo/ handling routines to seq-file which
is needed to extend seq operations and plug in auxiliary fdinfo provides
from subsystems like eventfd/eventpoll/fsnotify.
Note the proc_fd_link no longer call for proc_fd_info, simply because
proc_fd_info is converted to seq_fdinfo_open (which is seq-file open()
prototype).
Also, to eliminate code duplication (and Pavel's concerns) the fdinfo_open_helper
function introduced which is used in both seq_fdinfo_open and proc_fd_link.
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
Acked-by: Pavel Emelyanov <xemul@parallels.com>
CC: Al Viro <viro@ZenIV.linux.org.uk>
CC: Alexey Dobriyan <adobriyan@gmail.com>
CC: Andrew Morton <akpm@linux-foundation.org>
CC: James Bottomley <jbottomley@parallels.com>
---
fs/proc/fd.c | 123 +++++++++++++++++++++++++++++++++++------------------------
1 file changed, 75 insertions(+), 48 deletions(-)
Index: linux-2.6.git/fs/proc/fd.c
===================================================================
--- linux-2.6.git.orig/fs/proc/fd.c
+++ linux-2.6.git/fs/proc/fd.c
@@ -6,61 +6,104 @@
#include <linux/namei.h>
#include <linux/pid.h>
#include <linux/security.h>
+#include <linux/file.h>
+#include <linux/seq_file.h>
#include <linux/proc_fs.h>
#include "internal.h"
#include "fd.h"
-#define PROC_FDINFO_MAX 64
+struct proc_fdinfo {
+ loff_t f_pos;
+ int f_flags;
+};
-static int proc_fd_info(struct inode *inode, struct path *path, char *info)
+static int fdinfo_open_helper(struct inode *inode, int *f_flags, struct path *path)
{
- struct task_struct *task = get_proc_task(inode);
struct files_struct *files = NULL;
- int fd = proc_fd(inode);
- struct file *file;
+ struct task_struct *task;
+ int ret = -ENOENT;
+ task = get_proc_task(inode);
if (task) {
files = get_files_struct(task);
put_task_struct(task);
}
+
if (files) {
- /*
- * We are not taking a ref to the file structure, so we must
- * hold ->file_lock.
- */
- spin_lock(&files->file_lock);
- file = fcheck_files(files, fd);
- if (file) {
- unsigned int f_flags;
- struct fdtable *fdt;
-
- fdt = files_fdtable(files);
- f_flags = file->f_flags & ~O_CLOEXEC;
- if (close_on_exec(fd, fdt))
- f_flags |= O_CLOEXEC;
+ int fd = proc_fd(inode);
+ struct file *fd_file;
+ spin_lock(&files->file_lock);
+ fd_file = fcheck_files(files, fd);
+ if (fd_file) {
+ if (f_flags) {
+ struct fdtable *fdt = files_fdtable(files);
+
+ *f_flags = fd_file->f_flags & ~O_CLOEXEC;
+ if (close_on_exec(fd, fdt))
+ *f_flags |= O_CLOEXEC;
+ }
if (path) {
- *path = file->f_path;
- path_get(&file->f_path);
+ *path = fd_file->f_path;
+ path_get(&fd_file->f_path);
}
- if (info)
- snprintf(info, PROC_FDINFO_MAX,
- "pos:\t%lli\n"
- "flags:\t0%o\n",
- (long long) file->f_pos,
- f_flags);
- spin_unlock(&files->file_lock);
- put_files_struct(files);
- return 0;
+ ret = 0;
}
spin_unlock(&files->file_lock);
put_files_struct(files);
}
- return -ENOENT;
+
+ return ret;
}
+static int seq_show(struct seq_file *m, void *v)
+{
+ struct proc_fdinfo *fdinfo = m->private;
+ seq_printf(m, "pos:\t%lli\nflags:\t0%o\n",
+ (long long)fdinfo->f_pos,
+ fdinfo->f_flags);
+ return 0;
+}
+
+static int seq_fdinfo_open(struct inode *inode, struct file *file)
+{
+ struct proc_fdinfo *fdinfo = NULL;
+ int ret = -ENOENT;
+
+ fdinfo = kzalloc(sizeof(*fdinfo), GFP_KERNEL);
+ if (!fdinfo)
+ return -ENOMEM;
+
+ ret = fdinfo_open_helper(inode, &fdinfo->f_flags, NULL);
+ if (!ret) {
+ ret = single_open(file, seq_show, fdinfo);
+ if (!ret)
+ fdinfo = NULL;
+ }
+
+ kfree(fdinfo);
+ return ret;
+}
+
+static int seq_fdinfo_release(struct inode *inode, struct file *file)
+{
+ struct seq_file *m = file->private_data;
+ struct proc_fdinfo *fdinfo = m->private;
+
+ kfree(fdinfo);
+
+ return single_release(inode, file);
+}
+
+static const struct file_operations proc_fdinfo_file_operations = {
+ .open = seq_fdinfo_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = seq_fdinfo_release,
+};
+
static int tid_fd_revalidate(struct dentry *dentry, unsigned int flags)
{
struct files_struct *files;
@@ -130,7 +173,7 @@ static const struct dentry_operations ti
static int proc_fd_link(struct dentry *dentry, struct path *path)
{
- return proc_fd_info(dentry->d_inode, path, NULL);
+ return fdinfo_open_helper(dentry->d_inode, NULL, path);
}
static struct dentry *
@@ -245,22 +288,6 @@ out_no_task:
return retval;
}
-static ssize_t proc_fdinfo_read(struct file *file, char __user *buf,
- size_t len, loff_t *ppos)
-{
- char tmp[PROC_FDINFO_MAX];
- int err = proc_fd_info(file->f_path.dentry->d_inode, NULL, tmp);
- if (!err)
- err = simple_read_from_buffer(buf, len, ppos, tmp, strlen(tmp));
- return err;
-}
-
-static const struct file_operations proc_fdinfo_file_operations = {
- .open = nonseekable_open,
- .read = proc_fdinfo_read,
- .llseek = no_llseek,
-};
-
static int proc_readfd(struct file *filp, void *dirent, filldir_t filldir)
{
return proc_readfd_common(filp, dirent, filldir, proc_fd_instantiate);
next prev parent reply other threads:[~2012-08-15 9:21 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-15 9:21 [patch 0/8] procfs, fdinfo updated Cyrill Gorcunov
2012-08-15 9:21 ` [patch 1/8] procfs: Move /proc/pid/fd[info] handling code to fd.[ch] Cyrill Gorcunov
2012-08-15 9:21 ` Cyrill Gorcunov [this message]
2012-08-15 9:21 ` [patch 3/8] procfs: Add ability to plug in auxiliary fdinfo providers Cyrill Gorcunov
2012-08-15 21:16 ` Al Viro
2012-08-15 21:31 ` Cyrill Gorcunov
2012-08-15 21:29 ` Al Viro
2012-08-15 21:34 ` Cyrill Gorcunov
2012-08-16 10:58 ` Cyrill Gorcunov
2012-08-15 9:21 ` [patch 4/8] fs, exportfs: Add export_encode_inode_fh helper Cyrill Gorcunov
2012-08-15 20:45 ` J. Bruce Fields
2012-08-15 21:02 ` Cyrill Gorcunov
2012-08-15 22:06 ` J. Bruce Fields
2012-08-16 6:24 ` Cyrill Gorcunov
2012-08-16 12:38 ` Cyrill Gorcunov
2012-08-16 12:47 ` J. Bruce Fields
2012-08-16 13:16 ` Cyrill Gorcunov
2012-08-16 14:57 ` Cyrill Gorcunov
2012-08-16 15:05 ` Al Viro
2012-08-16 15:09 ` Cyrill Gorcunov
2012-08-16 13:43 ` Al Viro
2012-08-16 13:47 ` Pavel Emelyanov
2012-08-16 13:50 ` Al Viro
2012-08-16 13:53 ` Pavel Emelyanov
2012-08-16 13:54 ` Cyrill Gorcunov
2012-08-16 14:03 ` James Bottomley
2012-08-16 14:03 ` James Bottomley
2012-08-16 14:13 ` Pavel Emelyanov
2012-08-16 14:15 ` Cyrill Gorcunov
2012-08-16 14:41 ` Al Viro
2012-08-16 14:48 ` Cyrill Gorcunov
2012-08-16 14:54 ` J. Bruce Fields
2012-08-16 14:55 ` Al Viro
2012-08-16 15:06 ` Pavel Emelyanov
2012-08-16 15:35 ` Cyrill Gorcunov
2012-08-16 15:07 ` Cyrill Gorcunov
2012-08-17 20:58 ` Eric W. Biederman
2012-08-16 13:48 ` Al Viro
2012-08-20 14:19 ` Aneesh Kumar K.V
2012-08-20 16:33 ` Cyrill Gorcunov
2012-08-20 18:32 ` J. Bruce Fields
2012-08-20 19:06 ` Cyrill Gorcunov
2012-08-20 19:32 ` J. Bruce Fields
2012-08-20 19:40 ` Cyrill Gorcunov
2012-08-21 9:18 ` Pavel Emelyanov
2012-08-21 10:42 ` Aneesh Kumar K.V
2012-08-21 10:49 ` Pavel Emelyanov
2012-08-21 10:54 ` Cyrill Gorcunov
2012-08-21 11:09 ` Pavel Emelyanov
2012-08-21 12:11 ` J. Bruce Fields
2012-08-21 12:22 ` Pavel Emelyanov
2012-08-21 12:29 ` J. Bruce Fields
2012-08-21 12:40 ` Pavel Emelyanov
2012-08-21 12:51 ` Boaz Harrosh
2012-08-21 12:59 ` Pavel Emelyanov
2012-08-21 13:08 ` Boaz Harrosh
2012-08-21 13:12 ` Al Viro
2012-08-21 13:40 ` Cyrill Gorcunov
2012-08-21 12:09 ` J. Bruce Fields
2012-08-21 12:25 ` Pavel Emelyanov
2012-08-22 5:49 ` Aneesh Kumar K.V
2012-08-23 8:06 ` Cyrill Gorcunov
2012-08-23 8:54 ` Marco Stornelli
2012-08-23 9:29 ` Cyrill Gorcunov
2012-08-15 9:21 ` [patch 5/8] fs, notify: Add procfs fdinfo helper v3 Cyrill Gorcunov
2012-08-15 9:21 ` [patch 6/8] fs, eventfd: Add procfs fdinfo helper Cyrill Gorcunov
2012-08-15 9:21 ` [patch 7/8] fs, epoll: Add procfs fdinfo helper v2 Cyrill Gorcunov
2012-08-15 9:21 ` [patch 8/8] fdinfo: Show sigmask for signalfd fd v2 Cyrill Gorcunov
-- strict thread matches above, loose matches on Subject: below --
2012-08-14 14:03 [patch 0/8] procfs fdinfo providers updated Cyrill Gorcunov
2012-08-14 14:03 ` [patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file Cyrill Gorcunov
2012-08-14 14:21 ` Pavel Emelyanov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120815092409.424674336@openvz.org \
--to=gorcunov@openvz.org \
--cc=adobriyan@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=jbottomley@parallels.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matt.helsley@gmail.com \
--cc=viro@zeniv.linux.org.uk \
--cc=xemul@parallels.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.