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

Reply via email to