Print this page
11083 support NFS server in zone
Portions contributed by: Dan Kruchinin <dan.kruchinin@nexenta.com>
Portions contributed by: Stepan Zastupov <stepan.zastupov@gmail.com>
Portions contributed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
Portions contributed by: Mike Zeller <mike@mikezeller.net>
Portions contributed by: Dan McDonald <danmcd@joyent.com>
Portions contributed by: Gordon Ross <gordon.w.ross@gmail.com>
Portions contributed by: Vitaliy Gusev <gusev.vitaliy@gmail.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Jason King <jbk@joyent.com>
Reviewed by: C Fraire <cfraire@me.com>
Change-Id: I22f289d357503f9b48a0bc2482cc4328a6d43d16
        
*** 16,30 ****
--- 16,35 ----
   * fields enclosed by brackets "[]" replaced with your own identifying
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
+ 
  /*
   * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
   * Use is subject to license terms.
   */
  
+ /*
+  * Copyright 2018 Nexenta Systems, Inc.
+  */
+ 
  #include <sys/param.h>
  #include <sys/types.h>
  #include <sys/pathname.h>
  #include <sys/errno.h>
  #include <sys/cmn_err.h>
*** 43,80 ****
  #ifdef nextdp
  #undef nextdp
  #endif
  #define nextdp(dp)      ((struct dirent64 *)((char *)(dp) + (dp)->d_reclen))
  
! kmutex_t        nfscmd_lock;
! door_handle_t   nfscmd_dh;
  
  static struct charset_cache *nfscmd_charmap(exportinfo_t *exi,
      struct sockaddr *sp);
  
- 
  void
  nfscmd_args(uint_t did)
  {
!         mutex_enter(&nfscmd_lock);
!         if (nfscmd_dh)
!                 door_ki_rele(nfscmd_dh);
!         nfscmd_dh = door_ki_lookup(did);
!         mutex_exit(&nfscmd_lock);
  }
  
  void
  nfscmd_init(void)
  {
!         mutex_init(&nfscmd_lock, NULL, MUTEX_DEFAULT, NULL);
  }
  
  void
  nfscmd_fini(void)
  {
  }
  
  /*
   * nfscmd_send(arg, result)
   *
   * Send a command to the daemon listening on the door. The result is
   * returned in the result pointer if the function return value is
--- 48,118 ----
  #ifdef nextdp
  #undef nextdp
  #endif
  #define nextdp(dp)      ((struct dirent64 *)((char *)(dp) + (dp)->d_reclen))
  
! typedef struct nfscmd_globals {
!         kmutex_t        nfscmd_lock;
!         door_handle_t   nfscmd_dh;
! } nfscmd_globals_t;
  
+ static zone_key_t nfscmd_zone_key;
+ 
  static struct charset_cache *nfscmd_charmap(exportinfo_t *exi,
      struct sockaddr *sp);
+ static void *nfscmd_zone_init(zoneid_t);
+ static void nfscmd_zone_fini(zoneid_t, void *);
  
  void
  nfscmd_args(uint_t did)
  {
!         nfscmd_globals_t *ncg = zone_getspecific(nfscmd_zone_key, curzone);
! 
!         mutex_enter(&ncg->nfscmd_lock);
!         if (ncg->nfscmd_dh != NULL)
!                 door_ki_rele(ncg->nfscmd_dh);
!         ncg->nfscmd_dh = door_ki_lookup(did);
!         mutex_exit(&ncg->nfscmd_lock);
  }
  
  void
  nfscmd_init(void)
  {
!         zone_key_create(&nfscmd_zone_key, nfscmd_zone_init,
!             NULL, nfscmd_zone_fini);
  }
  
  void
  nfscmd_fini(void)
  {
+         (void) zone_key_delete(nfscmd_zone_key);
  }
  
+ /*ARGSUSED*/
+ static void *
+ nfscmd_zone_init(zoneid_t zoneid)
+ {
+         nfscmd_globals_t *ncg;
+ 
+         ncg = kmem_zalloc(sizeof (*ncg), KM_SLEEP);
+         mutex_init(&ncg->nfscmd_lock, NULL, MUTEX_DEFAULT, NULL);
+ 
+         return (ncg);
+ }
+ 
+ /*ARGSUSED*/
+ static void
+ nfscmd_zone_fini(zoneid_t zoneid, void *data)
+ {
+         nfscmd_globals_t *ncg = data;
+ 
+         mutex_destroy(&ncg->nfscmd_lock);
+         if (ncg->nfscmd_dh)
+                 door_ki_rele(ncg->nfscmd_dh);
+         kmem_free(ncg, sizeof (*ncg));
+ }
+ 
  /*
   * nfscmd_send(arg, result)
   *
   * Send a command to the daemon listening on the door. The result is
   * returned in the result pointer if the function return value is
*** 86,102 ****
          door_handle_t   dh;
          door_arg_t      da;
          door_info_t     di;
          int             ntries = 0;
          int             last = 0;
  
  retry:
!         mutex_enter(&nfscmd_lock);
!         dh = nfscmd_dh;
          if (dh != NULL)
                  door_ki_hold(dh);
!         mutex_exit(&nfscmd_lock);
  
          if (dh == NULL) {
                  /*
                   * The rendezvous point has not been established yet !
                   * This could mean that either mountd(1m) has not yet
--- 124,141 ----
          door_handle_t   dh;
          door_arg_t      da;
          door_info_t     di;
          int             ntries = 0;
          int             last = 0;
+         nfscmd_globals_t *ncg = zone_getspecific(nfscmd_zone_key, curzone);
  
  retry:
!         mutex_enter(&ncg->nfscmd_lock);
!         dh = ncg->nfscmd_dh;
          if (dh != NULL)
                  door_ki_hold(dh);
!         mutex_exit(&ncg->nfscmd_lock);
  
          if (dh == NULL) {
                  /*
                   * The rendezvous point has not been established yet !
                   * This could mean that either mountd(1m) has not yet
*** 139,152 ****
                                   * the (existing) door on us; we
                                   * want to wait to give smf(5) a
                                   * chance to restart mountd(1m)
                                   * and establish a new door handle.
                                   */
!                                 mutex_enter(&nfscmd_lock);
!                                 if (dh == nfscmd_dh)
!                                         nfscmd_dh = NULL;
!                                 mutex_exit(&nfscmd_lock);
                                  door_ki_rele(dh);
                                  delay(hz);
                                  goto retry;
                          }
                          /*
--- 178,191 ----
                                   * the (existing) door on us; we
                                   * want to wait to give smf(5) a
                                   * chance to restart mountd(1m)
                                   * and establish a new door handle.
                                   */
!                                 mutex_enter(&ncg->nfscmd_lock);
!                                 if (dh == ncg->nfscmd_dh)
!                                         ncg->nfscmd_dh = NULL;
!                                 mutex_exit(&ncg->nfscmd_lock);
                                  door_ki_rele(dh);
                                  delay(hz);
                                  goto retry;
                          }
                          /*