diff -NurpP linux-2.6.17.8-vs2.1.1-rc29.1.3/kernel/vserver/network.c linux-2.6.17.8-vs2.1.1-rc29.1.4/kernel/vserver/network.c --- linux-2.6.17.8-vs2.1.1-rc29.1.3/kernel/vserver/network.c 2006-07-30 03:14:46 +0200 +++ linux-2.6.17.8-vs2.1.1-rc29.1.4/kernel/vserver/network.c 2006-08-19 01:45:50 +0200 @@ -587,10 +599,22 @@ int vc_net_create(uint32_t nid, void __u if ((vc_data.flagword & NXF_PERSISTENT)) nx_set_persistent(new_nxi); - vs_net_change(new_nxi, VSC_NETUP); - ret = new_nxi->nx_id; - nx_migrate_task(current, new_nxi); - /* if this fails, we might end up with a hashed nx_info */ + ret = -ENOEXEC; + if (vs_net_change(new_nxi, VSC_NETUP)) + goto out_unhash; + ret = nx_migrate_task(current, new_nxi); + if (!ret) { + /* return context id on success */ + ret = new_nxi->nx_id; + goto out; + } +out_unhash: + /* prepare for context disposal */ + new_nxi->nx_state |= NXS_SHUTDOWN; + if ((vc_data.flagword & NXF_PERSISTENT)) + nx_clear_persistent(new_nxi); + __unhash_nx_info(new_nxi); +out: put_nx_info(new_nxi); return ret; }