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
        
*** 19,41 ****
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
-  * Copyright 2016 Nexenta Systems, Inc.
   * Copyright (c) 2014, 2016 by Delphix. All rights reserved.
   */
  
  /*
   * NFS specific functions
   */
  #include <stdio.h>
  #include <string.h>
  #include <ctype.h>
  #include <stdlib.h>
  #include <unistd.h>
- #include <zone.h>
  #include <errno.h>
  #include <locale.h>
  #include <signal.h>
  #include <strings.h>
  #include "libshare.h"
--- 19,41 ----
   * CDDL HEADER END
   */
  
  /*
   * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
   * Copyright (c) 2014, 2016 by Delphix. All rights reserved.
+  * Copyright 2018 Nexenta Systems, Inc.
   */
  
  /*
   * NFS specific functions
   */
+ 
  #include <stdio.h>
  #include <string.h>
  #include <ctype.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <errno.h>
  #include <locale.h>
  #include <signal.h>
  #include <strings.h>
  #include "libshare.h"
*** 1903,1994 ****
                                  sa_free_derived_security(sec);
                          if (sectype != NULL)
                                  sa_free_attr_string(sectype);
                  }
          }
!         /*
!          * when we get here, we can do the exportfs system call and
!          * initiate things. We probably want to enable the
!          * svc:/network/nfs/server service first if it isn't running.
!          */
!         /* check svc:/network/nfs/server status and start if needed */
          /* now add the share to the internal tables */
          printarg(path, &export);
          /*
           * call the exportfs system call which is implemented
           * via the nfssys() call as the EXPORTFS subfunction.
           */
          if (iszfs) {
                  struct exportfs_args ea;
                  share_t sh;
-                 char *str;
-                 priv_set_t *priv_effective;
-                 int privileged;
  
-                 /*
-                  * If we aren't a privileged user
-                  * and NFS server service isn't running
-                  * then print out an error message
-                  * and return EPERM
-                  */
- 
-                 priv_effective = priv_allocset();
-                 (void) getppriv(PRIV_EFFECTIVE, priv_effective);
- 
-                 privileged = (priv_isfullset(priv_effective) == B_TRUE);
-                 priv_freeset(priv_effective);
- 
-                 if (!privileged &&
-                     (str = smf_get_state(NFS_SERVER_SVC)) != NULL) {
-                         err = 0;
-                         if (strcmp(str, SCF_STATE_STRING_ONLINE) != 0) {
-                                 (void) printf(dgettext(TEXT_DOMAIN,
-                                     "NFS: Cannot share remote "
-                                     "filesystem: %s\n"), path);
-                                 (void) printf(dgettext(TEXT_DOMAIN,
-                                     "NFS: Service needs to be enabled "
-                                     "by a privileged user\n"));
-                                 err = SA_SYSTEM_ERR;
-                                 errno = EPERM;
-                         }
-                         free(str);
-                 }
- 
-                 if (err == 0) {
                          ea.dname = path;
                          ea.uex = &export;
  
                          (void) sa_sharetab_fill_zfs(share, &sh, "nfs");
!                         err = sa_share_zfs(share, NULL, path, &sh,
!                             &ea, ZFS_SHARE_NFS);
                          if (err != SA_OK) {
                                  errno = err;
                                  err = -1;
                          }
                          sa_emptyshare(&sh);
-                 }
          } else {
                  err = exportfs(path, &export);
          }
  
          if (err < 0) {
                  err = SA_SYSTEM_ERR;
                  switch (errno) {
-                 case EREMOTE:
-                         (void) printf(dgettext(TEXT_DOMAIN,
-                             "NFS: Cannot share filesystems "
-                             "in non-global zones: %s\n"), path);
-                         err = SA_NOT_SUPPORTED;
-                         break;
                  case EPERM:
-                         if (getzoneid() != GLOBAL_ZONEID) {
-                                 (void) printf(dgettext(TEXT_DOMAIN,
-                                     "NFS: Cannot share file systems "
-                                     "in non-global zones: %s\n"), path);
-                                 err = SA_NOT_SUPPORTED;
-                                 break;
-                         }
                          err = SA_NO_PERMISSION;
                          break;
                  case EEXIST:
                          err = SA_SHARE_EXISTS;
                          break;
--- 1903,1941 ----
                                  sa_free_derived_security(sec);
                          if (sectype != NULL)
                                  sa_free_attr_string(sectype);
                  }
          }
! 
          /* now add the share to the internal tables */
          printarg(path, &export);
          /*
           * call the exportfs system call which is implemented
           * via the nfssys() call as the EXPORTFS subfunction.
           */
          if (iszfs) {
                  struct exportfs_args ea;
                  share_t sh;
  
                  ea.dname = path;
                  ea.uex = &export;
  
                  (void) sa_sharetab_fill_zfs(share, &sh, "nfs");
!                 err = sa_share_zfs(share, NULL, path, &sh, &ea, ZFS_SHARE_NFS);
                  if (err != SA_OK) {
                          errno = err;
                          err = -1;
                  }
                  sa_emptyshare(&sh);
          } else {
                  err = exportfs(path, &export);
          }
  
          if (err < 0) {
                  err = SA_SYSTEM_ERR;
                  switch (errno) {
                  case EPERM:
                          err = SA_NO_PERMISSION;
                          break;
                  case EEXIST:
                          err = SA_SHARE_EXISTS;
                          break;
*** 2096,2108 ****
                   */
                  switch (errno) {
                  case EPERM:
                  case EACCES:
                          ret = SA_NO_PERMISSION;
-                         if (getzoneid() != GLOBAL_ZONEID) {
-                                 ret = SA_NOT_SUPPORTED;
-                         }
                          break;
                  case EINVAL:
                  case ENOENT:
                          ret = SA_NO_SUCH_PATH;
                          break;
--- 2043,2052 ----