|
@@ -152,7 +152,8 @@ static void free_fib_info_rcu(struct rcu_head *head)
|
|
{
|
|
{
|
|
struct fib_info *fi = container_of(head, struct fib_info, rcu);
|
|
struct fib_info *fi = container_of(head, struct fib_info, rcu);
|
|
|
|
|
|
- kfree(fi->fib_metrics);
|
|
|
|
|
|
+ if (fi->fib_metrics != (u32 *) dst_default_metrics)
|
|
|
|
+ kfree(fi->fib_metrics);
|
|
kfree(fi);
|
|
kfree(fi);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -743,9 +744,12 @@ struct fib_info *fib_create_info(struct fib_config *cfg)
|
|
fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL);
|
|
fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL);
|
|
if (fi == NULL)
|
|
if (fi == NULL)
|
|
goto failure;
|
|
goto failure;
|
|
- fi->fib_metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
|
|
|
|
- if (!fi->fib_metrics)
|
|
|
|
- goto failure;
|
|
|
|
|
|
+ if (cfg->fc_mx) {
|
|
|
|
+ fi->fib_metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL);
|
|
|
|
+ if (!fi->fib_metrics)
|
|
|
|
+ goto failure;
|
|
|
|
+ } else
|
|
|
|
+ fi->fib_metrics = (u32 *) dst_default_metrics;
|
|
fib_info_cnt++;
|
|
fib_info_cnt++;
|
|
|
|
|
|
fi->fib_net = hold_net(net);
|
|
fi->fib_net = hold_net(net);
|