Author: ae
Date: Sat Apr 12 02:05:31 2014
New Revision: 264364
URL: http://svnweb.freebsd.org/changeset/base/264364

Log:
  Properly release the in6_multi lock.
  
  MFC after:    1 week
  Sponsored by: Yandex LLC

Modified:
  head/sys/netinet6/in6_mcast.c

Modified: head/sys/netinet6/in6_mcast.c
==============================================================================
--- head/sys/netinet6/in6_mcast.c       Fri Apr 11 22:45:12 2014        
(r264363)
+++ head/sys/netinet6/in6_mcast.c       Sat Apr 12 02:05:31 2014        
(r264364)
@@ -1450,16 +1450,15 @@ in6p_block_unblock_source(struct inpcb *
 
        CTR1(KTR_MLD, "%s: merge inm state", __func__);
        error = in6m_merge(inm, imf);
-       if (error) {
+       if (error)
                CTR1(KTR_MLD, "%s: failed to merge inm state", __func__);
-               goto out_im6f_rollback;
+       else {
+               CTR1(KTR_MLD, "%s: doing mld downcall", __func__);
+               error = mld_change_state(inm, 0);
+               if (error)
+                       CTR1(KTR_MLD, "%s: failed mld downcall", __func__);
        }
 
-       CTR1(KTR_MLD, "%s: doing mld downcall", __func__);
-       error = mld_change_state(inm, 0);
-       if (error)
-               CTR1(KTR_MLD, "%s: failed mld downcall", __func__);
-
        IN6_MULTI_UNLOCK();
 
 out_im6f_rollback:
@@ -2044,29 +2043,27 @@ in6p_join_group(struct inpcb *inp, struc
        if (is_new) {
                error = in6_mc_join_locked(ifp, &gsa->sin6.sin6_addr, imf,
                    &inm, 0);
-               if (error)
+               if (error) {
+                       IN6_MULTI_UNLOCK();
                        goto out_im6o_free;
+               }
                imo->im6o_membership[idx] = inm;
        } else {
                CTR1(KTR_MLD, "%s: merge inm state", __func__);
                error = in6m_merge(inm, imf);
-               if (error) {
+               if (error)
                        CTR1(KTR_MLD, "%s: failed to merge inm state",
                            __func__);
-                       goto out_im6f_rollback;
-               }
-               CTR1(KTR_MLD, "%s: doing mld downcall", __func__);
-               error = mld_change_state(inm, 0);
-               if (error) {
-                       CTR1(KTR_MLD, "%s: failed mld downcall",
-                           __func__);
-                       goto out_im6f_rollback;
+               else {
+                       CTR1(KTR_MLD, "%s: doing mld downcall", __func__);
+                       error = mld_change_state(inm, 0);
+                       if (error)
+                               CTR1(KTR_MLD, "%s: failed mld downcall",
+                                   __func__);
                }
        }
 
        IN6_MULTI_UNLOCK();
-
-out_im6f_rollback:
        INP_WLOCK_ASSERT(inp);
        if (error) {
                im6f_rollback(imf);
@@ -2293,23 +2290,20 @@ in6p_leave_group(struct inpcb *inp, stru
        } else {
                CTR1(KTR_MLD, "%s: merge inm state", __func__);
                error = in6m_merge(inm, imf);
-               if (error) {
+               if (error)
                        CTR1(KTR_MLD, "%s: failed to merge inm state",
                            __func__);
-                       goto out_im6f_rollback;
-               }
-
-               CTR1(KTR_MLD, "%s: doing mld downcall", __func__);
-               error = mld_change_state(inm, 0);
-               if (error) {
-                       CTR1(KTR_MLD, "%s: failed mld downcall",
-                           __func__);
+               else {
+                       CTR1(KTR_MLD, "%s: doing mld downcall", __func__);
+                       error = mld_change_state(inm, 0);
+                       if (error)
+                               CTR1(KTR_MLD, "%s: failed mld downcall",
+                                   __func__);
                }
        }
 
        IN6_MULTI_UNLOCK();
 
-out_im6f_rollback:
        if (error)
                im6f_rollback(imf);
        else
@@ -2518,16 +2512,15 @@ in6p_set_source_filters(struct inpcb *in
         */
        CTR1(KTR_MLD, "%s: merge inm state", __func__);
        error = in6m_merge(inm, imf);
-       if (error) {
+       if (error)
                CTR1(KTR_MLD, "%s: failed to merge inm state", __func__);
-               goto out_im6f_rollback;
+       else {
+               CTR1(KTR_MLD, "%s: doing mld downcall", __func__);
+               error = mld_change_state(inm, 0);
+               if (error)
+                       CTR1(KTR_MLD, "%s: failed mld downcall", __func__);
        }
 
-       CTR1(KTR_MLD, "%s: doing mld downcall", __func__);
-       error = mld_change_state(inm, 0);
-       if (error)
-               CTR1(KTR_MLD, "%s: failed mld downcall", __func__);
-
        IN6_MULTI_UNLOCK();
 
 out_im6f_rollback:
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to