2005-04-17 02:20:36 +04:00
/* internal.h: internal procfs definitions
*
* Copyright ( C ) 2004 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
# include <linux/proc_fs.h>
2008-04-29 12:01:44 +04:00
extern struct proc_dir_entry proc_root ;
2007-04-02 10:49:35 +04:00
# ifdef CONFIG_PROC_SYSCTL
2007-02-14 11:34:12 +03:00
extern int proc_sys_init ( void ) ;
2007-04-02 10:49:35 +04:00
# else
static inline void proc_sys_init ( void ) { }
# endif
2007-09-12 14:01:34 +04:00
# ifdef CONFIG_NET
extern int proc_net_init ( void ) ;
# else
static inline int proc_net_init ( void ) { return 0 ; }
# endif
2007-02-14 11:34:12 +03:00
2005-04-17 02:20:36 +04:00
struct vmalloc_info {
unsigned long used ;
unsigned long largest_chunk ;
} ;
2008-01-02 17:09:57 +03:00
extern struct mm_struct * mm_for_maps ( struct task_struct * ) ;
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_MMU
# define VMALLOC_TOTAL (VMALLOC_END - VMALLOC_START)
extern void get_vmalloc_info ( struct vmalloc_info * vmi ) ;
# else
# define VMALLOC_TOTAL 0UL
# define get_vmalloc_info(vmi) \
do { \
( vmi ) - > used = 0 ; \
( vmi ) - > largest_chunk = 0 ; \
} while ( 0 )
# endif
2008-02-08 15:18:31 +03:00
extern int proc_tid_stat ( struct seq_file * m , struct pid_namespace * ns ,
struct pid * pid , struct task_struct * task ) ;
extern int proc_tgid_stat ( struct seq_file * m , struct pid_namespace * ns ,
struct pid * pid , struct task_struct * task ) ;
2008-02-08 15:18:33 +03:00
extern int proc_pid_status ( struct seq_file * m , struct pid_namespace * ns ,
struct pid * pid , struct task_struct * task ) ;
2008-02-08 15:18:32 +03:00
extern int proc_pid_statm ( struct seq_file * m , struct pid_namespace * ns ,
struct pid * pid , struct task_struct * task ) ;
2008-02-05 09:29:04 +03:00
extern loff_t mem_lseek ( struct file * file , loff_t offset , int orig ) ;
2005-04-17 02:20:36 +04:00
2007-02-12 11:55:34 +03:00
extern const struct file_operations proc_maps_operations ;
extern const struct file_operations proc_numa_maps_operations ;
extern const struct file_operations proc_smaps_operations ;
2008-02-05 09:29:03 +03:00
extern const struct file_operations proc_clear_refs_operations ;
2008-02-05 09:29:04 +03:00
extern const struct file_operations proc_pagemap_operations ;
[NET]: Make /proc/net a symlink on /proc/self/net (v3)
Current /proc/net is done with so called "shadows", but current
implementation is broken and has little chances to get fixed.
The problem is that dentries subtree of /proc/net directory has
fancy revalidation rules to make processes living in different
net namespaces see different entries in /proc/net subtree, but
currently, tasks see in the /proc/net subdir the contents of any
other namespace, depending on who opened the file first.
The proposed fix is to turn /proc/net into a symlink, which points
to /proc/self/net, which in turn shows what previously was in
/proc/net - the network-related info, from the net namespace the
appropriate task lives in.
# ls -l /proc/net
lrwxrwxrwx 1 root root 8 Mar 5 15:17 /proc/net -> self/net
In other words - this behaves like /proc/mounts, but unlike
"mounts", "net" is not a file, but a directory.
Changes from v2:
* Fixed discrepancy of /proc/net nlink count and selinux labeling
screwup pointed out by Stephen.
To get the correct nlink count the ->getattr callback for /proc/net
is overridden to read one from the net->proc_net entry.
To make selinux still work the net->proc_net entry is initialized
properly, i.e. with the "net" name and the proc_net parent.
Selinux fixes are
Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
Changes from v1:
* Fixed a task_struct leak in get_proc_task_net, pointed out by Paul.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Acked-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-03-07 22:08:40 +03:00
extern const struct file_operations proc_net_operations ;
extern const struct inode_operations proc_net_inode_operations ;
2006-06-26 11:25:55 +04:00
2008-10-17 03:43:55 +04:00
void proc_init_inodecache ( void ) ;
2006-01-08 12:04:16 +03:00
2006-06-26 11:25:56 +04:00
static inline struct pid * proc_pid ( struct inode * inode )
2006-06-26 11:25:55 +04:00
{
2006-06-26 11:25:56 +04:00
return PROC_I ( inode ) - > pid ;
2006-06-26 11:25:55 +04:00
}
static inline struct task_struct * get_proc_task ( struct inode * inode )
2005-04-17 02:20:36 +04:00
{
2006-06-26 11:25:56 +04:00
return get_pid_task ( proc_pid ( inode ) , PIDTYPE_PID ) ;
2005-04-17 02:20:36 +04:00
}
2006-06-26 11:25:44 +04:00
static inline int proc_fd ( struct inode * inode )
2005-04-17 02:20:36 +04:00
{
2006-06-26 11:25:44 +04:00
return PROC_I ( inode ) - > fd ;
2005-04-17 02:20:36 +04:00
}
[NET]: Make /proc/net a symlink on /proc/self/net (v3)
Current /proc/net is done with so called "shadows", but current
implementation is broken and has little chances to get fixed.
The problem is that dentries subtree of /proc/net directory has
fancy revalidation rules to make processes living in different
net namespaces see different entries in /proc/net subtree, but
currently, tasks see in the /proc/net subdir the contents of any
other namespace, depending on who opened the file first.
The proposed fix is to turn /proc/net into a symlink, which points
to /proc/self/net, which in turn shows what previously was in
/proc/net - the network-related info, from the net namespace the
appropriate task lives in.
# ls -l /proc/net
lrwxrwxrwx 1 root root 8 Mar 5 15:17 /proc/net -> self/net
In other words - this behaves like /proc/mounts, but unlike
"mounts", "net" is not a file, but a directory.
Changes from v2:
* Fixed discrepancy of /proc/net nlink count and selinux labeling
screwup pointed out by Stephen.
To get the correct nlink count the ->getattr callback for /proc/net
is overridden to read one from the net->proc_net entry.
To make selinux still work the net->proc_net entry is initialized
properly, i.e. with the "net" name and the proc_net parent.
Selinux fixes are
Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
Changes from v1:
* Fixed a task_struct leak in get_proc_task_net, pointed out by Paul.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Acked-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-03-07 22:08:40 +03:00
struct dentry * proc_lookup_de ( struct proc_dir_entry * de , struct inode * ino ,
struct dentry * dentry ) ;
int proc_readdir_de ( struct proc_dir_entry * de , struct file * filp , void * dirent ,
filldir_t filldir ) ;
2008-07-25 12:48:29 +04:00
struct pde_opener {
struct inode * inode ;
struct file * file ;
int ( * release ) ( struct inode * , struct file * ) ;
struct list_head lh ;
} ;
2009-02-20 17:04:33 +03:00
void pde_users_dec ( struct proc_dir_entry * pde ) ;
2009-04-07 21:19:18 +04:00
extern spinlock_t proc_subdir_lock ;
struct dentry * proc_pid_lookup ( struct inode * dir , struct dentry * dentry , struct nameidata * ) ;
int proc_pid_readdir ( struct file * filp , void * dirent , filldir_t filldir ) ;
unsigned long task_vsize ( struct mm_struct * ) ;
2011-01-13 04:00:32 +03:00
unsigned long task_statm ( struct mm_struct * ,
unsigned long * , unsigned long * , unsigned long * , unsigned long * ) ;
2009-04-07 21:19:18 +04:00
void task_mem ( struct seq_file * , struct mm_struct * ) ;
2009-12-16 03:45:39 +03:00
static inline struct proc_dir_entry * pde_get ( struct proc_dir_entry * pde )
{
atomic_inc ( & pde - > count ) ;
return pde ;
}
void pde_put ( struct proc_dir_entry * pde ) ;
2009-04-07 21:19:18 +04:00
int proc_fill_super ( struct super_block * ) ;
2011-01-13 04:00:33 +03:00
struct inode * proc_get_inode ( struct super_block * , struct proc_dir_entry * ) ;
2009-04-07 21:19:18 +04:00
/*
* These are generic / proc routines that use the internal
* " struct proc_dir_entry " tree to traverse the filesystem .
*
* The / proc root directory has extended versions to take care
* of the / proc / < pid > subdirectories .
*/
int proc_readdir ( struct file * , void * , filldir_t ) ;
struct dentry * proc_lookup ( struct inode * , struct dentry * , struct nameidata * ) ;