diff -NurpP --minimal a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c --- a/drivers/block/ll_rw_blk.c 2005-04-02 03:01:58.000000000 +0200 +++ b/drivers/block/ll_rw_blk.c 2005-04-02 07:08:31.000000000 +0200 @@ -3148,7 +3148,7 @@ struct io_context *get_io_context(int gf ret->aic = NULL; ret->cic = NULL; spin_lock_init(&ret->lock); - set_vx_info(&ret->vx_info, current->vx_info); + init_vx_info(&ret->vx_info, current->vx_info); local_irq_save(flags); diff -NurpP --minimal a/include/linux/vs_context.h b/include/linux/vs_context.h --- a/include/linux/vs_context.h 2005-04-02 03:01:59.000000000 +0200 +++ b/include/linux/vs_context.h 2005-04-02 07:10:31.000000000 +0200 @@ -42,6 +42,25 @@ static inline void __put_vx_info(struct } +#define init_vx_info(p,i) __init_vx_info(p,i,__FILE__,__LINE__) + +static inline void __init_vx_info(struct vx_info **vxp, struct vx_info *vxi, + const char *_file, int _line) +{ + if (!vxi) + return; + + vxlprintk(VXD_CBIT(xid, 3), "init_vx_info(%p[#%d.%d])", + vxi, vxi?vxi->vx_id:0, + vxi?atomic_read(&vxi->vx_usecnt):0, + _file, _line); + vxh_init_vx_info(vxi, vxp); + + atomic_inc(&vxi->vx_usecnt); + *vxp = vxi; +} + + #define set_vx_info(p,i) __set_vx_info(p,i,__FILE__,__LINE__) static inline void __set_vx_info(struct vx_info **vxp, struct vx_info *vxi, diff -NurpP --minimal a/include/linux/vserver/debug.h b/include/linux/vserver/debug.h --- a/include/linux/vserver/debug.h 2005-04-02 03:01:59.000000000 +0200 +++ b/include/linux/vserver/debug.h 2005-04-02 07:11:46.000000000 +0200 @@ -105,6 +105,7 @@ enum { VXH_GET_VX_INFO, VXH_PUT_VX_INFO, + VXH_INIT_VX_INFO, VXH_SET_VX_INFO, VXH_CLR_VX_INFO, VXH_CLAIM_VX_INFO, @@ -183,6 +184,18 @@ static inline void vxh_put_vx_info(struc preempt_enable(); } +static inline void vxh_init_vx_info(struct vx_info *vxi, void *data) +{ + struct _vx_hist_entry *entry; + + preempt_disable(); + entry = vxh_advance(VXH_HERE()); + __vxh_copy_vxi(entry, vxi); + entry->sc.data = data; + entry->type = VXH_INIT_VX_INFO; + preempt_enable(); +} + static inline void vxh_set_vx_info(struct vx_info *vxi, void *data) { struct _vx_hist_entry *entry; @@ -321,6 +334,7 @@ extern void vxh_dump_history(void); #define vxh_get_vx_info(v) do { } while (0) #define vxh_put_vx_info(v) do { } while (0) +#define vxh_init_vx_info(v,d) do { } while (0) #define vxh_set_vx_info(v,d) do { } while (0) #define vxh_clr_vx_info(v,d) do { } while (0) diff -NurpP --minimal a/kernel/fork.c b/kernel/fork.c --- a/kernel/fork.c 2005-04-02 03:02:00.000000000 +0200 +++ b/kernel/fork.c 2005-04-02 07:18:53.000000000 +0200 @@ -833,8 +833,7 @@ static task_t *copy_process(unsigned lon if (!p) goto fork_out; - p->vx_info = NULL; - set_vx_info(&p->vx_info, current->vx_info); + init_vx_info(&p->vx_info, current->vx_info); p->nx_info = NULL; set_nx_info(&p->nx_info, current->nx_info); diff -NurpP --minimal a/kernel/vserver/history.c b/kernel/vserver/history.c --- a/kernel/vserver/history.c 2005-04-02 03:02:00.000000000 +0200 +++ b/kernel/vserver/history.c 2005-04-02 07:14:56.000000000 +0200 @@ -91,11 +91,13 @@ void vxh_dump_entry(struct _vx_hist_entr VXH_VXI_ARGS(e)); break; + case VXH_INIT_VX_INFO: case VXH_SET_VX_INFO: case VXH_CLR_VX_INFO: printk( VXH_LOC_FMTS " %s_vx_info " VXH_VXI_FMTS " @%p\n", VXH_LOC_ARGS(e), - (e->type==VXH_SET_VX_INFO)?"set":"clr", + (e->type==VXH_INIT_VX_INFO)?"init": + ((e->type==VXH_SET_VX_INFO)?"set":"clr"), VXH_VXI_ARGS(e), e->sc.data); break;