list:
      -
        name: peer-new
-       attribute-set: ovpn
+       attribute-set: ovpn-peer-new-input
 -      flags: [ admin-perm ]
 +      flags: [admin-perm]
        doc: Add a remote peer
        do:
          pre: ovpn-nl-pre-doit
              - peer
      -
        name: peer-set
-       attribute-set: ovpn
+       attribute-set: ovpn-peer-set-input
 -      flags: [ admin-perm ]
 +      flags: [admin-perm]
        doc: modify a remote peer
        do:
          pre: ovpn-nl-pre-doit
              - peer
      -
        name: peer-del
-       attribute-set: ovpn
+       attribute-set: ovpn-peer-del-input
 -      flags: [ admin-perm ]
 +      flags: [admin-perm]
        doc: Delete existing remote peer
        do:
          pre: ovpn-nl-pre-doit
              - keyconf
      -
        name: key-get
-       attribute-set: ovpn
+       attribute-set: ovpn-keyconf-get
 -      flags: [ admin-perm ]
 +      flags: [admin-perm]
        doc: Retrieve non-sensitive data about peer key and cipher
        do:
          pre: ovpn-nl-pre-doit
              - keyconf
      -
        name: key-swap
-       attribute-set: ovpn
+       attribute-set: ovpn-keyconf-swap-input
 -      flags: [ admin-perm ]
 +      flags: [admin-perm]
        doc: Swap primary and secondary session keys for a specific peer
        do:
          pre: ovpn-nl-pre-doit
        mcgrp: peers
      -
        name: key-del
-       attribute-set: ovpn
+       attribute-set: ovpn-keyconf-del-input
 -      flags: [ admin-perm ]
 +      flags: [admin-perm]
        doc: Delete cipher key for a specific peer
        do:
          pre: ovpn-nl-pre-doit
 
                        break;
                pmc_prev = pmc;
        }
 -      if (pmc) {
 -              if (pmc_prev)
 -                      rcu_assign_pointer(pmc_prev->next, pmc->next);
 -              else
 -                      rcu_assign_pointer(idev->mc_tomb, pmc->next);
 -      }
 -
 -      if (pmc) {
 -              im->idev = pmc->idev;
 -              if (im->mca_sfmode == MCAST_INCLUDE) {
 -                      tomb = rcu_replace_pointer(im->mca_tomb,
 -                                                 mc_dereference(pmc->mca_tomb, pmc->idev),
 -                                                 lockdep_is_held(&im->idev->mc_lock));
 -                      rcu_assign_pointer(pmc->mca_tomb, tomb);
 -
 -                      sources = rcu_replace_pointer(im->mca_sources,
 -                                                    mc_dereference(pmc->mca_sources, pmc->idev),
 -                                                    lockdep_is_held(&im->idev->mc_lock));
 -                      rcu_assign_pointer(pmc->mca_sources, sources);
 -                      for_each_psf_mclock(im, psf)
 -                              psf->sf_crcount = idev->mc_qrv;
 -              } else {
 -                      im->mca_crcount = idev->mc_qrv;
 -              }
 -              ip6_mc_clear_src(pmc);
 -              in6_dev_put(pmc->idev);
 -              kfree_rcu(pmc, rcu);
 +      if (!pmc)
 +              return;
 +      if (pmc_prev)
 +              rcu_assign_pointer(pmc_prev->next, pmc->next);
 +      else
 +              rcu_assign_pointer(idev->mc_tomb, pmc->next);
 +
 +      im->idev = pmc->idev;
 +      if (im->mca_sfmode == MCAST_INCLUDE) {
 +              tomb = rcu_replace_pointer(im->mca_tomb,
 +                                         mc_dereference(pmc->mca_tomb, pmc->idev),
 +                                         lockdep_is_held(&im->idev->mc_lock));
 +              rcu_assign_pointer(pmc->mca_tomb, tomb);
 +
 +              sources = rcu_replace_pointer(im->mca_sources,
 +                                            mc_dereference(pmc->mca_sources, pmc->idev),
 +                                            lockdep_is_held(&im->idev->mc_lock));
 +              rcu_assign_pointer(pmc->mca_sources, sources);
 +              for_each_psf_mclock(im, psf)
 +                      psf->sf_crcount = idev->mc_qrv;
 +      } else {
 +              im->mca_crcount = idev->mc_qrv;
        }
-       in6_dev_put(pmc->idev);
 +      ip6_mc_clear_src(pmc);
++      in6_dev_put(pmc->idev);
 +      kfree_rcu(pmc, rcu);
  }
  
 -/* called with mc_lock */
  static void mld_clear_delrec(struct inet6_dev *idev)
  {
        struct ifmcaddr6 *pmc, *nextpmc;