On Mon, 2005-08-08 at 16:27 +0200, Balazs Scheidler wrote: > Is this tiny patchlet worth the trouble of changing > xfrm_init/xfrm_state_init to return int, and do error checking from > ip_rt_init() ?
I've attached a revised patch, this time with complete error checking, and propagating the error code to the caller. Please apply. Signed-off-by: Balazs Scheidler <[EMAIL PROTECTED]> --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -812,11 +812,11 @@ struct xfrm6_tunnel { int type, int code, int offset, __u32 info); }; -extern void xfrm_init(void); +extern int xfrm_init(void); extern void xfrm4_init(void); extern void xfrm6_init(void); extern void xfrm6_fini(void); -extern void xfrm_state_init(void); +extern int xfrm_state_init(void); extern void xfrm4_state_init(void); extern void xfrm6_state_init(void); extern void xfrm6_state_fini(void); --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -1338,10 +1338,17 @@ static void __init xfrm_policy_init(void register_netdevice_notifier(&xfrm_dev_notifier); } -void __init xfrm_init(void) +int __init xfrm_init(void) { - xfrm_state_init(); + int err; + + err = xfrm_state_init(); + if (err < 0) + return err; + xfrm_policy_init(); xfrm_input_init(); + + return 0; } diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -35,8 +35,8 @@ static DEFINE_SPINLOCK(xfrm_state_lock); * Main use is finding SA after policy selected tunnel or transport mode. * Also, it can be used by ah/esp icmp error handler to find offending SA. */ -static struct list_head xfrm_state_bydst[XFRM_DST_HSIZE]; -static struct list_head xfrm_state_byspi[XFRM_DST_HSIZE]; +static struct list_head *xfrm_state_bydst; +static struct list_head *xfrm_state_byspi; DECLARE_WAIT_QUEUE_HEAD(km_waitq); EXPORT_SYMBOL(km_waitq); @@ -1093,14 +1093,21 @@ error: EXPORT_SYMBOL(xfrm_init_state); -void __init xfrm_state_init(void) +int __init xfrm_state_init(void) { int i; + xfrm_state_bydst = (struct list_head *) __get_free_pages(GFP_KERNEL, get_order(sizeof(struct list_head) * XFRM_DST_HSIZE * 2)); + if (!xfrm_state_bydst) + return -ENOMEM; + + xfrm_state_byspi = &xfrm_state_bydst[XFRM_DST_HSIZE]; for (i=0; i<XFRM_DST_HSIZE; i++) { INIT_LIST_HEAD(&xfrm_state_bydst[i]); INIT_LIST_HEAD(&xfrm_state_byspi[i]); } INIT_WORK(&xfrm_state_gc_work, xfrm_state_gc_task, NULL); + + return 0; } -- Bazsi - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html