carp patch - will this ever be in releng_6?
Stefan Lambrev
stefan.lambrev at sun-fish.com
Sat May 19 13:35:52 UTC 2007
Hi,
Bruce M. Simpson wrote:
> Stefan Lambrev wrote:
>>
>> Are there any chances for this:
>> http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet/ip_carp.c.diff?r1=1.46;r2=1.47
>>
>> to be MFCed to RELENG_6 before 6.3-release ?
>>
>> It fixes quite annoying bug - destroying carpX (when having at least
>> 2 carp interfaces) will panic immediately.
>> This bugfix is from 3+ months ago.
>>
> Sadly it is unlikely the failure condition you describe will be fixed
> in -STABLE, as resolving it requires far more work to be merged than
> the link to the diff you post above.
The attached patch worked for me - it is based on the posted URL.
At least I didn't notice bad effects and it fixes the bug.
--
Best Wishes,
Stefan Lambrev
ICQ# 24134177
-------------- next part --------------
--- src/sys/netinet/ip_carp.c.orig Thu Feb 1 18:53:55 2007
+++ src/sys/netinet/ip_carp.c Tue Feb 6 18:41:24 2007
@@ -191,7 +191,7 @@
static void carp_input_c(struct mbuf *, struct carp_header *, sa_family_t);
static int carp_clone_create(struct if_clone *, int);
static void carp_clone_destroy(struct ifnet *);
-static void carpdetach(struct carp_softc *);
+static void carpdetach(struct carp_softc *, int);
static int carp_prepare_ad(struct mbuf *, struct carp_softc *,
struct carp_header *);
static void carp_send_ad_all(void);
@@ -406,9 +406,7 @@
if (sc->sc_carpdev)
CARP_SCLOCK(sc);
- carpdetach(sc);
- if (sc->sc_carpdev)
- CARP_SCUNLOCK(sc);
+ carpdetach(sc, 1); /* Returns unlocked. */
mtx_lock(&carp_mtx);
LIST_REMOVE(sc, sc_next);
@@ -420,7 +418,7 @@
}
static void
-carpdetach(struct carp_softc *sc)
+carpdetach(struct carp_softc *sc, int unlock)
{
struct carp_if *cif;
@@ -450,9 +448,10 @@
sc->sc_carpdev->if_carp = NULL;
CARP_LOCK_DESTROY(cif);
FREE(cif, M_IFADDR);
- }
+ } else if (unlock)
+ CARP_UNLOCK(cif);
+ sc->sc_carpdev = NULL;
}
- sc->sc_carpdev = NULL;
}
/* Detach an interface from the carp. */
@@ -471,7 +470,7 @@
CARP_LOCK(cif);
for (sc = TAILQ_FIRST(&cif->vhif_vrs); sc; sc = nextsc) {
nextsc = TAILQ_NEXT(sc, sc_list);
- carpdetach(sc);
+ carpdetach(sc, 0);
}
}
More information about the freebsd-stable
mailing list