diff -NurpP --minimal linux-2.6.13.3-vs2.1.0-rc4.1/include/linux/vs_base.h linux-2.6.13.3-vs2.1.0-rc4.2/include/linux/vs_base.h --- linux-2.6.13.3-vs2.1.0-rc4.1/include/linux/vs_base.h 2005-10-05 04:06:44 +0200 +++ linux-2.6.13.3-vs2.1.0-rc4.2/include/linux/vs_base.h 2005-10-24 17:07:13 +0200 @@ -16,7 +16,7 @@ /* * check current context for ADMIN/WATCH and - * optionally agains supplied argument + * optionally against supplied argument */ static inline int __vx_check(xid_t cid, xid_t id, unsigned int mode) { diff -NurpP --minimal linux-2.6.13.3-vs2.1.0-rc4.1/include/linux/vs_network.h linux-2.6.13.3-vs2.1.0-rc4.2/include/linux/vs_network.h --- linux-2.6.13.3-vs2.1.0-rc4.1/include/linux/vs_network.h 2005-10-07 04:08:51 +0200 +++ linux-2.6.13.3-vs2.1.0-rc4.2/include/linux/vs_network.h 2005-10-24 17:07:19 +0200 @@ -160,6 +160,32 @@ static __inline__ struct nx_info *__task #define nx_weak_check(c,m) ((m) ? nx_check(c,m) : 1) +/* + * check current context for ADMIN/WATCH and + * optionally against supplied argument + */ +static inline int __nx_check(nid_t cid, nid_t id, unsigned int mode) +{ + if (mode & NX_ARG_MASK) { + if ((mode & NX_IDENT) && + (id == cid)) + return 1; + } + if (mode & NX_ATR_MASK) { + if ((mode & NX_DYNAMIC) && + (id >= MIN_D_CONTEXT) && + (id <= MAX_S_CONTEXT)) + return 1; + if ((mode & NX_STATIC) && + (id > 1) && (id < MIN_D_CONTEXT)) + return 1; + } + return (((mode & NX_ADMIN) && (cid == 0)) || + ((mode & NX_WATCH) && (cid == 1)) || + ((mode & NX_HOSTID) && (id == 0))); +} + + #define __nx_state(v) ((v) ? ((v)->nx_state) : 0) #define nx_info_state(v,m) (__nx_state(v) & (m)) diff -NurpP --minimal linux-2.6.13.3-vs2.1.0-rc4.1/include/linux/vserver/network.h linux-2.6.13.3-vs2.1.0-rc4.2/include/linux/vserver/network.h --- linux-2.6.13.3-vs2.1.0-rc4.1/include/linux/vserver/network.h 2005-10-05 04:06:44 +0200 +++ linux-2.6.13.3-vs2.1.0-rc4.2/include/linux/vserver/network.h 2005-10-24 17:11:47 +0200 @@ -70,6 +70,25 @@ struct nx_info { #define NXS_SHUTDOWN 0x0100 #define NXS_RELEASED 0x8000 +/* check conditions */ + +#define NX_ADMIN 0x0001 +#define NX_WATCH 0x0002 +#define NX_HOSTID 0x0008 + +#define NX_IDENT 0x0010 +#define NX_EQUIV 0x0020 +#define NX_PARENT 0x0040 +#define NX_CHILD 0x0080 + +#define NX_ARG_MASK 0x00F0 + +#define NX_DYNAMIC 0x0100 +#define NX_STATIC 0x0200 + +#define NX_ATR_MASK 0x0F00 + + extern struct nx_info *lookup_nx_info(int); extern int get_nid_list(int, unsigned int *, int); diff -NurpP --minimal linux-2.6.13.3-vs2.1.0-rc4.1/kernel/vserver/context.c linux-2.6.13.3-vs2.1.0-rc4.2/kernel/vserver/context.c --- linux-2.6.13.3-vs2.1.0-rc4.1/kernel/vserver/context.c 2005-10-08 04:26:21 +0200 +++ linux-2.6.13.3-vs2.1.0-rc4.2/kernel/vserver/context.c 2005-10-24 22:24:44 +0200 @@ -458,10 +458,23 @@ struct vx_info *lookup_or_create_vx_info #ifdef CONFIG_PROC_FS +/* get_xid_list() + + * get a subset of hashed xids for proc + * assumes size is at least one */ + int get_xid_list(int index, unsigned int *xids, int size) { int hindex, nr_xids = 0; + /* only show current and children */ + if (!vx_check(0, VX_ADMIN|VX_WATCH)) { + if (index > 0) + return 0; + xids[nr_xids] = vx_current_xid(); + return 1; + } + for (hindex = 0; hindex < VX_HASH_SIZE; hindex++) { struct hlist_head *head = &vx_info_hash[hindex]; struct hlist_node *pos; diff -NurpP --minimal linux-2.6.13.3-vs2.1.0-rc4.1/kernel/vserver/network.c linux-2.6.13.3-vs2.1.0-rc4.2/kernel/vserver/network.c --- linux-2.6.13.3-vs2.1.0-rc4.1/kernel/vserver/network.c 2005-10-05 04:06:45 +0200 +++ linux-2.6.13.3-vs2.1.0-rc4.2/kernel/vserver/network.c 2005-10-24 22:32:01 +0200 @@ -318,10 +318,23 @@ int nid_is_hashed(nid_t nid) #ifdef CONFIG_PROC_FS +/* get_nid_list() + + * get a subset of hashed nids for proc + * assumes size is at least one */ + int get_nid_list(int index, unsigned int *nids, int size) { int hindex, nr_nids = 0; + /* only show current and children */ + if (!nx_check(0, VX_ADMIN|VX_WATCH)) { + if (index > 0) + return 0; + nids[nr_nids] = nx_current_nid(); + return 1; + } + for (hindex = 0; hindex < NX_HASH_SIZE; hindex++) { struct hlist_head *head = &nx_info_hash[hindex]; struct hlist_node *pos; diff -NurpP --minimal linux-2.6.13.3-vs2.1.0-rc4.1/kernel/vserver/proc.c linux-2.6.13.3-vs2.1.0-rc4.2/kernel/vserver/proc.c --- linux-2.6.13.3-vs2.1.0-rc4.1/kernel/vserver/proc.c 2005-10-05 04:06:45 +0200 +++ linux-2.6.13.3-vs2.1.0-rc4.2/kernel/vserver/proc.c 2005-10-24 19:29:27 +0200 @@ -561,6 +561,7 @@ struct dentry *proc_virtual_lookup(struc len = dentry->d_name.len; ret = -ENOMEM; +#if 0 if (len == 7 && !memcmp(name, "current", 7)) { inode = new_inode(dir->i_sb); if (!inode) @@ -573,6 +574,7 @@ struct dentry *proc_virtual_lookup(struc d_add(dentry, inode); return NULL; } +#endif if (len == 4 && !memcmp(name, "info", 4)) { inode = proc_vid_make_inode(dir->i_sb, 0, PROC_XID_INFO); if (!inode) @@ -637,6 +639,7 @@ struct dentry *proc_vnet_lookup(struct i name = dentry->d_name.name; len = dentry->d_name.len; ret = -ENOMEM; +#if 0 if (len == 7 && !memcmp(name, "current", 7)) { inode = new_inode(dir->i_sb); if (!inode) @@ -649,6 +652,7 @@ struct dentry *proc_vnet_lookup(struct i d_add(dentry, inode); return NULL; } +#endif if (len == 4 && !memcmp(name, "info", 4)) { inode = proc_vid_make_inode(dir->i_sb, 0, PROC_NID_INFO); if (!inode) @@ -704,6 +708,7 @@ int proc_virtual_readdir(struct file * f char buf[PROC_NUMBUF]; unsigned int nr = filp->f_pos-3; unsigned int nr_xids, i; + int visible = vx_check(0, VX_ADMIN|VX_WATCH); ino_t ino; switch ((long)filp->f_pos) { @@ -722,19 +727,22 @@ int proc_virtual_readdir(struct file * f filp->f_pos++; /* fall through */ case 2: - ino = fake_ino(0, PROC_XID_INFO); - if (filldir(dirent, "info", 4, - filp->f_pos, ino, DT_LNK) < 0) - return 0; + if (visible) { + ino = fake_ino(0, PROC_XID_INFO); + if (filldir(dirent, "info", 4, + filp->f_pos, ino, DT_REG) < 0) + return 0; + } filp->f_pos++; /* fall through */ case 3: ino = fake_ino(0, PROC_XID_STATUS); if (filldir(dirent, "status", 6, - filp->f_pos, ino, DT_LNK) < 0) + filp->f_pos, ino, DT_REG) < 0) return 0; filp->f_pos++; /* fall through */ +#if 0 case 4: if (vx_current_xid() > 1) { ino = fake_ino(1, PROC_XID_INO); @@ -743,6 +751,7 @@ int proc_virtual_readdir(struct file * f return 0; } filp->f_pos++; +#endif } nr_xids = get_xid_list(nr, xid_array, PROC_MAXVIDS); @@ -779,6 +788,7 @@ int proc_vnet_readdir(struct file * filp char buf[PROC_NUMBUF]; unsigned int nr = filp->f_pos-3; unsigned int nr_nids, i; +// int visible = vx_check(0, VX_ADMIN|VX_WATCH); ino_t ino; switch ((long)filp->f_pos) { @@ -799,10 +809,11 @@ int proc_vnet_readdir(struct file * filp case 2: ino = fake_ino(0, PROC_NID_INFO); if (filldir(dirent, "info", 4, - filp->f_pos, ino, DT_LNK) < 0) + filp->f_pos, ino, DT_REG) < 0) return 0; filp->f_pos++; /* fall through */ +#if 0 case 3: if (vx_current_xid() > 1) { ino = fake_ino(1, PROC_NID_INO); @@ -811,6 +822,7 @@ int proc_vnet_readdir(struct file * filp return 0; } filp->f_pos++; +#endif } nr_nids = get_nid_list(nr, nid_array, PROC_MAXVIDS);