--- linux-2.6.19-vs2.1.x-t3/include/linux/vserver/context.h 2006-11-30 19:10:59 +0100 +++ linux-2.6.19-vs2.1.x-t3.1/include/linux/vserver/context.h 2006-12-04 04:39:31 +0100 @@ -163,7 +163,7 @@ extern struct vx_info *lookup_or_create_ extern int get_xid_list(int, unsigned int *, int); extern int xid_is_hashed(xid_t); -extern int vx_migrate_task(struct task_struct *, struct vx_info *); +extern int vx_migrate_task(struct task_struct *, struct vx_info *, int); extern long vs_state_change(struct vx_info *, unsigned int); --- linux-2.6.19-vs2.1.x-t3/kernel/vserver/context.c 2006-11-30 19:45:27 +0100 +++ linux-2.6.19-vs2.1.x-t3.1/kernel/vserver/context.c 2006-12-04 04:38:47 +0100 @@ -634,12 +634,19 @@ static int vx_openfd_task(struct task_st return total; } + +/* for *space compatibility */ + +int vx_set_namespace(struct vx_info *, unsigned long); +asmlinkage long sys_unshare(unsigned long); + /* * migrate task to new context * gets vxi, puts old_vxi on change + * optionally unshares namespaces (hack) */ -int vx_migrate_task(struct task_struct *p, struct vx_info *vxi) +int vx_migrate_task(struct task_struct *p, struct vx_info *vxi, int unshare) { struct vx_info *old_vxi; int ret = 0; @@ -695,6 +702,12 @@ int vx_migrate_task(struct task_struct * vx_mask_cap_bset(vxi, p); task_unlock(p); + + /* hack for *spaces to provide compatibility */ + if (unshare) { + ret = sys_unshare(CLONE_NEWUTS|CLONE_NEWIPC); + vx_set_namespace(vxi, 0); + } } out: put_vx_info(old_vxi); @@ -887,7 +900,7 @@ int vc_ctx_create(uint32_t xid, void __u ret = -ENOEXEC; if (vs_state_change(new_vxi, VSC_STARTUP)) goto out_unhash; - ret = vx_migrate_task(current, new_vxi); + ret = vx_migrate_task(current, new_vxi, (!data)); if (!ret) { /* return context id on success */ ret = new_vxi->vx_id; @@ -913,7 +926,7 @@ int vc_ctx_migrate(struct vx_info *vxi, if (data && copy_from_user (&vc_data, data, sizeof(vc_data))) return -EFAULT; - ret = vx_migrate_task(current, vxi); + ret = vx_migrate_task(current, vxi, 0); if (ret) return ret; if (vc_data.flagword & VXM_SET_INIT) --- linux-2.6.19-vs2.1.x-t3/kernel/vserver/legacy.c 2006-11-30 18:53:18 +0100 +++ linux-2.6.19-vs2.1.x-t3.1/kernel/vserver/legacy.c 2006-12-04 04:29:05 +0100 @@ -89,7 +89,7 @@ int vc_new_s_context(uint32_t ctx, void new_vxi->vx_flags &= ~VXF_STATE_SETUP; - ret = vx_migrate_task(current, new_vxi); + ret = vx_migrate_task(current, new_vxi, 1); if (ret == 0) { current->vx_info->vx_bcaps &= (~vc_data.remove_cap); new_vxi->vx_flags |= vc_data.flags;