Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 922c2ac8 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller
Browse files

ipv6: Take table lock outside of sernum update function



The next patch is going to allow dead routes to remain in the FIB tree
in certain situations.

When this happens we need to be sure to bump the sernum of the nodes
where these are stored so that potential copies cached in sockets are
invalidated.

The function that performs this update assumes the table lock is not
taken when it is invoked, but that will not be the case when it is
invoked by the tree walker.

Have the function assume the lock is taken and make the single caller
take the lock itself.

Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Acked-by: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4a8e56ee
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -107,16 +107,13 @@ enum {

void fib6_update_sernum(struct rt6_info *rt)
{
	struct fib6_table *table = rt->rt6i_table;
	struct net *net = dev_net(rt->dst.dev);
	struct fib6_node *fn;

	spin_lock_bh(&table->tb6_lock);
	fn = rcu_dereference_protected(rt->rt6i_node,
			lockdep_is_held(&table->tb6_lock));
			lockdep_is_held(&rt->rt6i_table->tb6_lock));
	if (fn)
		fn->fn_sernum = fib6_new_sernum(net);
	spin_unlock_bh(&table->tb6_lock);
}

/*
+2 −0
Original line number Diff line number Diff line
@@ -1353,7 +1353,9 @@ static int rt6_insert_exception(struct rt6_info *nrt,

	/* Update fn->fn_sernum to invalidate all cached dst */
	if (!err) {
		spin_lock_bh(&ort->rt6i_table->tb6_lock);
		fib6_update_sernum(ort);
		spin_unlock_bh(&ort->rt6i_table->tb6_lock);
		fib6_force_start_gc(net);
	}