diff -NurpP linux-2.6.17.8-vs2.1.1-rc29/kernel/vserver/context.c linux-2.6.17.8-vs2.1.1-rc29.1.1/kernel/vserver/context.c --- linux-2.6.17.8-vs2.1.1-rc29/kernel/vserver/context.c 2006-07-30 16:51:25 +0200 +++ linux-2.6.17.8-vs2.1.1-rc29.1.1/kernel/vserver/context.c 2006-08-17 21:40:46 +0200 @@ -843,11 +843,18 @@ int vc_ctx_create(uint32_t xid, void __u if ((vc_data.flagword & VXF_PERSISTENT)) vx_set_persistent(new_vxi); - vs_state_change(new_vxi, VSC_STARTUP); + ret = -ENOEXEC; + if (vs_state_change(new_vxi, VSC_STARTUP)) + goto out_unhash; ret = vx_migrate_task(current, new_vxi); - /* if this fails, we might end up with a hashed vx_info */ - if (ret == 0) + if (!ret) { + /* return context id on success */ ret = new_vxi->vx_id; + goto out; + } +out_unhash: + __unhash_vx_info(new_vxi); +out: put_vx_info(new_vxi); return ret; } diff -NurpP linux-2.6.17.8-vs2.1.1-rc29/kernel/vserver/helper.c linux-2.6.17.8-vs2.1.1-rc29.1.1/kernel/vserver/helper.c --- linux-2.6.17.8-vs2.1.1-rc29/kernel/vserver/helper.c 2006-07-09 17:07:14 +0200 +++ linux-2.6.17.8-vs2.1.1-rc29.1.1/kernel/vserver/helper.c 2006-08-17 21:19:38 +0200 @@ -167,8 +167,7 @@ long vs_state_change(struct vx_info *vxi return 0; } - do_vshelper(vshelper_path, argv, envp, 1); - return 0; + return do_vshelper(vshelper_path, argv, envp, 1); } @@ -204,7 +203,6 @@ long vs_net_change(struct nx_info *nxi, return 0; } - do_vshelper(vshelper_path, argv, envp, 1); - return 0; + return do_vshelper(vshelper_path, argv, envp, 1); }