A kernel warning inside __local_bh_enable_ip() was reported by people
running SELinux, this is caused due to some SELinux functions
(indirectly) call peernet2id() with IRQ disabled in process context,
when we re-enable BH with IRQ disabled kernel complains. Shut up this
warning by saving IRQ context in peernet2id(), BH is still implicitly
disabled.

Fixes: bc51dddf98c9 ("netns: avoid disabling irq for netns id")
Reported-by: Stephen Smalley <s...@tycho.nsa.gov>
Reported-by: Elad Raz <e...@eladraz.com>
Tested-by: Paul Moore <p...@paul-moore.com>
Signed-off-by: Cong Wang <xiyou.wangc...@gmail.com>
---
 net/core/net_namespace.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 989434f..17b52a2 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -230,11 +230,16 @@ int peernet2id_alloc(struct net *net, struct net *peer)
 /* This function returns, if assigned, the id of a peer netns. */
 int peernet2id(struct net *net, struct net *peer)
 {
+       unsigned long flags;
        int id;
 
-       spin_lock_bh(&net->nsid_lock);
+       /* This is ugly, technically we only need to disable BH, however some
+        * callers (indirectly) call this with IRQ disabled, which implies
+        * that we should save the IRQ context here.
+        */
+       spin_lock_irqsave(&net->nsid_lock, flags);
        id = __peernet2id(net, peer);
-       spin_unlock_bh(&net->nsid_lock);
+       spin_unlock_irqrestore(&net->nsid_lock, flags);
        return id;
 }
 EXPORT_SYMBOL(peernet2id);
-- 
2.1.0

Reply via email to