Fixes bug in filter rta copy-on-write.
Filters should try to copy-on-write just cached rtas.
This commit is contained in:
parent
46eb80d5d5
commit
db96fccb31
1 changed files with 4 additions and 7 deletions
|
@ -291,7 +291,6 @@ static struct rte **f_rte, *f_rte_old;
|
||||||
static struct linpool *f_pool;
|
static struct linpool *f_pool;
|
||||||
static struct ea_list **f_tmp_attrs;
|
static struct ea_list **f_tmp_attrs;
|
||||||
static int f_flags;
|
static int f_flags;
|
||||||
static rta *f_rta_copy;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* rta_cow - prepare rta for modification by filter
|
* rta_cow - prepare rta for modification by filter
|
||||||
|
@ -299,8 +298,8 @@ static rta *f_rta_copy;
|
||||||
static void
|
static void
|
||||||
rta_cow(void)
|
rta_cow(void)
|
||||||
{
|
{
|
||||||
if (!f_rta_copy) {
|
if ((*f_rte)->attrs->aflags & RTAF_CACHED) {
|
||||||
f_rta_copy = lp_alloc(f_pool, sizeof(rta));
|
rta *f_rta_copy = lp_alloc(f_pool, sizeof(rta));
|
||||||
memcpy(f_rta_copy, (*f_rte)->attrs, sizeof(rta));
|
memcpy(f_rta_copy, (*f_rte)->attrs, sizeof(rta));
|
||||||
f_rta_copy->aflags = 0;
|
f_rta_copy->aflags = 0;
|
||||||
*f_rte = rte_cow(*f_rte);
|
*f_rte = rte_cow(*f_rte);
|
||||||
|
@ -686,8 +685,8 @@ interpret(struct f_inst *what)
|
||||||
|
|
||||||
if (!(what->aux & EAF_TEMP) && (!(f_flags & FF_FORCE_TMPATTR))) {
|
if (!(what->aux & EAF_TEMP) && (!(f_flags & FF_FORCE_TMPATTR))) {
|
||||||
rta_cow();
|
rta_cow();
|
||||||
l->next = f_rta_copy->eattrs;
|
l->next = (*f_rte)->attrs->eattrs;
|
||||||
f_rta_copy->eattrs = l;
|
(*f_rte)->attrs->eattrs = l;
|
||||||
} else {
|
} else {
|
||||||
l->next = (*f_tmp_attrs);
|
l->next = (*f_tmp_attrs);
|
||||||
(*f_tmp_attrs) = l;
|
(*f_tmp_attrs) = l;
|
||||||
|
@ -946,7 +945,6 @@ f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struc
|
||||||
f_tmp_attrs = tmp_attrs;
|
f_tmp_attrs = tmp_attrs;
|
||||||
f_rte = rte;
|
f_rte = rte;
|
||||||
f_rte_old = *rte;
|
f_rte_old = *rte;
|
||||||
f_rta_copy = NULL;
|
|
||||||
f_pool = tmp_pool;
|
f_pool = tmp_pool;
|
||||||
inst = filter->root;
|
inst = filter->root;
|
||||||
res = interpret(inst);
|
res = interpret(inst);
|
||||||
|
@ -967,7 +965,6 @@ f_eval_int(struct f_inst *expr)
|
||||||
f_tmp_attrs = NULL;
|
f_tmp_attrs = NULL;
|
||||||
f_rte = NULL;
|
f_rte = NULL;
|
||||||
f_rte_old = NULL;
|
f_rte_old = NULL;
|
||||||
f_rta_copy = NULL;
|
|
||||||
f_pool = cfg_mem;
|
f_pool = cfg_mem;
|
||||||
res = interpret(expr);
|
res = interpret(expr);
|
||||||
if (res.type != T_INT)
|
if (res.type != T_INT)
|
||||||
|
|
Loading…
Reference in a new issue