diff -NurpP --minimal a/fs/locks.c b/fs/locks.c --- a/fs/locks.c 2007-10-02 00:54:44 +0200 +++ b/fs/locks.c 2007-09-30 15:04:12 +0200 @@ -805,7 +805,7 @@ find_conflict: if (request->fl_flags & FL_ACCESS) goto out; locks_copy_lock(new_fl, request); - locks_insert_lock(&inode->i_flock, new_fl); + locks_insert_lock(before, new_fl); vx_locks_inc(new_fl); new_fl = NULL; error = 0; diff -NurpP linux-2.6.22.6-vs2.3.0.24.3/kernel/fork.c linux-2.6.22.6-vs2.3.0.24.5/kernel/fork.c --- linux-2.6.22.6-vs2.3.0.24.3/kernel/fork.c 2007-09-20 19:33:22 +0200 +++ linux-2.6.22.6-vs2.3.0.24.5/kernel/fork.c 2007-09-29 19:48:50 +0200 @@ -336,7 +336,7 @@ static inline void mm_free_pgd(struct mm #include -static struct mm_struct * mm_init(struct mm_struct * mm) +static struct mm_struct * mm_init(struct mm_struct * mm, struct vx_info *vxi) { atomic_set(&mm->mm_users, 1); atomic_set(&mm->mm_count, 1); @@ -354,7 +354,7 @@ static struct mm_struct * mm_init(struct if (likely(!mm_alloc_pgd(mm))) { mm->def_flags = 0; - set_vx_info(&mm->mm_vx_info, current->vx_info); + set_vx_info(&mm->mm_vx_info, vxi); return mm; } free_mm(mm); @@ -364,7 +364,7 @@ static struct mm_struct * mm_init(struct mm = allocate_mm(); if (mm) { memset(mm, 0, sizeof(*mm)); - mm = mm_init(mm); + mm = mm_init(mm, current->vx_info); } return mm; } @@ -507,7 +507,7 @@ static struct mm_struct *dup_mm(struct t mm->token_priority = 0; mm->last_interval = 0; - if (!mm_init(mm)) + if (!mm_init(mm, oldmm->mm_vx_info)) goto fail_nomem; if (init_new_context(tsk, mm)) diff -NurpP --minimal a/kernel/vserver/context.c b/kernel/vserver/context.c --- a/kernel/vserver/context.c 2007-10-02 00:54:45 +0200 +++ b/kernel/vserver/context.c 2007-10-01 15:30:20 +0200 @@ -115,6 +115,8 @@ static struct vx_info *__alloc_vx_info(x new->reboot_cmd = 0; new->exit_code = 0; + new->vx_nsproxy = copy_nsproxy(current->nsproxy); + vxdprintk(VXD_CBIT(xid, 0), "alloc_vx_info(%d) = %p", xid, new); vxh_alloc_vx_info(new); diff -NurpP --minimal a/kernel/vserver/context.c b/kernel/vserver/context.c --- a/kernel/vserver/context.c 2007-10-02 00:54:45 +0200 +++ b/kernel/vserver/context.c 2007-10-01 15:30:20 +0200 @@ -187,14 +189,16 @@ void free_vx_info(struct vx_info *vxi) { unsigned long flags; - /* context shutdown is mandatory */ - BUG_ON(!vx_info_state(vxi, VXS_SHUTDOWN)); - + /* check for reference counts first */ BUG_ON(atomic_read(&vxi->vx_usecnt)); BUG_ON(atomic_read(&vxi->vx_tasks)); + /* context must not be hashed */ BUG_ON(vx_info_state(vxi, VXS_HASHED)); + /* context shutdown is mandatory */ + BUG_ON(!vx_info_state(vxi, VXS_SHUTDOWN)); + BUG_ON(vxi->vx_nsproxy); BUG_ON(vxi->vx_fs); diff -NurpP --minimal a/kernel/vserver/inet.c b/kernel/vserver/inet.c --- a/kernel/vserver/inet.c 2007-10-02 00:54:45 +0200 +++ b/kernel/vserver/inet.c 2007-10-01 13:10:13 +0200 @@ -1,8 +1,9 @@ +#include +#include +#include #include #include -#include -#include int nx_v4_addr_conflict(struct nx_info *nxi1, struct nx_info *nxi2) @@ -136,9 +137,13 @@ out: int ip_v4_find_src(struct nx_info *nxi, struct rtable **rp, struct flowi *fl) { - if (!nxi || !NX_IPV4(nxi)) + if (!nxi) return 0; + /* FIXME: handle lback only case */ + if (!NX_IPV4(nxi)) + return -EPERM; + vxdprintk(VXD_CBIT(net, 4), "ip_v4_find_src(%p[#%u]) " NIPQUAD_FMT " -> " NIPQUAD_FMT, nxi, nxi ? nxi->nx_id : 0, diff -NurpP --minimal a/kernel/vserver/proc.c b/kernel/vserver/proc.c --- a/kernel/vserver/proc.c 2007-10-02 00:54:45 +0200 +++ b/kernel/vserver/proc.c 2007-10-01 17:32:37 +0200 @@ -1051,7 +1051,7 @@ int proc_pid_nx_info(struct task_struct i, NXAV4(v4a)); skip_v4: #ifdef CONFIG_IPV6 - if (!NX_IPV4(nxi)) + if (!NX_IPV6(nxi)) goto skip_v6; for (i = 0, v6a = &nxi->v6; v6a; i++, v6a = v6a->next) buffer += sprintf(buffer, "V6Root[%d]:\t" NXAV6_FMT "\n", --- linux-2.6.22.9-vs2.3.0.25/fs/namei.c 2007-09-30 11:10:54.000000000 -0400 +++ linux-2.6.22.9-vs2.3.0.25/fs/namei.c 2007-09-30 11:48:07.000000000 -0400 @@ -2866,7 +2866,11 @@ retry: .ia_valid = ATTR_UID | ATTR_GID }; - inode_setattr(new_inode, &attr); + ret = inode_setattr(new_inode, &attr); + if (ret) { + res = ERR_PTR(ret); + goto out_fput_both; + } } ret = vfs_rename(dir_nd.dentry->d_inode, new_dentry,