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.