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