[XFRM]: fix softirq-unsafe xfrm typemap->lock use
xfrm typemap->lock may be used in softirq context, so all write_lock() uses must be softirq-safe. Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
a76e07acd0
commit
8dff7c2970
@@ -57,12 +57,12 @@ int xfrm_register_type(struct xfrm_type *type, unsigned short family)
|
|||||||
return -EAFNOSUPPORT;
|
return -EAFNOSUPPORT;
|
||||||
typemap = afinfo->type_map;
|
typemap = afinfo->type_map;
|
||||||
|
|
||||||
write_lock(&typemap->lock);
|
write_lock_bh(&typemap->lock);
|
||||||
if (likely(typemap->map[type->proto] == NULL))
|
if (likely(typemap->map[type->proto] == NULL))
|
||||||
typemap->map[type->proto] = type;
|
typemap->map[type->proto] = type;
|
||||||
else
|
else
|
||||||
err = -EEXIST;
|
err = -EEXIST;
|
||||||
write_unlock(&typemap->lock);
|
write_unlock_bh(&typemap->lock);
|
||||||
xfrm_policy_put_afinfo(afinfo);
|
xfrm_policy_put_afinfo(afinfo);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -78,12 +78,12 @@ int xfrm_unregister_type(struct xfrm_type *type, unsigned short family)
|
|||||||
return -EAFNOSUPPORT;
|
return -EAFNOSUPPORT;
|
||||||
typemap = afinfo->type_map;
|
typemap = afinfo->type_map;
|
||||||
|
|
||||||
write_lock(&typemap->lock);
|
write_lock_bh(&typemap->lock);
|
||||||
if (unlikely(typemap->map[type->proto] != type))
|
if (unlikely(typemap->map[type->proto] != type))
|
||||||
err = -ENOENT;
|
err = -ENOENT;
|
||||||
else
|
else
|
||||||
typemap->map[type->proto] = NULL;
|
typemap->map[type->proto] = NULL;
|
||||||
write_unlock(&typemap->lock);
|
write_unlock_bh(&typemap->lock);
|
||||||
xfrm_policy_put_afinfo(afinfo);
|
xfrm_policy_put_afinfo(afinfo);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user