|
@@ -1623,15 +1623,15 @@ static int rt6_remove_exception_rt(struct rt6_info *rt)
|
|
|
static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
|
|
static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
|
|
|
{
|
|
{
|
|
|
struct rt6_exception_bucket *bucket;
|
|
struct rt6_exception_bucket *bucket;
|
|
|
- struct fib6_info *from = rt->from;
|
|
|
|
|
struct in6_addr *src_key = NULL;
|
|
struct in6_addr *src_key = NULL;
|
|
|
struct rt6_exception *rt6_ex;
|
|
struct rt6_exception *rt6_ex;
|
|
|
-
|
|
|
|
|
- if (!from ||
|
|
|
|
|
- !(rt->rt6i_flags & RTF_CACHE))
|
|
|
|
|
- return;
|
|
|
|
|
|
|
+ struct fib6_info *from;
|
|
|
|
|
|
|
|
rcu_read_lock();
|
|
rcu_read_lock();
|
|
|
|
|
+ from = rcu_dereference(rt->from);
|
|
|
|
|
+ if (!from || !(rt->rt6i_flags & RTF_CACHE))
|
|
|
|
|
+ goto unlock;
|
|
|
|
|
+
|
|
|
bucket = rcu_dereference(from->rt6i_exception_bucket);
|
|
bucket = rcu_dereference(from->rt6i_exception_bucket);
|
|
|
|
|
|
|
|
#ifdef CONFIG_IPV6_SUBTREES
|
|
#ifdef CONFIG_IPV6_SUBTREES
|
|
@@ -1650,6 +1650,7 @@ static void rt6_update_exception_stamp_rt(struct rt6_info *rt)
|
|
|
if (rt6_ex)
|
|
if (rt6_ex)
|
|
|
rt6_ex->stamp = jiffies;
|
|
rt6_ex->stamp = jiffies;
|
|
|
|
|
|
|
|
|
|
+unlock:
|
|
|
rcu_read_unlock();
|
|
rcu_read_unlock();
|
|
|
}
|
|
}
|
|
|
|
|
|