Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Feb 2021 15:21:05 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 4664afc05402 - stable/13 - iflib: Fix detach of pseudo interfaces
Message-ID:  <202102241521.11OFL5JM035989@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=4664afc05402abb8e572975ec65210bdcd8b2ea1

commit 4664afc05402abb8e572975ec65210bdcd8b2ea1
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2021-02-19 22:08:34 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2021-02-24 15:20:55 +0000

    iflib: Fix detach of pseudo interfaces
    
    In commit 38bfc6dee33b we added an IFDI_DETACH() call to
    iflib_pseudo_deregister() since it looked like it was missing.  One is
    present in the error-handling path of iflib_pseudo_register().  However,
    the detach actually comes from the DEVICE_DETACH() method for the
    above-mentioned device_t, so now we're calling IFDI_DETACH() twice when
    destroying a pseudo interface.
    
    Fix the problem by not calling IFDI_DETACH() from the device detach
    routine.  This way we can ensure that iflib de-initialization always
    happens in a consistent order.  It also ensures that you can't do silly
    things like "devctl detach <pseudo ifnet>", which would previously
    detach the driver without tearing down the corresponding ifnet.
    
    PR:             253541
    Reviewed by:    erj
    Fixes:          38bfc6dee33b
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D28774
    
    (cherry picked from commit 0f9544d03e89d180f94a7a84b110ec7d2b6c625a)
---
 sys/net/iflib_clone.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/sys/net/iflib_clone.c b/sys/net/iflib_clone.c
index dc4ccbee659f..975873c4a19c 100644
--- a/sys/net/iflib_clone.c
+++ b/sys/net/iflib_clone.c
@@ -81,13 +81,11 @@ int
 iflib_pseudo_detach(device_t dev)
 {
 	if_ctx_t ctx;
-	uint32_t ifc_flags;
 
 	ctx = device_get_softc(dev);
-	ifc_flags = iflib_get_flags(ctx);
-	if ((ifc_flags & IFC_INIT_DONE) == 0)
-		return (0);
-	return (IFDI_DETACH(ctx));
+	if ((iflib_get_flags(ctx) & IFC_IN_DETACH) == 0)
+		return (EBUSY);
+	return (0);
 }
 
 static device_t iflib_pseudodev;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202102241521.11OFL5JM035989>