|
@@ -1215,11 +1215,12 @@ out:
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-/* net->xfrm.xfrm_state_lock is held */
|
|
|
struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *net)
|
|
|
{
|
|
|
unsigned int h;
|
|
|
- struct xfrm_state *x;
|
|
|
+ struct xfrm_state *x = NULL;
|
|
|
+
|
|
|
+ spin_lock_bh(&net->xfrm.xfrm_state_lock);
|
|
|
|
|
|
if (m->reqid) {
|
|
|
h = xfrm_dst_hash(net, &m->old_daddr, &m->old_saddr,
|
|
@@ -1236,7 +1237,7 @@ struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *n
|
|
|
m->old_family))
|
|
|
continue;
|
|
|
xfrm_state_hold(x);
|
|
|
- return x;
|
|
|
+ break;
|
|
|
}
|
|
|
} else {
|
|
|
h = xfrm_src_hash(net, &m->old_daddr, &m->old_saddr,
|
|
@@ -1251,11 +1252,13 @@ struct xfrm_state *xfrm_migrate_state_find(struct xfrm_migrate *m, struct net *n
|
|
|
m->old_family))
|
|
|
continue;
|
|
|
xfrm_state_hold(x);
|
|
|
- return x;
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return NULL;
|
|
|
+ spin_unlock_bh(&net->xfrm.xfrm_state_lock);
|
|
|
+
|
|
|
+ return x;
|
|
|
}
|
|
|
EXPORT_SYMBOL(xfrm_migrate_state_find);
|
|
|
|