Print this page
NEX-15279 support NFS server in zone
NEX-15520 online NFS shares cause zoneadm halt to hang in nfs_export_zone_fini
Portions contributed by: Dan Kruchinin dan.kruchinin@nexenta.com
Portions contributed by: Stepan Zastupov stepan.zastupov@gmail.com
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/nfs/nfs_sys.c
          +++ new/usr/src/uts/common/fs/nfs/nfs_sys.c
↓ open down ↓ 10 lines elided ↑ open up ↑
  11   11   * and limitations under the License.
  12   12   *
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
       21 +
  21   22  /*
  22   23   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23   24   * Use is subject to license terms.
  24      - *
       25 + */
       26 +
       27 +/*
  25   28   * Copyright (c) 1983,1984,1985,1986,1987,1988,1989  AT&T.
  26   29   * All rights reserved.
  27   30   */
  28   31  
       32 +/*
       33 + * Copyright 2018 Nexenta Systems, Inc.
       34 + */
       35 +
  29   36  #include <sys/types.h>
  30   37  #include <rpc/types.h>
  31   38  #include <sys/systm.h>
  32   39  #include <sys/vfs.h>
  33   40  #include <sys/errno.h>
  34   41  #include <sys/cred.h>
  35   42  #include <sys/policy.h>
  36   43  #include <sys/siginfo.h>
  37   44  #include <sys/proc.h>           /* for exit() declaration */
  38   45  #include <sys/kmem.h>
↓ open down ↓ 34 lines elided ↑ open up ↑
  73   80  /* DSS: distributed stable storage */
  74   81  size_t nfs4_dss_buflen = 0;
  75   82  /* This filled in by nfssrv:_init() */
  76   83  int (*nfs_srv_dss_func)(char *, size_t) = NULL;
  77   84  
  78   85  int
  79   86  nfs_export(void *arg)
  80   87  {
  81   88          STRUCT_DECL(exportfs_args, ea);
  82   89  
  83      -        if (!INGLOBALZONE(curproc))
  84      -                return (set_errno(EPERM));
  85   90          STRUCT_INIT(ea, get_udatamodel());
  86   91          if (copyin(arg, STRUCT_BUF(ea), STRUCT_SIZE(ea)))
  87   92                  return (set_errno(EFAULT));
  88   93  
  89   94          return (exportfs(STRUCT_BUF(ea), get_udatamodel(), CRED()));
  90   95  }
  91   96  
  92   97  int
  93   98  nfssys(enum nfssys_op opcode, void *arg)
  94   99  {
↓ open down ↓ 9 lines elided ↑ open up ↑
 104  109                  STRUCT_DECL(nfs4clrst_args, u_clr);
 105  110  
 106  111                  /*
 107  112                   * If the server is not loaded then no point in
 108  113                   * clearing nothing :-)
 109  114                   */
 110  115                  if (rfs4_client_clrst == NULL) {
 111  116                          break;
 112  117                  }
 113  118  
 114      -                if (!INGLOBALZONE(curproc))
 115      -                        return (set_errno(EPERM));
 116      -
 117  119                  STRUCT_INIT(u_clr, get_udatamodel());
 118  120  
 119  121                  if (copyin(arg, STRUCT_BUF(u_clr), STRUCT_SIZE(u_clr)))
 120  122                          return (set_errno(EFAULT));
 121  123  
 122  124                  clr.vers = STRUCT_FGET(u_clr, vers);
 123  125  
 124  126                  if (clr.vers != NFS4_CLRST_VERSION)
 125  127                          return (set_errno(EINVAL));
 126  128  
↓ open down ↓ 30 lines elided ↑ open up ↑
 157  159                          return (set_errno(EFAULT));
 158  160  
 159  161                  error = svc_do_run(id);
 160  162                  break;
 161  163          }
 162  164  
 163  165          case RDMA_SVC_INIT: {
 164  166                  struct rdma_svc_args rsa;
 165  167                  char netstore[20] = "tcp";
 166  168  
 167      -                if (!INGLOBALZONE(curproc))
 168      -                        return (set_errno(EPERM));
 169  169                  if (get_udatamodel() != DATAMODEL_NATIVE) {
 170  170                          STRUCT_DECL(rdma_svc_args, ursa);
 171  171  
 172  172                          STRUCT_INIT(ursa, get_udatamodel());
 173  173                          if (copyin(arg, STRUCT_BUF(ursa), STRUCT_SIZE(ursa)))
 174  174                                  return (set_errno(EFAULT));
 175  175  
 176  176                          rsa.poolid = STRUCT_FGET(ursa, poolid);
 177  177                          rsa.nfs_versmin = STRUCT_FGET(ursa, nfs_versmin);
 178  178                          rsa.nfs_versmax = STRUCT_FGET(ursa, nfs_versmax);
↓ open down ↓ 3 lines elided ↑ open up ↑
 182  182                                  return (set_errno(EFAULT));
 183  183                  }
 184  184                  rsa.netid = netstore;
 185  185  
 186  186                  error = rdma_start(&rsa);
 187  187                  break;
 188  188          }
 189  189  
 190  190          case NFS_SVC: { /* NFS server daemon */
 191  191                  STRUCT_DECL(nfs_svc_args, nsa);
 192      -
 193      -                if (!INGLOBALZONE(curproc))
 194      -                        return (set_errno(EPERM));
 195  192                  STRUCT_INIT(nsa, get_udatamodel());
 196  193  
 197  194                  if (copyin(arg, STRUCT_BUF(nsa), STRUCT_SIZE(nsa)))
 198  195                          return (set_errno(EFAULT));
 199  196  
 200  197                  error = nfs_svc(STRUCT_BUF(nsa), get_udatamodel());
 201  198                  break;
 202  199          }
 203  200  
 204  201          case EXPORTFS: { /* export a file system */
 205  202                  error = nfs_export(arg);
 206  203                  break;
 207  204          }
 208  205  
 209  206          case NFS_GETFH: { /* get a file handle */
 210  207                  STRUCT_DECL(nfs_getfh_args, nga);
 211  208  
 212      -                if (!INGLOBALZONE(curproc))
 213      -                        return (set_errno(EPERM));
 214  209                  STRUCT_INIT(nga, get_udatamodel());
 215  210                  if (copyin(arg, STRUCT_BUF(nga), STRUCT_SIZE(nga)))
 216  211                          return (set_errno(EFAULT));
 217  212  
 218  213                  error = nfs_getfh(STRUCT_BUF(nga), get_udatamodel(), CRED());
 219  214                  break;
 220  215          }
 221  216  
 222  217          case NFS_REVAUTH: { /* revoke the cached credentials for the uid */
 223  218                  STRUCT_DECL(nfs_revauth_args, nra);
↓ open down ↓ 187 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX