Print this page
Fix NFS design problems re. multiple zone keys
Make NFS server zone-specific data all have the same lifetime
Fix rfs4_clean_state_exi
Fix exi_cache_reclaim
Fix mistakes in zone keys work
More fixes re. exi_zoneid and exi_tree
(danmcd -> Keep some ASSERT()s around for readability.)

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/nfs/export.h
          +++ new/usr/src/uts/common/nfs/export.h
↓ open down ↓ 543 lines elided ↑ open up ↑
 544  544           * does not have its mutex held, and it has just-enough references
 545  545           * to not free from underneath us.  This field is not a proper
 546  546           * referenced-held zone pointer, and only ZSD callbacks should use
 547  547           * it.
 548  548           */
 549  549          struct zone             *exi_zone;
 550  550  #ifdef VOLATILE_FH_TEST
 551  551          uint32_t                exi_volatile_id;
 552  552          struct ex_vol_rename    *exi_vol_rename;
 553  553          kmutex_t                exi_vol_rename_lock;
 554      -#endif /* VOLATILE_FH_TEST */
      554 +#endif /* VOLATILE_FH_TEST -- keep last! */
 555  555  };
 556  556  #define exi_zoneid exi_zone->zone_id
 557  557  
 558  558  typedef struct exportinfo exportinfo_t;
 559  559  typedef struct exportdata exportdata_t;
 560  560  typedef struct secinfo secinfo_t;
 561  561  
 562  562  /*
 563  563   * exp_visible is a visible list per filesystem. It is for filesystems
 564  564   * that may need a limited view of its contents. A pseudo export and
↓ open down ↓ 61 lines elided ↑ open up ↑
 626  626              NULL, NULL, NULL) & (NFSAUTH_RO | NFSAUTH_LIMITED)))
 627  627  
 628  628  extern int      nfsauth4_access(struct exportinfo *, vnode_t *,
 629  629      struct svc_req *, cred_t *, uid_t *, gid_t *, uint_t *, gid_t **);
 630  630  extern int      nfsauth4_secinfo_access(struct exportinfo *,
 631  631      struct svc_req *, int, int, cred_t *);
 632  632  extern int      nfsauth_cache_clnt_compar(const void *, const void *);
 633  633  extern int      nfs_fhbcmp(char *, char *, int);
 634  634  extern void     nfs_exportinit(void);
 635  635  extern void     nfs_exportfini(void);
      636 +extern void     nfs_export_zone_init(nfs_globals_t *);
      637 +extern void     nfs_export_zone_fini(nfs_globals_t *);
      638 +extern void     nfs_export_zone_shutdown(nfs_globals_t *);
      639 +extern int      nfs_export_get_rootfh(nfs_globals_t *);
 636  640  extern int      chk_clnt_sec(struct exportinfo *, struct svc_req *);
 637  641  extern int      makefh(fhandle_t *, struct vnode *, struct exportinfo *);
 638  642  extern int      makefh_ol(fhandle_t *, struct exportinfo *, uint_t);
 639  643  extern int      makefh3(nfs_fh3 *, struct vnode *, struct exportinfo *);
 640  644  extern int      makefh3_ol(nfs_fh3 *, struct exportinfo *, uint_t);
 641  645  extern vnode_t *nfs_fhtovp(fhandle_t *, struct exportinfo *);
 642  646  extern vnode_t *nfs3_fhtovp(nfs_fh3 *, struct exportinfo *);
 643  647  extern struct   exportinfo *checkexport(fsid_t *, struct fid *);
 644  648  extern struct   exportinfo *checkexport4(fsid_t *, struct fid *, vnode_t *);
 645  649  extern void     exi_hold(struct exportinfo *);
↓ open down ↓ 6 lines elided ↑ open up ↑
 652  656  extern int      vn_is_nfs_reparse(vnode_t *, cred_t *);
 653  657  extern int      client_is_downrev(struct svc_req *);
 654  658  extern char    *build_symlink(vnode_t *, cred_t *, size_t *);
 655  659  
 656  660  extern fhandle_t nullfh2;       /* for comparing V2 filehandles */
 657  661  
 658  662  typedef struct nfs_export {
 659  663          /* Root of nfs pseudo namespace */
 660  664          treenode_t *ns_root;
 661  665  
      666 +        nfs_globals_t           *ne_globals;    /* "up" pointer */
      667 +
 662  668          struct exportinfo *exptable_path_hash[PKP_HASH_SIZE];
 663  669          struct exportinfo *exptable[EXPTABLESIZE];
 664  670  
 665  671          /*
 666  672           * Read/Write lock that protects the exportinfo list.  This lock
 667  673           * must be held when searching or modifiying the exportinfo list.
 668  674           */
 669  675          krwlock_t exported_lock;
 670  676  
 671  677          /* "public" and default (root) location for public filehandle */
↓ open down ↓ 19 lines elided ↑ open up ↑
 691  697  extern int      has_visible(struct exportinfo *, vnode_t *);
 692  698  extern void     free_visible(struct exp_visible *);
 693  699  extern int      nfs_exported(struct exportinfo *, vnode_t *);
 694  700  extern struct exportinfo *pseudo_exportfs(nfs_export_t *, vnode_t *, fid_t *,
 695  701                      struct exp_visible *, struct exportdata *);
 696  702  extern int      vop_fid_pseudo(vnode_t *, fid_t *);
 697  703  extern int      nfs4_vget_pseudo(struct exportinfo *, vnode_t **, fid_t *);
 698  704  extern bool_t   nfs_visible_change(struct exportinfo *, vnode_t *,
 699  705                      timespec_t *);
 700  706  extern void     tree_update_change(nfs_export_t *, treenode_t *, timespec_t *);
      707 +extern void     rfs4_clean_state_exi(nfs_export_t *, struct exportinfo *);
 701  708  
 702  709  /*
 703  710   * Functions that handle the NFSv4 server namespace security flavors
 704  711   * information.
 705  712   */
 706  713  extern void     srv_secinfo_exp2pseu(struct exportdata *, struct exportdata *);
 707  714  extern void     srv_secinfo_list_free(struct secinfo *, int);
 708  715  
 709  716  extern nfs_export_t *nfs_get_export();
 710  717  extern void     export_link(nfs_export_t *, struct exportinfo *);
↓ open down ↓ 31 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX