Print this page
NEX-19996 exi_id_get_next() calls should be WRITER locked
NEX-20014 NFS v4 state lock mutex exited before entered (on error path)
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Rick McNeal <rick.mcneal@nexenta.com>
Reviewed by: Joyce McIntosh <joyce.mcintosh@nexenta.com>
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>
NEX-9275 Got "bad mutex" panic when run IO to nfs share from clients
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Sanjay Nadkarni <sanjay.nadkarni@nexenta.com>
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
NEX-6778 NFS kstats leak and cause system to hang
Revert "NEX-4261 Per-client NFS server IOPS, bandwidth, and latency kstats"
This reverts commit 586c3ab1927647487f01c337ddc011c642575a52.
Revert "NEX-5354 Aggregated IOPS, bandwidth, and latency kstats for NFS server"
This reverts commit c91d7614da8618ef48018102b077f60ecbbac8c2.
Revert "NEX-5667 nfssrv_stats_flags does not work for aggregated kstats"
This reverts commit 3dcf42618be7dd5f408c327f429c81e07ca08e74.
Revert "NEX-5750 Time values for aggregated NFS server kstats should be normalized"
This reverts commit 1f4d4f901153b0191027969fa4a8064f9d3b9ee1.
Revert "NEX-5942 Panic in rfs4_minorvers_mismatch() with NFSv4.1 client"
This reverts commit 40766417094a162f5e4cc8786c0fa0a7e5871cd9.
Revert "NEX-5752 NFS server: namespace collision in kstats"
This reverts commit ae81e668db86050da8e483264acb0cce0444a132.
Reviewed by: Rob Gittins <rob.gittins@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-5667 nfssrv_stats_flags does not work for aggregated kstats
NEX-4472 nfsauth_retrieve() flood caused by NFS clients with personal identity problems
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
NEX-4261 Per-client NFS server IOPS, bandwidth, and latency kstats
Reviewed by: Kevin Crowe <kevin.crowe@nexenta.com>
Reviewed by: Roman Strashkin <roman.strashkin@nexenta.com>
NEX-3097 IOPS, bandwidth, and latency kstats for NFS server
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
NEX-2345 nfsauth_cache_get() could spend a lot of time walking exi_cache
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
NEX-1974 Support for more than 16 groups with AUTH_SYS
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
NEX-1128 NFS server: Generic uid and gid remapping for AUTH_SYS
Reviewed by: Jan Kryl <jan.kryl@nexenta.com>
re #3541 rb11254 - nfs nohide - "nfssrv: need ability to go to submounts for v3 and v2 protocols"
        
*** 18,28 ****
   *
   * CDDL HEADER END
   */
  
  /*
!  * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
   * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
   * Copyright 2016 Jason King.
   */
  
  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
--- 18,28 ----
   *
   * CDDL HEADER END
   */
  
  /*
!  * Copyright 2018 Nexenta Systems, Inc.
   * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
   * Copyright 2016 Jason King.
   */
  
  /*      Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
*** 36,45 ****
--- 36,49 ----
  #include <sys/vnode.h>
  #include <nfs/nfs4.h>
  #include <sys/kiconv.h>
  #include <sys/avl.h>
  
+ #ifdef _KERNEL
+ #include <sys/pkp_hash.h> /* for PKP_HASH_SIZE */
+ #endif /* _KERNEL */
+ 
  #ifdef  __cplusplus
  extern "C" {
  #endif
  
  /*
*** 187,196 ****
--- 191,201 ----
  
  #define EX_CHARMAP      0x1000  /* NFS may need a character set conversion */
  #define EX_NOACLFAB     0x2000  /* If set, NFSv2 and v3 servers won't */
                                  /* fabricate an aclent_t ACL on file systems */
                                  /* that don't support aclent_t ACLs */
+ #define EX_NOHIDE       0x4000  /* traversable from exported parent */
  
  #ifdef  _KERNEL
  
  #define RPC_IDEMPOTENT  0x1     /* idempotent or not */
  /*
*** 474,486 ****
          ((t)->tree_exi && (t)->tree_exi->exi_vp->v_flag & VROOT)
  
  #define TREE_EXPORTED(t) \
          ((t)->tree_exi && !PSEUDO((t)->tree_exi))
  
- /* Root of nfs pseudo namespace */
- extern treenode_t *ns_root;
- 
  #define EXPTABLESIZE   256
  
  struct exp_hash {
          struct exportinfo       *prev;  /* ptr to the previous exportinfo */
          struct exportinfo       *next;  /* ptr to the next exportinfo */
--- 479,488 ----
*** 527,536 ****
--- 529,542 ----
  #ifdef VOLATILE_FH_TEST
          uint32_t                exi_volatile_id;
          struct ex_vol_rename    *exi_vol_rename;
          kmutex_t                exi_vol_rename_lock;
  #endif /* VOLATILE_FH_TEST */
+         int                     exi_id;
+         avl_node_t              exi_id_link;
+         struct exp_kstats       *exi_kstats;
+         zoneid_t                exi_zoneid;
  };
  
  typedef struct exportinfo exportinfo_t;
  typedef struct exportdata exportdata_t;
  typedef struct secinfo secinfo_t;
*** 605,615 ****
      struct svc_req *, cred_t *, uid_t *, gid_t *, uint_t *, gid_t **);
  extern int      nfsauth4_secinfo_access(struct exportinfo *,
      struct svc_req *, int, int, cred_t *);
  extern int      nfsauth_cache_clnt_compar(const void *, const void *);
  extern int      nfs_fhbcmp(char *, char *, int);
! extern int      nfs_exportinit(void);
  extern void     nfs_exportfini(void);
  extern int      chk_clnt_sec(struct exportinfo *, struct svc_req *);
  extern int      makefh(fhandle_t *, struct vnode *, struct exportinfo *);
  extern int      makefh_ol(fhandle_t *, struct exportinfo *, uint_t);
  extern int      makefh3(nfs_fh3 *, struct vnode *, struct exportinfo *);
--- 611,621 ----
      struct svc_req *, cred_t *, uid_t *, gid_t *, uint_t *, gid_t **);
  extern int      nfsauth4_secinfo_access(struct exportinfo *,
      struct svc_req *, int, int, cred_t *);
  extern int      nfsauth_cache_clnt_compar(const void *, const void *);
  extern int      nfs_fhbcmp(char *, char *, int);
! extern void     nfs_exportinit(void);
  extern void     nfs_exportfini(void);
  extern int      chk_clnt_sec(struct exportinfo *, struct svc_req *);
  extern int      makefh(fhandle_t *, struct vnode *, struct exportinfo *);
  extern int      makefh_ol(fhandle_t *, struct exportinfo *, uint_t);
  extern int      makefh3(nfs_fh3 *, struct vnode *, struct exportinfo *);
*** 617,671 ****
  extern vnode_t *nfs_fhtovp(fhandle_t *, struct exportinfo *);
  extern vnode_t *nfs3_fhtovp(nfs_fh3 *, struct exportinfo *);
  extern struct   exportinfo *checkexport(fsid_t *, struct fid *);
  extern struct   exportinfo *checkexport4(fsid_t *, struct fid *, vnode_t *);
  extern void     exi_hold(struct exportinfo *);
! extern void     exi_rele(struct exportinfo *);
  extern struct exportinfo *nfs_vptoexi(vnode_t *, vnode_t *, cred_t *, int *,
      int *, bool_t);
  extern int      nfs_check_vpexi(vnode_t *, vnode_t *, cred_t *,
                          struct exportinfo **);
- extern void     export_link(struct exportinfo *);
- extern void     export_unlink(struct exportinfo *);
  extern vnode_t *untraverse(vnode_t *);
  extern int      vn_is_nfs_reparse(vnode_t *, cred_t *);
  extern int      client_is_downrev(struct svc_req *);
  extern char    *build_symlink(vnode_t *, cred_t *, size_t *);
  
  /*
   * Functions that handle the NFSv4 server namespace
   */
  extern exportinfo_t *vis2exi(treenode_t *);
  extern int      treeclimb_export(struct exportinfo *);
! extern void     treeclimb_unexport(struct exportinfo *);
  extern int      nfs_visible(struct exportinfo *, vnode_t *, int *);
  extern int      nfs_visible_inode(struct exportinfo *, ino64_t,
      struct exp_visible **);
  extern int      has_visible(struct exportinfo *, vnode_t *);
  extern void     free_visible(struct exp_visible *);
  extern int      nfs_exported(struct exportinfo *, vnode_t *);
! extern struct exportinfo *pseudo_exportfs(vnode_t *, fid_t *,
      struct exp_visible *, struct exportdata *);
  extern int      vop_fid_pseudo(vnode_t *, fid_t *);
  extern int      nfs4_vget_pseudo(struct exportinfo *, vnode_t **, fid_t *);
  extern bool_t   nfs_visible_change(struct exportinfo *, vnode_t *,
      timespec_t *);
! extern void     tree_update_change(treenode_t *, timespec_t *);
  /*
   * Functions that handle the NFSv4 server namespace security flavors
   * information.
   */
  extern void     srv_secinfo_exp2pseu(struct exportdata *, struct exportdata *);
  extern void     srv_secinfo_list_free(struct secinfo *, int);
  
  /*
!  * "public" and default (root) location for public filehandle
   */
! extern struct exportinfo *exi_public, *exi_root;
! extern fhandle_t nullfh2;       /* for comparing V2 filehandles */
! extern krwlock_t exported_lock;
! extern struct exportinfo *exptable[];
  
  /*
   * Two macros for identifying public filehandles.
   * A v2 public filehandle is 32 zero bytes.
   * A v3 public filehandle is zero length.
--- 623,705 ----
  extern vnode_t *nfs_fhtovp(fhandle_t *, struct exportinfo *);
  extern vnode_t *nfs3_fhtovp(nfs_fh3 *, struct exportinfo *);
  extern struct   exportinfo *checkexport(fsid_t *, struct fid *);
  extern struct   exportinfo *checkexport4(fsid_t *, struct fid *, vnode_t *);
  extern void     exi_hold(struct exportinfo *);
! extern void     exi_rele(struct exportinfo **);
  extern struct exportinfo *nfs_vptoexi(vnode_t *, vnode_t *, cred_t *, int *,
      int *, bool_t);
  extern int      nfs_check_vpexi(vnode_t *, vnode_t *, cred_t *,
                          struct exportinfo **);
  extern vnode_t *untraverse(vnode_t *);
  extern int      vn_is_nfs_reparse(vnode_t *, cred_t *);
  extern int      client_is_downrev(struct svc_req *);
  extern char    *build_symlink(vnode_t *, cred_t *, size_t *);
  
+ extern fhandle_t nullfh2;       /* for comparing V2 filehandles */
+ 
+ typedef struct nfs_export {
+         /* Root of nfs pseudo namespace */
+         treenode_t *ns_root;
+ 
+         struct exportinfo *exptable_path_hash[PKP_HASH_SIZE];
+         struct exportinfo *exptable[EXPTABLESIZE];
+ 
+         /*
+          * Read/Write lock that protects the exportinfo list.  This lock
+          * must be held when searching or modifiying the exportinfo list.
+          */
+         krwlock_t exported_lock;
+ 
+         /* "public" and default (root) location for public filehandle */
+         struct exportinfo *exi_public, *exi_root;
+         /* For checking default public file handle */
+         fid_t exi_rootfid;
+         /* For comparing V2 filehandles */
+         fhandle_t nullfh2;
+ 
+         /* The change attribute value of the root of nfs pseudo namespace */
+         timespec_t ns_root_change;
+ } nfs_export_t;
+ 
  /*
   * Functions that handle the NFSv4 server namespace
   */
  extern exportinfo_t *vis2exi(treenode_t *);
  extern int      treeclimb_export(struct exportinfo *);
! extern void     treeclimb_unexport(nfs_export_t *, struct exportinfo *);
  extern int      nfs_visible(struct exportinfo *, vnode_t *, int *);
  extern int      nfs_visible_inode(struct exportinfo *, ino64_t,
                      struct exp_visible **);
  extern int      has_visible(struct exportinfo *, vnode_t *);
  extern void     free_visible(struct exp_visible *);
  extern int      nfs_exported(struct exportinfo *, vnode_t *);
! extern struct exportinfo *pseudo_exportfs(nfs_export_t *, vnode_t *, fid_t *,
                      struct exp_visible *, struct exportdata *);
  extern int      vop_fid_pseudo(vnode_t *, fid_t *);
  extern int      nfs4_vget_pseudo(struct exportinfo *, vnode_t **, fid_t *);
  extern bool_t   nfs_visible_change(struct exportinfo *, vnode_t *,
                      timespec_t *);
! extern void     tree_update_change(nfs_export_t *, treenode_t *, timespec_t *);
! 
  /*
   * Functions that handle the NFSv4 server namespace security flavors
   * information.
   */
  extern void     srv_secinfo_exp2pseu(struct exportdata *, struct exportdata *);
  extern void     srv_secinfo_list_free(struct secinfo *, int);
  
+ extern nfs_export_t *nfs_get_export();
+ extern void     export_link(nfs_export_t *, struct exportinfo *);
+ extern void     export_unlink(nfs_export_t *, struct exportinfo *);
+ 
  /*
!  * exi_id support
   */
! extern kmutex_t  nfs_exi_id_lock;
! extern avl_tree_t exi_id_tree;
! extern int exi_id_get_next(void);
  
  /*
   * Two macros for identifying public filehandles.
   * A v2 public filehandle is 32 zero bytes.
   * A v3 public filehandle is zero length.