Print this page
XXXXX convert NLM's single-count semaphore to a mutex

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/klm/nlm_impl.c
          +++ new/usr/src/uts/common/klm/nlm_impl.c
↓ open down ↓ 855 lines elided ↑ open up ↑
 856  856          /*
 857  857           * Create an RPC handle that'll be used for communication with the
 858  858           * local statd using the address registration protocol.
 859  859           */
 860  860          error = clnt_tli_kcreate(&nsm->ns_knc, &nsm->ns_addr, NSM_ADDR_PROGRAM,
 861  861              NSM_ADDR_V1, 0, NLM_RPC_RETRIES, zone_kcred(),
 862  862              &nsm->ns_addr_handle);
 863  863          if (error != 0)
 864  864                  goto error;
 865  865  
 866      -        sema_init(&nsm->ns_sem, 1, NULL, SEMA_DEFAULT, NULL);
      866 +        mutex_init(&nsm->ns_lock, NULL, MUTEX_DEFAULT, NULL);
 867  867          return (0);
 868  868  
 869  869  error:
 870  870          kmem_free(nsm->ns_addr.buf, nsm->ns_addr.maxlen);
 871  871          if (nsm->ns_handle) {
 872  872                  ASSERT(nsm->ns_handle->cl_auth != NULL);
 873  873                  auth_destroy(nsm->ns_handle->cl_auth);
 874  874                  CLNT_DESTROY(nsm->ns_handle);
 875  875          }
 876  876  
↓ open down ↓ 5 lines elided ↑ open up ↑
 882  882  {
 883  883          kmem_free(nsm->ns_addr.buf, nsm->ns_addr.maxlen);
 884  884          if (nsm->ns_addr_handle->cl_auth != NULL)
 885  885                  auth_destroy(nsm->ns_addr_handle->cl_auth);
 886  886          CLNT_DESTROY(nsm->ns_addr_handle);
 887  887          nsm->ns_addr_handle = NULL;
 888  888          if (nsm->ns_handle->cl_auth != NULL)
 889  889                  auth_destroy(nsm->ns_handle->cl_auth);
 890  890          CLNT_DESTROY(nsm->ns_handle);
 891  891          nsm->ns_handle = NULL;
 892      -        sema_destroy(&nsm->ns_sem);
      892 +        mutex_destroy(&nsm->ns_lock);
 893  893  }
 894  894  
 895  895  static enum clnt_stat
 896  896  nlm_nsm_simu_crash(struct nlm_nsm *nsm)
 897  897  {
 898  898          enum clnt_stat stat;
 899  899  
 900      -        sema_p(&nsm->ns_sem);
      900 +        mutex_enter(&nsm->ns_lock);
 901  901          nlm_nsm_clnt_init(nsm->ns_handle, nsm);
 902  902          stat = sm_simu_crash_1(NULL, NULL, nsm->ns_handle);
 903      -        sema_v(&nsm->ns_sem);
      903 +        mutex_exit(&nsm->ns_lock);
 904  904  
 905  905          return (stat);
 906  906  }
 907  907  
 908  908  static enum clnt_stat
 909  909  nlm_nsm_stat(struct nlm_nsm *nsm, int32_t *out_stat)
 910  910  {
 911  911          struct sm_name args;
 912  912          struct sm_stat_res res;
 913  913          enum clnt_stat stat;
 914  914  
 915  915          args.mon_name = uts_nodename();
 916  916          bzero(&res, sizeof (res));
 917  917  
 918      -        sema_p(&nsm->ns_sem);
      918 +        mutex_enter(&nsm->ns_lock);
 919  919          nlm_nsm_clnt_init(nsm->ns_handle, nsm);
 920  920          stat = sm_stat_1(&args, &res, nsm->ns_handle);
 921      -        sema_v(&nsm->ns_sem);
      921 +        mutex_exit(&nsm->ns_lock);
 922  922  
 923  923          if (stat == RPC_SUCCESS)
 924  924                  *out_stat = res.state;
 925  925  
 926  926          return (stat);
 927  927  }
 928  928  
 929  929  static enum clnt_stat
 930  930  nlm_nsm_mon(struct nlm_nsm *nsm, char *hostname, uint16_t priv)
 931  931  {
↓ open down ↓ 4 lines elided ↑ open up ↑
 936  936          bzero(&args, sizeof (args));
 937  937          bzero(&res, sizeof (res));
 938  938  
 939  939          args.mon_id.mon_name = hostname;
 940  940          args.mon_id.my_id.my_name = uts_nodename();
 941  941          args.mon_id.my_id.my_prog = NLM_PROG;
 942  942          args.mon_id.my_id.my_vers = NLM_SM;
 943  943          args.mon_id.my_id.my_proc = NLM_SM_NOTIFY1;
 944  944          bcopy(&priv, args.priv, sizeof (priv));
 945  945  
 946      -        sema_p(&nsm->ns_sem);
      946 +        mutex_enter(&nsm->ns_lock);
 947  947          nlm_nsm_clnt_init(nsm->ns_handle, nsm);
 948  948          stat = sm_mon_1(&args, &res, nsm->ns_handle);
 949      -        sema_v(&nsm->ns_sem);
      949 +        mutex_exit(&nsm->ns_lock);
 950  950  
 951  951          return (stat);
 952  952  }
 953  953  
 954  954  static enum clnt_stat
 955  955  nlm_nsm_unmon(struct nlm_nsm *nsm, char *hostname)
 956  956  {
 957  957          struct mon_id args;
 958  958          struct sm_stat res;
 959  959          enum clnt_stat stat;
 960  960  
 961  961          bzero(&args, sizeof (args));
 962  962          bzero(&res, sizeof (res));
 963  963  
 964  964          args.mon_name = hostname;
 965  965          args.my_id.my_name = uts_nodename();
 966  966          args.my_id.my_prog = NLM_PROG;
 967  967          args.my_id.my_vers = NLM_SM;
 968  968          args.my_id.my_proc = NLM_SM_NOTIFY1;
 969  969  
 970      -        sema_p(&nsm->ns_sem);
      970 +        mutex_enter(&nsm->ns_lock);
 971  971          nlm_nsm_clnt_init(nsm->ns_handle, nsm);
 972  972          stat = sm_unmon_1(&args, &res, nsm->ns_handle);
 973      -        sema_v(&nsm->ns_sem);
      973 +        mutex_exit(&nsm->ns_lock);
 974  974  
 975  975          return (stat);
 976  976  }
 977  977  
 978  978  static enum clnt_stat
 979  979  nlm_nsmaddr_reg(struct nlm_nsm *nsm, char *name, int family, netobj *address)
 980  980  {
 981  981          struct reg1args args = { 0 };
 982  982          struct reg1res res = { 0 };
 983  983          enum clnt_stat stat;
 984  984  
 985  985          args.family = family;
 986  986          args.name = name;
 987  987          args.address = *address;
 988  988  
 989      -        sema_p(&nsm->ns_sem);
      989 +        mutex_enter(&nsm->ns_lock);
 990  990          nlm_nsm_clnt_init(nsm->ns_addr_handle, nsm);
 991  991          stat = nsmaddrproc1_reg_1(&args, &res, nsm->ns_addr_handle);
 992      -        sema_v(&nsm->ns_sem);
      992 +        mutex_exit(&nsm->ns_lock);
 993  993  
 994  994          return (stat);
 995  995  }
 996  996  
 997  997  /*
 998  998   * Get NLM vhold object corresponding to vnode "vp".
 999  999   * If no such object was found, create a new one.
1000 1000   *
1001 1001   * The purpose of this function is to associate vhold
1002 1002   * object with given vnode, so that:
↓ open down ↓ 1880 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX