[patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file

2012-08-15 Thread Cyrill Gorcunov
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 
Acked-by: Pavel Emelyanov 
CC: Al Viro 
CC: Alexey Dobriyan 
CC: Andrew Morton 
CC: James Bottomley 
---
 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 
 #include 
 #include 
+#include 
+#include 
 
 #include 
 
 #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(>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(>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(>f_path);
+   *path = fd_file->f_path;
+   path_get(_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(>file_lock);
-   put_files_struct(files);
-   return 0;
+   ret = 0;
}
spin_unlock(>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, >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  

[patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file

2012-08-15 Thread Cyrill Gorcunov
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 gorcu...@openvz.org
Acked-by: Pavel Emelyanov xe...@parallels.com
CC: Al Viro v...@zeniv.linux.org.uk
CC: Alexey Dobriyan adobri...@gmail.com
CC: Andrew Morton a...@linux-foundation.org
CC: James Bottomley jbottom...@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);

Re: [patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file

2012-08-14 Thread Pavel Emelyanov
On 08/14/2012 06:03 PM, Cyrill Gorcunov wrote:
> 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), moreover in further patches I need to provide two seq_fdinfo_open
> variants -- one with CONFIG_CHECKPOINT_RESTORE and one without this
> symbol. All in one -- this will look more messy then.
> 
> 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 
> CC: Al Viro 
> CC: Alexey Dobriyan 
> CC: Andrew Morton 
> CC: Pavel Emelyanov 
> CC: James Bottomley 

Acked-by: Pavel Emelyanov 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file

2012-08-14 Thread Cyrill Gorcunov
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), moreover in further patches I need to provide two seq_fdinfo_open
variants -- one with CONFIG_CHECKPOINT_RESTORE and one without this
symbol. All in one -- this will look more messy then.

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 
CC: Al Viro 
CC: Alexey Dobriyan 
CC: Andrew Morton 
CC: Pavel Emelyanov 
CC: James Bottomley 
---
 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 
 #include 
 #include 
+#include 
+#include 
 
 #include 
 
 #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(>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(>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(>f_path);
+   *path = fd_file->f_path;
+   path_get(_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(>file_lock);
-   put_files_struct(files);
-   return 0;
+   ret = 0;
}
spin_unlock(>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, >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 

[patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file

2012-08-14 Thread Cyrill Gorcunov
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), moreover in further patches I need to provide two seq_fdinfo_open
variants -- one with CONFIG_CHECKPOINT_RESTORE and one without this
symbol. All in one -- this will look more messy then.

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 gorcu...@openvz.org
CC: Al Viro v...@zeniv.linux.org.uk
CC: Alexey Dobriyan adobri...@gmail.com
CC: Andrew Morton a...@linux-foundation.org
CC: Pavel Emelyanov xe...@parallels.com
CC: James Bottomley jbottom...@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 

Re: [patch 2/8] procfs: Convert /proc/pid/fdinfo/ handling routines to seq-file

2012-08-14 Thread Pavel Emelyanov
On 08/14/2012 06:03 PM, Cyrill Gorcunov wrote:
 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), moreover in further patches I need to provide two seq_fdinfo_open
 variants -- one with CONFIG_CHECKPOINT_RESTORE and one without this
 symbol. All in one -- this will look more messy then.
 
 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 gorcu...@openvz.org
 CC: Al Viro v...@zeniv.linux.org.uk
 CC: Alexey Dobriyan adobri...@gmail.com
 CC: Andrew Morton a...@linux-foundation.org
 CC: Pavel Emelyanov xe...@parallels.com
 CC: James Bottomley jbottom...@parallels.com

Acked-by: Pavel Emelyanov xe...@parallels.com

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/