]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/proc/base.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6-omap-h63xx.git] / fs / proc / base.c
index d744aa3c9f746ac527b4c1d6e46f8d625bc69f78..01ed610f9b87f6fc0ffe1bfa89f2177e77d07323 100644 (file)
@@ -53,6 +53,7 @@
 #include <linux/time.h>
 #include <linux/proc_fs.h>
 #include <linux/stat.h>
+#include <linux/task_io_accounting_ops.h>
 #include <linux/init.h>
 #include <linux/capability.h>
 #include <linux/file.h>
@@ -1859,8 +1860,7 @@ static const struct file_operations proc_fd_operations = {
  * /proc/pid/fd needs a special permission handler so that a process can still
  * access /proc/self/fd after it has executed a setuid().
  */
-static int proc_fd_permission(struct inode *inode, int mask,
-                               struct nameidata *nd)
+static int proc_fd_permission(struct inode *inode, int mask)
 {
        int rv;
 
@@ -2403,44 +2403,17 @@ static int proc_base_fill_cache(struct file *filp, void *dirent,
 #ifdef CONFIG_TASK_IO_ACCOUNTING
 static int do_io_accounting(struct task_struct *task, char *buffer, int whole)
 {
-       u64 rchar, wchar, syscr, syscw;
-       struct task_io_accounting ioac;
-
-       rchar = task->rchar;
-       wchar = task->wchar;
-       syscr = task->syscr;
-       syscw = task->syscw;
-       memcpy(&ioac, &task->ioac, sizeof(ioac));
-
-       if (whole) {
-               unsigned long flags;
-
-               if (lock_task_sighand(task, &flags)) {
-                       struct signal_struct *sig = task->signal;
-                       struct task_struct *t = task;
-
-                       rchar += sig->rchar;
-                       wchar += sig->wchar;
-                       syscr += sig->syscr;
-                       syscw += sig->syscw;
-
-                       ioac.read_bytes += sig->ioac.read_bytes;
-                       ioac.write_bytes += sig->ioac.write_bytes;
-                       ioac.cancelled_write_bytes +=
-                                       sig->ioac.cancelled_write_bytes;
-                       while_each_thread(task, t) {
-                               rchar += t->rchar;
-                               wchar += t->wchar;
-                               syscr += t->syscr;
-                               syscw += t->syscw;
-
-                               ioac.read_bytes += t->ioac.read_bytes;
-                               ioac.write_bytes += t->ioac.write_bytes;
-                               ioac.cancelled_write_bytes +=
-                                       t->ioac.cancelled_write_bytes;
-                       }
-                       unlock_task_sighand(task, &flags);
-               }
+       struct task_io_accounting acct = task->ioac;
+       unsigned long flags;
+
+       if (whole && lock_task_sighand(task, &flags)) {
+               struct task_struct *t = task;
+
+               task_io_accounting_add(&acct, &task->signal->ioac);
+               while_each_thread(task, t)
+                       task_io_accounting_add(&acct, &t->ioac);
+
+               unlock_task_sighand(task, &flags);
        }
        return sprintf(buffer,
                        "rchar: %llu\n"
@@ -2450,9 +2423,10 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole)
                        "read_bytes: %llu\n"
                        "write_bytes: %llu\n"
                        "cancelled_write_bytes: %llu\n",
-                       rchar, wchar, syscr, syscw,
-                       ioac.read_bytes, ioac.write_bytes,
-                       ioac.cancelled_write_bytes);
+                       acct.rchar, acct.wchar,
+                       acct.syscr, acct.syscw,
+                       acct.read_bytes, acct.write_bytes,
+                       acct.cancelled_write_bytes);
 }
 
 static int proc_tid_io_accounting(struct task_struct *task, char *buffer)