svn commit: r356536 - head/sys/net

Kyle Evans kevans at FreeBSD.org
Thu Jan 9 03:52:51 UTC 2020


Author: kevans
Date: Thu Jan  9 03:52:50 2020
New Revision: 356536
URL: https://svnweb.freebsd.org/changeset/base/356536

Log:
  if_vmove: return proper error status
  
  if_vmove can fail if it lost a race and the vnet's already been moved. The
  callers (and their callers) can generally cope with this, but right now
  success is assumed. Plumb out the ENOENT from if_detach_internal if it
  happens so that the error's properly reported to userland.
  
  Reviewed by:	bz, kp
  MFC after:	1 week
  Differential Revision:	https://reviews.freebsd.org/D22780

Modified:
  head/sys/net/if.c

Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c	Thu Jan  9 02:03:17 2020	(r356535)
+++ head/sys/net/if.c	Thu Jan  9 03:52:50 2020	(r356536)
@@ -274,7 +274,7 @@ static void	if_attach_internal(struct ifnet *, int, st
 static int	if_detach_internal(struct ifnet *, int, struct if_clone **);
 static void	if_siocaddmulti(void *, int);
 #ifdef VIMAGE
-static void	if_vmove(struct ifnet *, struct vnet *);
+static int	if_vmove(struct ifnet *, struct vnet *);
 #endif
 
 #ifdef INET6
@@ -1257,7 +1257,7 @@ finish_vnet_shutdown:
  * unused if_index in target vnet and calls if_grow() if necessary,
  * and finally find an unused if_xname for the target vnet.
  */
-static void
+static int
 if_vmove(struct ifnet *ifp, struct vnet *new_vnet)
 {
 	struct if_clone *ifc;
@@ -1283,7 +1283,7 @@ if_vmove(struct ifnet *ifp, struct vnet *new_vnet)
 	 */
 	rc = if_detach_internal(ifp, 1, &ifc);
 	if (rc != 0)
-		return;
+		return (rc);
 
 	/*
 	 * Unlink the ifnet from ifindex_table[] in current vnet, and shrink
@@ -1327,6 +1327,7 @@ if_vmove(struct ifnet *ifp, struct vnet *new_vnet)
 #endif
 
 	CURVNET_RESTORE();
+	return (0);
 }
 
 /*
@@ -1337,6 +1338,7 @@ if_vmove_loan(struct thread *td, struct ifnet *ifp, ch
 {
 	struct prison *pr;
 	struct ifnet *difp;
+	int error;
 
 	/* Try to find the prison within our visibility. */
 	sx_slock(&allprison_lock);
@@ -1372,13 +1374,14 @@ if_vmove_loan(struct thread *td, struct ifnet *ifp, ch
 	CURVNET_RESTORE();
 
 	/* Move the interface into the child jail/vnet. */
-	if_vmove(ifp, pr->pr_vnet);
+	error = if_vmove(ifp, pr->pr_vnet);
 
-	/* Report the new if_xname back to the userland. */
-	sprintf(ifname, "%s", ifp->if_xname);
+	/* Report the new if_xname back to the userland on success. */
+	if (error == 0)
+		sprintf(ifname, "%s", ifp->if_xname);
 
 	prison_free(pr);
-	return (0);
+	return (error);
 }
 
 static int
@@ -1387,6 +1390,7 @@ if_vmove_reclaim(struct thread *td, char *ifname, int 
 	struct prison *pr;
 	struct vnet *vnet_dst;
 	struct ifnet *ifp;
+	int error;
 
 	/* Try to find the prison within our visibility. */
 	sx_slock(&allprison_lock);
@@ -1422,14 +1426,15 @@ if_vmove_reclaim(struct thread *td, char *ifname, int 
 	}
 
 	/* Get interface back from child jail/vnet. */
-	if_vmove(ifp, vnet_dst);
+	error = if_vmove(ifp, vnet_dst);
 	CURVNET_RESTORE();
 
-	/* Report the new if_xname back to the userland. */
-	sprintf(ifname, "%s", ifp->if_xname);
+	/* Report the new if_xname back to the userland on success. */
+	if (error == 0)
+		sprintf(ifname, "%s", ifp->if_xname);
 
 	prison_free(pr);
-	return (0);
+	return (error);
 }
 #endif /* VIMAGE */
 


More information about the svn-src-head mailing list