diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/fs/xfs/quota/xfs_qm_syscalls.c linux-2.6.16-rc5-vs2.0.2-rc10.x/fs/xfs/quota/xfs_qm_syscalls.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/fs/xfs/quota/xfs_qm_syscalls.c 2006-02-15 13:54:25 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/fs/xfs/quota/xfs_qm_syscalls.c 2006-03-10 22:11:58 +0100 @@ -215,7 +215,7 @@ xfs_qm_scall_quotaoff( xfs_qoff_logitem_t *qoffstart; int nculprits; - if (!force && !capable(CAP_SYS_ADMIN)) + if (!force && !capable(CAP_SYS_ADMIN) && !vx_ccaps(VXC_QUOTA_CTL)) return XFS_ERROR(EPERM); /* * No file system can have quotas enabled on disk but not in core. @@ -384,7 +384,7 @@ xfs_qm_scall_trunc_qfiles( int error; xfs_inode_t *qip; - if (!capable(CAP_SYS_ADMIN)) + if (!capable(CAP_SYS_ADMIN) && !vx_ccaps(VXC_QUOTA_CTL)) return XFS_ERROR(EPERM); error = 0; if (!XFS_SB_VERSION_HASQUOTA(&mp->m_sb) || flags == 0) { @@ -429,7 +429,7 @@ xfs_qm_scall_quotaon( uint accflags; __int64_t sbflags; - if (!capable(CAP_SYS_ADMIN)) + if (!capable(CAP_SYS_ADMIN) && !vx_ccaps(VXC_QUOTA_CTL)) return XFS_ERROR(EPERM); flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD); @@ -600,7 +600,7 @@ xfs_qm_scall_setqlim( int error; xfs_qcnt_t hard, soft; - if (!capable(CAP_SYS_ADMIN)) + if (!capable(CAP_SYS_ADMIN) && !vx_ccaps(VXC_QUOTA_CTL)) return XFS_ERROR(EPERM); if ((newlim->d_fieldmask & diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/include/linux/vs_base.h linux-2.6.16-rc5-vs2.0.2-rc10.x/include/linux/vs_base.h --- linux-2.6.16-rc5-vs2.0.2-rc10.2/include/linux/vs_base.h 2006-02-17 22:18:51 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/include/linux/vs_base.h 2006-03-10 22:11:58 +0100 @@ -15,7 +15,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.16-rc5-vs2.0.2-rc10.2/kernel/Makefile linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/Makefile --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/Makefile 2006-02-17 22:18:51 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/Makefile 2006-03-10 22:11:58 +0100 @@ -10,8 +10,7 @@ obj-y = sched.o fork.o exec_domain.o kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ hrtimer.o -subdir-y += vserver -obj-y += vserver/vserver.o +obj-y += vserver/ obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o obj-$(CONFIG_FUTEX) += futex.o diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/cvirt_init.h linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/cvirt_init.h --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/cvirt_init.h 2006-02-17 22:18:51 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/cvirt_init.h 2006-03-10 22:11:58 +0100 @@ -33,8 +33,8 @@ static inline void vx_info_init_cvirt(st cvirt->load[0] = 0; cvirt->load[1] = 0; cvirt->load[2] = 0; - atomic_set(&cvirt->total_forks, 0); + spin_lock_init(&cvirt->syslog.logbuf_lock); init_waitqueue_head(&cvirt->syslog.log_wait); cvirt->syslog.log_start = 0; diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/namespace.c linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/namespace.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/namespace.c 2006-02-17 22:18:51 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/namespace.c 2006-03-10 22:11:58 +0100 @@ -102,11 +102,11 @@ int vc_set_namespace(uint32_t id, void _ struct vx_info *vxi; int ret; - if (vx_check(0, VX_ADMIN|VX_WATCH)) - return -ENOSYS; + vxi = lookup_vx_info(id); + if (!vxi) + return -ESRCH; task_lock(current); - vxi = get_vx_info(current->vx_info); fs = current->fs; atomic_inc(&fs->count); ns = current->namespace; diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/network.c linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/network.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/network.c 2006-02-18 19:45:38 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/network.c 2006-03-10 22:11:58 +0100 @@ -510,7 +521,7 @@ int vc_task_nid(uint32_t id, void __user read_unlock(&tasklist_lock); } else - nid = current->nid; + nid = nx_current_nid(); return nid; } diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/proc.c linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/proc.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/proc.c 2006-03-07 01:37:47 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/proc.c 2006-03-10 22:11:58 +0100 @@ -725,7 +725,7 @@ int proc_vnet_readdir(struct file * filp { unsigned int nid_array[PROC_MAXVIDS]; char buf[PROC_NUMBUF]; - unsigned int nr = filp->f_pos-3; + unsigned int nr = filp->f_pos-2; unsigned int nr_nids, i; ino_t ino; @@ -747,18 +747,10 @@ 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 */ - case 3: - if (vx_current_xid() > 1) { - ino = fake_ino(1, PROC_NID_INO); - if (filldir(dirent, "current", 7, - filp->f_pos, ino, DT_LNK) < 0) - return 0; - } - filp->f_pos++; } nr_nids = get_nid_list(nr, nid_array, PROC_MAXVIDS); @@ -820,18 +812,24 @@ int proc_pid_vx_info(struct task_struct char * orig = buffer; buffer += sprintf (buffer,"XID:\t%d\n", vx_task_xid(p)); + if (vx_flags(VXF_INFO_HIDE, 0)) + goto out; + vxi = task_get_vx_info(p); - if (vxi && !vx_flags(VXF_INFO_HIDE, 0)) { - buffer += sprintf (buffer,"BCaps:\t%016llx\n" - ,(unsigned long long)vxi->vx_bcaps); - buffer += sprintf (buffer,"CCaps:\t%016llx\n" - ,(unsigned long long)vxi->vx_ccaps); - buffer += sprintf (buffer,"CFlags:\t%016llx\n" - ,(unsigned long long)vxi->vx_flags); - buffer += sprintf (buffer,"CIPid:\t%d\n" - ,vxi->vx_initpid); - } + if (!vxi) + goto out_put; + + buffer += sprintf (buffer,"BCaps:\t%016llx\n" + ,(unsigned long long)vxi->vx_bcaps); + buffer += sprintf (buffer,"CCaps:\t%016llx\n" + ,(unsigned long long)vxi->vx_ccaps); + buffer += sprintf (buffer,"CFlags:\t%016llx\n" + ,(unsigned long long)vxi->vx_flags); + buffer += sprintf (buffer,"CIPid:\t%d\n" + ,vxi->vx_initpid); +out_put: put_vx_info(vxi); +out: return buffer - orig; } @@ -840,23 +838,27 @@ int proc_pid_nx_info(struct task_struct { struct nx_info *nxi; char * orig = buffer; + int i; buffer += sprintf (buffer,"NID:\t%d\n", nx_task_nid(p)); + if (vx_flags(VXF_INFO_HIDE, 0)) + goto out; nxi = task_get_nx_info(p); - if (nxi && !vx_flags(VXF_INFO_HIDE, 0)) { - int i; + if (!nxi) + goto out_put; - for (i=0; inbipv4; i++){ - buffer += sprintf (buffer, - "V4Root[%d]:\t%d.%d.%d.%d/%d.%d.%d.%d\n", i - ,NIPQUAD(nxi->ipv4[i]) - ,NIPQUAD(nxi->mask[i])); - } + for (i=0; inbipv4; i++){ buffer += sprintf (buffer, - "V4Root[bcast]:\t%d.%d.%d.%d\n" - ,NIPQUAD(nxi->v4_bcast)); + "V4Root[%d]:\t%d.%d.%d.%d/%d.%d.%d.%d\n", i + ,NIPQUAD(nxi->ipv4[i]) + ,NIPQUAD(nxi->mask[i])); } + buffer += sprintf (buffer, + "V4Root[bcast]:\t%d.%d.%d.%d\n" + ,NIPQUAD(nxi->v4_bcast)); +out_put: put_nx_info(nxi); +out: return buffer - orig; } diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/sysctl.c linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/sysctl.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/sysctl.c 2006-03-05 05:20:03 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/sysctl.c 2006-03-10 22:11:58 +0100 @@ -1,5 +1,5 @@ /* - * linux/kernel/sysctl.c + * kernel/vserver/sysctl.c * * Virtual Context Support * diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/vci_config.h linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/vci_config.h --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/vci_config.h 2006-02-17 22:18:51 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/vci_config.h 2006-03-10 22:12:22 +0100 @@ -2,9 +2,6 @@ #include -#include - - enum { VCI_KCBIT_LEGACY = 1, VCI_KCBIT_LEGACYNET, @@ -14,7 +11,7 @@ enum { VCI_KCBIT_HARDCPU, VCI_KCBIT_HARDCPU_IDLE, - VCI_KCBIT_LEGACY_VERSION, + VCI_KCBIT_LEGACY_VERSION = 15, VCI_KCBIT_DEBUG = 16, VCI_KCBIT_HISTORY = 20, diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/mm/page_alloc.c linux-2.6.16-rc5-vs2.0.2-rc10.x/mm/page_alloc.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/mm/page_alloc.c 2006-02-28 15:21:27 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/mm/page_alloc.c 2006-03-10 22:11:58 +0100 @@ -1368,6 +1368,8 @@ void si_meminfo_node(struct sysinfo *val val->totalhigh = pgdat->node_zones[ZONE_HIGHMEM].present_pages; val->freehigh = pgdat->node_zones[ZONE_HIGHMEM].free_pages; val->mem_unit = PAGE_SIZE; + if (vx_flags(VXF_VIRT_MEM, 0)) + vx_vsi_meminfo(val); } #endif diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/net/ipv4/raw.c linux-2.6.16-rc5-vs2.0.2-rc10.x/net/ipv4/raw.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/net/ipv4/raw.c 2006-02-17 22:18:51 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/net/ipv4/raw.c 2006-03-10 22:11:58 +0100 @@ -334,10 +334,11 @@ static int raw_send_hdrinc(struct sock * iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); } + err = -EPERM; if (!vx_check(0, VX_ADMIN) && !capable(CAP_NET_RAW) && (!addr_in_nx_info(sk->sk_nx_info, iph->saddr))) - goto error; + goto error_free; err = NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev, dst_output); @@ -350,6 +351,7 @@ out: error_fault: err = -EFAULT; +error_free: kfree_skb(skb); error: IP_INC_STATS(IPSTATS_MIB_OUTDISCARDS);