[RHEL7,COMMIT] net: Bring clearness to ve_netns deassignment

Submitted by Konstantin Khorenko on May 27, 2020, 11:34 a.m.

Details

Message ID 202005271134.04RBYrOd013779@finist-ce7.sw.ru
State New
Series "net: Bring clearness to ve_netns deassignment"
Headers show

Commit Message

Konstantin Khorenko May 27, 2020, 11:34 a.m.
The commit is pushed to "branch-rh7-3.10.0-1127.8.2.vz7.161.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-1127.8.2.vz7.161.2
------>
commit 30e99ad0b77d1a13b0e545cf14e4710edd1a5592
Author: Kirill Tkhai <ktkhai@virtuozzo.com>
Date:   Wed May 27 14:34:52 2020 +0300

    net: Bring clearness to ve_netns deassignment
    
    ve_netns is cleared in two places and this looks strange.
    ve_drop_context() puts net right before it clears ve_netns,
    so the probability of that cleanup_net() will be first is
    very small. So, let's just reorder lines in ve_drop_context(),
    and the situation (ve->ve_netns == net) in cleanup_net()
    will become impossible.
    
    Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 kernel/ve/ve.c           | 4 +++-
 net/core/net_namespace.c | 2 --
 2 files changed, 3 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index b423a96766794..f88452d0396d0 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -462,8 +462,10 @@  static void ve_grab_context(struct ve_struct *ve)
 static void ve_drop_context(struct ve_struct *ve)
 {
 	struct nsproxy *ve_ns = ve->ve_ns;
-	put_net(ve->ve_netns);
+	struct net *net = ve->ve_netns;
+
 	ve->ve_netns = NULL;
+	put_net(net);
 
 	/* Allows to dereference init_cred and init_task if ve_ns is set */
 	rcu_assign_pointer(ve->ve_ns, NULL);
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 3348f7c550e19..69893c8ae6a02 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -499,8 +499,6 @@  static void cleanup_net(struct work_struct *work)
 		struct ve_struct *ve = net->owner_ve;
 
 		atomic_inc(&ve->netns_avail_nr);
-		if (ve->ve_netns == net)
-			ve->ve_netns = NULL;
 		put_ve(ve);
 	}