--- src/sys/kern/uipc_mbuf.c 2005/02/17 13:59:36 1.33 +++ src/sys/kern/uipc_mbuf.c 2005/02/20 00:20:43 1.34 @@ -1747,10 +1747,24 @@ m_dup_pkthdr(struct mbuf *to, const stru * * If a non-packet header is passed in, the original * mbuf (chain?) will be returned unharmed. + * + * m_defrag_nofree doesn't free the passed in mbuf. */ struct mbuf * m_defrag(struct mbuf *m0, int how) { + struct mbuf *m_new; + + if ((m_new = m_defrag_nofree(m0, how)) == NULL) + return (NULL); + if (m_new != m0) + m_freem(m0); + return (m_new); +} + +struct mbuf * +m_defrag_nofree(struct mbuf *m0, int how) +{ struct mbuf *m_new = NULL, *m_final = NULL; int progress = 0, length; @@ -1801,11 +1815,9 @@ m_defrag(struct mbuf *m0, int how) } if (m0->m_next == NULL) m_defraguseless++; - m_freem(m0); - m0 = m_final; m_defragpackets++; - m_defragbytes += m0->m_pkthdr.len; - return (m0); + m_defragbytes += m_final->m_pkthdr.len; + return (m_final); nospace: m_defragfailure++; if (m_new)