4 #include "vserver/cvirt.h"
5 #include "vserver/debug.h"
8 /* utsname virtualization */
10 static inline struct new_utsname *vx_new_utsname(void)
13 return ¤t->vx_info->cvirt.utsname;
14 return &system_utsname;
17 #define vx_new_uts(x) ((vx_new_utsname())->x)
20 /* pid faking stuff */
23 #define vx_info_map_pid(v,p) \
24 __vx_info_map_pid((v), (p), __FUNC__, __FILE__, __LINE__)
25 #define vx_info_map_tgid(v,p) vx_info_map_pid(v,p)
26 #define vx_map_pid(p) vx_info_map_pid(current->vx_info, p)
27 #define vx_map_tgid(p) vx_map_pid(p)
29 static inline int __vx_info_map_pid(struct vx_info *vxi, int pid,
30 const char *func, const char *file, int line)
32 if (vx_info_flags(vxi, VXF_INFO_INIT, 0)) {
33 vxfprintk(VXD_CBIT(cvirt, 2),
34 "vx_map_tgid: %p/%llx: %d -> %d",
35 vxi, (long long)vxi->vx_flags, pid,
36 (pid && pid == vxi->vx_initpid)?1:pid,
40 if (pid == vxi->vx_initpid)
46 #define vx_info_rmap_pid(v,p) \
47 __vx_info_rmap_pid((v), (p), __FUNC__, __FILE__, __LINE__)
48 #define vx_rmap_pid(p) vx_info_rmap_pid(current->vx_info, p)
49 #define vx_rmap_tgid(p) vx_rmap_pid(p)
51 static inline int __vx_info_rmap_pid(struct vx_info *vxi, int pid,
52 const char *func, const char *file, int line)
54 if (vx_info_flags(vxi, VXF_INFO_INIT, 0)) {
55 vxfprintk(VXD_CBIT(cvirt, 2),
56 "vx_rmap_tgid: %p/%llx: %d -> %d",
57 vxi, (long long)vxi->vx_flags, pid,
58 (pid == 1)?vxi->vx_initpid:pid,
60 if ((pid == 1) && vxi->vx_initpid)
61 return vxi->vx_initpid;
62 if (pid == vxi->vx_initpid)
69 static inline void vx_activate_task(struct task_struct *p)
73 if ((vxi = p->vx_info)) {
75 atomic_inc(&vxi->cvirt.nr_running);
79 static inline void vx_deactivate_task(struct task_struct *p)
83 if ((vxi = p->vx_info)) {
85 atomic_dec(&vxi->cvirt.nr_running);
89 static inline void vx_uninterruptible_inc(struct task_struct *p)
93 if ((vxi = p->vx_info))
94 atomic_inc(&vxi->cvirt.nr_uninterruptible);
97 static inline void vx_uninterruptible_dec(struct task_struct *p)
101 if ((vxi = p->vx_info))
102 atomic_dec(&vxi->cvirt.nr_uninterruptible);
108 #define VXF_FAKE_INIT (VXF_INFO_INIT|VXF_STATE_INIT)
111 int proc_pid_visible(struct task_struct *task, int pid)
114 !vx_flags(VXF_FAKE_INIT, VXF_FAKE_INIT))
115 /* show a blend through init */
117 if (vx_check(vx_task_xid(task), VX_WATCH|VX_IDENT))
125 struct task_struct *find_proc_task_by_pid(int pid)
127 struct task_struct *task = find_task_by_pid(pid);
129 if (task && !proc_pid_visible(task, pid)) {
130 vxdprintk(VXD_CBIT(misc, 6),
131 "dropping task %p[#%u,%u] for %p[#%u,%u]",
132 task, task->xid, task->pid,
133 current, current->xid, current->pid);
140 struct task_struct *vx_get_proc_task(struct inode *inode, struct pid *pid)
142 struct task_struct *task = get_pid_task(pid, PIDTYPE_PID);
144 if (task && !proc_pid_visible(task, pid->nr)) {
145 vxdprintk(VXD_CBIT(misc, 6),
146 "dropping task %p[#%u,%u] for %p[#%u,%u]",
147 task, task->xid, task->pid,
148 current, current->xid, current->pid);
149 put_task_struct(task);
156 #warning duplicate inclusion