Subject: [PATCH net-next] ipv6: fib6_rule_action_alt needs to return -EAGAIN

From: David Ahern <[email-masked]>
Date: Tue, 23 Apr 2019 18:06:30 -0700

From: David Ahern <[email-masked]>

fib rule actions should return -EAGAIN for the rules to continue to the
next one. A recent change overwrote err with the lookup always returning
0 (future change will make it more like IPv4) which means the rules
stopped at the first (e.g., local table lookup only). Catch and reset err
to -EAGAIN.

Fixes: effda4dd97e87 ("ipv6: Pass fib6_result to fib lookups")
Signed-off-by: David Ahern <[email-masked]>
---
 net/ipv6/fib6_rules.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c
index 40ca850d30c9..d7bc561721ad 100644
--- a/net/ipv6/fib6_rules.c
+++ b/net/ipv6/fib6_rules.c
@@ -163,7 +163,7 @@ static int fib6_rule_action_alt(struct fib_rule *rule, struct flowi *flp,
 	struct flowi6 *flp6 = &flp->u.ip6;
 	struct net *net = rule->fr_net;
 	struct fib6_table *table;
-	int err = -EAGAIN, *oif;
+	int err, *oif;
 	u32 tb_id;
 
 	switch (rule->action) {
@@ -188,6 +188,8 @@ static int fib6_rule_action_alt(struct fib_rule *rule, struct flowi *flp,
 	if (!err && res->f6i != net->ipv6.fib6_null_entry)
 		err = fib6_rule_saddr(net, rule, flags, flp6,
 				      res->nh->fib_nh_dev);
+	else
+		err = -EAGAIN;
 
 	return err;
 }
-- 
2.11.0