vserver 1.9.5.x5
[linux-2.6.git] / fs / proc / task_mmu.c
index 7998fa5..01353eb 100644 (file)
@@ -1,15 +1,17 @@
 #include <linux/mm.h>
 #include <linux/hugetlb.h>
+#include <linux/mount.h>
 #include <linux/seq_file.h>
 #include <asm/elf.h>
 #include <asm/uaccess.h>
+#include "internal.h"
 
 char *task_mem(struct mm_struct *mm, char *buffer)
 {
        unsigned long data, text, lib;
 
        data = mm->total_vm - mm->shared_vm - mm->stack_vm;
-       text = (mm->end_code - mm->start_code) >> 10;
+       text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) >> 10;
        lib = (mm->exec_vm << (PAGE_SHIFT-10)) - text;
        buffer += sprintf(buffer,
                "VmSize:\t%8lu kB\n"
@@ -18,12 +20,14 @@ char *task_mem(struct mm_struct *mm, char *buffer)
                "VmData:\t%8lu kB\n"
                "VmStk:\t%8lu kB\n"
                "VmExe:\t%8lu kB\n"
-               "VmLib:\t%8lu kB\n",
+               "VmLib:\t%8lu kB\n"
+               "VmPTE:\t%8lu kB\n",
                (mm->total_vm - mm->reserved_vm) << (PAGE_SHIFT-10),
                mm->locked_vm << (PAGE_SHIFT-10),
                mm->rss << (PAGE_SHIFT-10),
                data << (PAGE_SHIFT-10),
-               mm->stack_vm << (PAGE_SHIFT-10), text, lib);
+               mm->stack_vm << (PAGE_SHIFT-10), text, lib,
+               (PTRS_PER_PTE*sizeof(pte_t)*mm->nr_ptes) >> 10);
        return buffer;
 }
 
@@ -35,13 +39,44 @@ unsigned long task_vsize(struct mm_struct *mm)
 int task_statm(struct mm_struct *mm, int *shared, int *text,
               int *data, int *resident)
 {
-       *shared = mm->shared_vm;
-       *text = (mm->end_code - mm->start_code) >> PAGE_SHIFT;
-       *data = mm->total_vm - mm->shared_vm - *text;
+       *shared = mm->rss - mm->anon_rss;
+       *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
+                                                               >> PAGE_SHIFT;
+       *data = mm->total_vm - mm->shared_vm;
        *resident = mm->rss;
        return mm->total_vm;
 }
 
+int proc_exe_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
+{
+       struct vm_area_struct * vma;
+       int result = -ENOENT;
+       struct task_struct *task = proc_task(inode);
+       struct mm_struct * mm = get_task_mm(task);
+
+       if (!mm)
+               goto out;
+       down_read(&mm->mmap_sem);
+
+       vma = mm->mmap;
+       while (vma) {
+               if ((vma->vm_flags & VM_EXECUTABLE) && vma->vm_file)
+                       break;
+               vma = vma->vm_next;
+       }
+
+       if (vma) {
+               *mnt = mntget(vma->vm_file->f_vfsmnt);
+               *dentry = dget(vma->vm_file->f_dentry);
+               result = 0;
+       }
+
+       up_read(&mm->mmap_sem);
+       mmput(mm);
+out:
+       return result;
+}
+
 static int show_map(struct seq_file *m, void *v)
 {
        struct vm_area_struct *map = v;