mirror of
				https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
				synced 2025-10-31 18:53:24 +00:00 
			
		
		
		
	 2d4d4864ac
			
		
	
	
		2d4d4864ac
		
	
	
	
	
		
			
			[mszeredi@suse.cz] rewrite and split big patch into managable chunks /proc/mounts in its current form lacks important information: - propagation state - root of mount for bind mounts - the st_dev value used within the filesystem - identifier for each mount and it's parent It also suffers from the following problems: - not easily extendable - ambiguity of mountpoints within a chrooted environment - doesn't distinguish between filesystem dependent and independent options - doesn't distinguish between per mount and per super block options This patch introduces /proc/<pid>/mountinfo which attempts to address all these deficiencies. Code shared between /proc/<pid>/mounts and /proc/<pid>/mountinfo is extracted into separate functions. Thanks to Al Viro for the help in getting the design right. Signed-off-by: Ram Pai <linuxram@us.ibm.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _NAMESPACE_H_
 | |
| #define _NAMESPACE_H_
 | |
| #ifdef __KERNEL__
 | |
| 
 | |
| #include <linux/mount.h>
 | |
| #include <linux/sched.h>
 | |
| #include <linux/nsproxy.h>
 | |
| #include <linux/seq_file.h>
 | |
| 
 | |
| struct mnt_namespace {
 | |
| 	atomic_t		count;
 | |
| 	struct vfsmount *	root;
 | |
| 	struct list_head	list;
 | |
| 	wait_queue_head_t poll;
 | |
| 	int event;
 | |
| };
 | |
| 
 | |
| struct proc_mounts {
 | |
| 	struct seq_file m; /* must be the first element */
 | |
| 	struct mnt_namespace *ns;
 | |
| 	struct path root;
 | |
| 	int event;
 | |
| };
 | |
| 
 | |
| extern struct mnt_namespace *copy_mnt_ns(unsigned long, struct mnt_namespace *,
 | |
| 		struct fs_struct *);
 | |
| extern void __put_mnt_ns(struct mnt_namespace *ns);
 | |
| 
 | |
| static inline void put_mnt_ns(struct mnt_namespace *ns)
 | |
| {
 | |
| 	if (atomic_dec_and_lock(&ns->count, &vfsmount_lock))
 | |
| 		/* releases vfsmount_lock */
 | |
| 		__put_mnt_ns(ns);
 | |
| }
 | |
| 
 | |
| static inline void exit_mnt_ns(struct task_struct *p)
 | |
| {
 | |
| 	struct mnt_namespace *ns = p->nsproxy->mnt_ns;
 | |
| 	if (ns)
 | |
| 		put_mnt_ns(ns);
 | |
| }
 | |
| 
 | |
| static inline void get_mnt_ns(struct mnt_namespace *ns)
 | |
| {
 | |
| 	atomic_inc(&ns->count);
 | |
| }
 | |
| 
 | |
| extern const struct seq_operations mounts_op;
 | |
| extern const struct seq_operations mountinfo_op;
 | |
| extern const struct seq_operations mountstats_op;
 | |
| 
 | |
| #endif
 | |
| #endif
 |