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,29 ****
--- 16,34 ----
   * fields enclosed by brackets "[]" replaced with your own identifying
   * information: Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   */
+ 
  /*
   * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
   */
  
+ /*
+  * Copyright 2018 Nexenta Systems, Inc.
+  */
+ 
  #include <sys/cred.h>
  #include <sys/cmn_err.h>
  #include <sys/debug.h>
  #include <sys/systm.h>
  #include <sys/kmem.h>
*** 41,52 ****
  #include <nfs/nfs_log.h>
  
  #define NUM_RECORDS_TO_WRITE 256
  #define NUM_BYTES_TO_WRITE 65536
  
- extern krwlock_t exported_lock;
- 
  static int nfslog_num_records_to_write = NUM_RECORDS_TO_WRITE;
  static int nfslog_num_bytes_to_write = NUM_BYTES_TO_WRITE;
  
  /*
   * This struct is used to 'hide' the details of managing the log
--- 46,55 ----
*** 593,606 ****
   *
   * nfslog_record_put() must be used to 'free' this record or allocation.
   */
  /* ARGSUSED */
  void *
! nfslog_record_alloc(
!         struct exportinfo *exi,
!         int alloc_indx,
!         void **cookie,
          int flags)
  {
          struct lr_alloc *lrp;
  
          lrp = (struct lr_alloc *)
--- 596,606 ----
   *
   * nfslog_record_put() must be used to 'free' this record or allocation.
   */
  /* ARGSUSED */
  void *
! nfslog_record_alloc(struct exportinfo *exi, int alloc_indx, void **cookie,
      int flags)
  {
          struct lr_alloc *lrp;
  
          lrp = (struct lr_alloc *)
*** 766,777 ****
   * Take care of writing the provided log record(s) to the log file.
   * We group the log records with an iovec and use VOP_WRITE to append
   * them to the end of the log file.
   */
  static int
! nfslog_write_logrecords(struct log_file *lfp,
!         struct lr_alloc *lrp_writers, int num_recs)
  {
          struct uio uio;
          struct iovec *iovp;
          int size_iovecs;
          vnode_t *vp;
--- 766,777 ----
   * Take care of writing the provided log record(s) to the log file.
   * We group the log records with an iovec and use VOP_WRITE to append
   * them to the end of the log file.
   */
  static int
! nfslog_write_logrecords(struct log_file *lfp, struct lr_alloc *lrp_writers,
!     int num_recs)
  {
          struct uio uio;
          struct iovec *iovp;
          int size_iovecs;
          vnode_t *vp;
*** 1159,1170 ****
                  kmem_free(tparams, sizeof (*tparams));
          } else {
                  /*
                   * Do the work asynchronously
                   */
!                 (void) thread_create(NULL, 0, nfslog_do_flush,
!                     tparams, 0, &p0, TS_RUN, minclsyspri);
          }
  
          return (error);
  }
  
--- 1159,1170 ----
                  kmem_free(tparams, sizeof (*tparams));
          } else {
                  /*
                   * Do the work asynchronously
                   */
!                 (void) zthread_create(NULL, 0, nfslog_do_flush,
!                     tparams, 0, minclsyspri);
          }
  
          return (error);
  }
  
*** 1247,1258 ****
                   * no longer waiting for us.
                   * Free the thread arguments and exit.
                   */
                  kmem_free(args->buff, args->buff_len);
                  kmem_free(tparams, sizeof (*tparams));
!                 thread_exit();
!                 /* NOTREACHED */
          }
  
          tparams->tp_error = error;
  }
  
--- 1247,1257 ----
                   * no longer waiting for us.
                   * Free the thread arguments and exit.
                   */
                  kmem_free(args->buff, args->buff_len);
                  kmem_free(tparams, sizeof (*tparams));
!                 zthread_exit();
          }
  
          tparams->tp_error = error;
  }
  
*** 1527,1536 ****
--- 1526,1536 ----
   * multicomponent lookup and its semantics of crossing file system
   * boundaries add to the complexity.  See the comments below...
   */
  struct exportinfo *
  nfslog_get_exi(
+         nfs_export_t *ne,
          struct exportinfo *exi,
          struct svc_req *req,
          caddr_t res,
          unsigned int *nfslog_rec_id)
  {
*** 1558,1568 ****
                   */
                  exi_hold(exi);
                  return (exi);
          }
  
!         if (exi != exi_public)
                  return (NULL);
  
          /*
           * Here we have an exi that is not marked for logging.
           * It is possible that this request is a multicomponent lookup
--- 1558,1568 ----
                   */
                  exi_hold(exi);
                  return (exi);
          }
  
!         if (exi != ne->exi_public)
                  return (NULL);
  
          /*
           * Here we have an exi that is not marked for logging.
           * It is possible that this request is a multicomponent lookup
*** 1762,1782 ****
  }
  
  static char *
  get_publicfh_path(int *alloc_length)
  {
-         extern struct exportinfo *exi_public;
          char *pubpath;
  
!         rw_enter(&exported_lock, RW_READER);
  
!         *alloc_length = exi_public->exi_export.ex_pathlen + 1;
          pubpath = kmem_alloc(*alloc_length, KM_SLEEP);
  
!         (void) strcpy(pubpath, exi_public->exi_export.ex_path);
  
!         rw_exit(&exported_lock);
  
          return (pubpath);
  }
  
  static void
--- 1762,1782 ----
  }
  
  static char *
  get_publicfh_path(int *alloc_length)
  {
          char *pubpath;
+         nfs_export_t *ne = nfs_get_export();
  
!         rw_enter(&ne->exported_lock, RW_READER);
  
!         *alloc_length = ne->exi_public->exi_export.ex_pathlen + 1;
          pubpath = kmem_alloc(*alloc_length, KM_SLEEP);
  
!         (void) strcpy(pubpath, ne->exi_public->exi_export.ex_path);
  
!         rw_exit(&ne->exported_lock);
  
          return (pubpath);
  }
  
  static void
*** 1868,1881 ****
              (caddr_t)exi, (caddr_t)&res, cr, &nb, 0, NFSLOG_ONE_BUFFER);
  }
  
  
  void
! nfslog_getfh(struct exportinfo *exi,
!         fhandle *fh,
!         char *fname,
!         enum uio_seg seg,
          cred_t *cr)
  {
          struct svc_req  req;
          int             res = 0;
          struct netbuf   nb = {0, 0, NULL};
--- 1868,1878 ----
              (caddr_t)exi, (caddr_t)&res, cr, &nb, 0, NFSLOG_ONE_BUFFER);
  }
  
  
  void
! nfslog_getfh(struct exportinfo *exi, fhandle *fh, char *fname, enum uio_seg seg,
      cred_t *cr)
  {
          struct svc_req  req;
          int             res = 0;
          struct netbuf   nb = {0, 0, NULL};