diff -NurpP --minimal linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/context.c linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/context.c --- linux-2.6.16-rc5-vs2.0.2-rc10.2/kernel/vserver/context.c 2006-02-17 22:18:51 +0100 +++ linux-2.6.16-rc5-vs2.0.2-rc10.x/kernel/vserver/context.c 2006-03-10 23:28:19 +0100 @@ -594,6 +617,19 @@ int vx_set_init(struct vx_info *vxi, str vxi->vx_initpid = 0; } +void vx_set_persistent(struct vx_info *vxi) +{ + vxdprintk(VXD_CBIT(xid, 6), + "vx_set_persistent(%p[#%d])", vxi, vxi->vx_id); + + if (vx_info_flags(vxi, VXF_PERSISTENT, 0)) { + get_vx_info(vxi); + claim_vx_info(vxi, current); + } else { + release_vx_info(vxi, current); + put_vx_info(vxi); + } +} /* task must be current or locked */ @@ -672,6 +737,10 @@ int vc_ctx_create(uint32_t xid, void __u /* initial flags */ new_vxi->vx_flags = vc_data.flagword; + /* get a reference for persistent contexts */ + if ((vc_data.flagword & VXF_PERSISTENT)) + vx_set_persistent(new_vxi); + vs_state_change(new_vxi, VSC_STARTUP); ret = new_vxi->vx_id; vx_migrate_task(current, new_vxi); @@ -746,6 +822,9 @@ int vc_set_cflags(uint32_t id, void __us vxi->vx_flags = vx_mask_flags(vxi->vx_flags, vc_data.flagword, mask); + if (trigger & VXF_PERSISTENT) + vx_set_persistent(vxi); + put_vx_info(vxi); return 0; } 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 @@ -487,6 +487,17 @@ int nx_addr_conflict(struct nx_info *nxi #endif /* CONFIG_INET */ +void nx_set_persistent(struct nx_info *nxi) +{ + if (nx_info_flags(nxi, NXF_PERSISTENT, 0)) { + get_nx_info(nxi); + claim_nx_info(nxi, current); + } else { + release_nx_info(nxi, current); + put_nx_info(nxi); + } +} + /* vserver syscall commands below here */ /* taks nid and nx_info functions */ @@ -563,6 +574,10 @@ int vc_net_create(uint32_t nid, void __u /* initial flags */ new_nxi->nx_flags = vc_data.flagword; + /* get a reference for persistent contexts */ + 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); @@ -713,6 +728,9 @@ int vc_set_nflags(uint32_t id, void __us nxi->nx_flags = vx_mask_flags(nxi->nx_flags, vc_data.flagword, mask); + if (trigger & NXF_PERSISTENT) + nx_set_persistent(nxi); + put_nx_info(nxi); return 0; }