1 #include <linux/mount.h>
2 #include <linux/file.h>
4 #include <linux/proc_ns.h>
5 #include <linux/magic.h>
6 #include <linux/ktime.h>
8 static struct vfsmount
*nsfs_mnt
;
10 static const struct file_operations ns_file_operations
= {
14 static char *ns_dname(struct dentry
*dentry
, char *buffer
, int buflen
)
16 struct inode
*inode
= dentry
->d_inode
;
17 const struct proc_ns_operations
*ns_ops
= dentry
->d_fsdata
;
19 return dynamic_dname(dentry
, buffer
, buflen
, "%s:[%lu]",
20 ns_ops
->name
, inode
->i_ino
);
23 static void ns_prune_dentry(struct dentry
*dentry
)
25 struct inode
*inode
= dentry
->d_inode
;
27 struct ns_common
*ns
= inode
->i_private
;
28 atomic_long_set(&ns
->stashed
, 0);
32 const struct dentry_operations ns_dentry_operations
=
34 .d_prune
= ns_prune_dentry
,
35 .d_delete
= always_delete_dentry
,
39 static void nsfs_evict(struct inode
*inode
)
41 struct ns_common
*ns
= inode
->i_private
;
46 void *ns_get_path(struct path
*path
, struct task_struct
*task
,
47 const struct proc_ns_operations
*ns_ops
)
49 struct vfsmount
*mnt
= mntget(nsfs_mnt
);
50 struct qstr qname
= { .name
= "", };
51 struct dentry
*dentry
;
57 ns
= ns_ops
->get(task
);
60 return ERR_PTR(-ENOENT
);
63 d
= atomic_long_read(&ns
->stashed
);
66 dentry
= (struct dentry
*)d
;
67 if (!lockref_get_not_dead(&dentry
->d_lockref
))
73 path
->dentry
= dentry
;
77 inode
= new_inode_pseudo(mnt
->mnt_sb
);
81 return ERR_PTR(-ENOMEM
);
83 inode
->i_ino
= ns
->inum
;
84 inode
->i_mtime
= inode
->i_atime
= inode
->i_ctime
= CURRENT_TIME
;
85 inode
->i_flags
|= S_IMMUTABLE
;
86 inode
->i_mode
= S_IFREG
| S_IRUGO
;
87 inode
->i_fop
= &ns_file_operations
;
88 inode
->i_private
= ns
;
90 dentry
= d_alloc_pseudo(mnt
->mnt_sb
, &qname
);
94 return ERR_PTR(-ENOMEM
);
96 d_instantiate(dentry
, inode
);
97 dentry
->d_fsdata
= (void *)ns_ops
;
98 d
= atomic_long_cmpxchg(&ns
->stashed
, 0, (unsigned long)dentry
);
100 d_delete(dentry
); /* make sure ->d_prune() does nothing */
108 int ns_get_name(char *buf
, size_t size
, struct task_struct
*task
,
109 const struct proc_ns_operations
*ns_ops
)
111 struct ns_common
*ns
;
113 ns
= ns_ops
->get(task
);
115 res
= snprintf(buf
, size
, "%s:[%u]", ns_ops
->name
, ns
->inum
);
121 struct file
*proc_ns_fget(int fd
)
127 return ERR_PTR(-EBADF
);
129 if (file
->f_op
!= &ns_file_operations
)
136 return ERR_PTR(-EINVAL
);
139 static const struct super_operations nsfs_ops
= {
140 .statfs
= simple_statfs
,
141 .evict_inode
= nsfs_evict
,
143 static struct dentry
*nsfs_mount(struct file_system_type
*fs_type
,
144 int flags
, const char *dev_name
, void *data
)
146 return mount_pseudo(fs_type
, "nsfs:", &nsfs_ops
,
147 &ns_dentry_operations
, NSFS_MAGIC
);
149 static struct file_system_type nsfs
= {
152 .kill_sb
= kill_anon_super
,
155 void __init
nsfs_init(void)
157 nsfs_mnt
= kern_mount(&nsfs
);
158 if (IS_ERR(nsfs_mnt
))
159 panic("can't set nsfs up\n");
160 nsfs_mnt
->mnt_sb
->s_flags
&= ~MS_NOUSER
;