linux/fs/nfsd/export.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de>
   4 */
   5#ifndef NFSD_EXPORT_H
   6#define NFSD_EXPORT_H
   7
   8#include <linux/sunrpc/cache.h>
   9#include <uapi/linux/nfsd/export.h>
  10#include <linux/nfs4.h>
  11
  12struct knfsd_fh;
  13struct svc_fh;
  14struct svc_rqst;
  15
  16/*
  17 * FS Locations
  18 */
  19
  20#define MAX_FS_LOCATIONS        128
  21
  22struct nfsd4_fs_location {
  23        char *hosts; /* colon separated list of hosts */
  24        char *path;  /* slash separated list of path components */
  25};
  26
  27struct nfsd4_fs_locations {
  28        uint32_t locations_count;
  29        struct nfsd4_fs_location *locations;
  30/* If we're not actually serving this data ourselves (only providing a
  31 * list of replicas that do serve it) then we set "migrated": */
  32        int migrated;
  33};
  34
  35/*
  36 * We keep an array of pseudoflavors with the export, in order from most
  37 * to least preferred.  For the foreseeable future, we don't expect more
  38 * than the eight pseudoflavors null, unix, krb5, krb5i, krb5p, skpm3,
  39 * spkm3i, and spkm3p (and using all 8 at once should be rare).
  40 */
  41#define MAX_SECINFO_LIST        8
  42#define EX_UUID_LEN             16
  43
  44struct exp_flavor_info {
  45        u32     pseudoflavor;
  46        u32     flags;
  47};
  48
  49struct svc_export {
  50        struct cache_head       h;
  51        struct auth_domain *    ex_client;
  52        int                     ex_flags;
  53        struct path             ex_path;
  54        kuid_t                  ex_anon_uid;
  55        kgid_t                  ex_anon_gid;
  56        int                     ex_fsid;
  57        unsigned char *         ex_uuid; /* 16 byte fsid */
  58        struct nfsd4_fs_locations ex_fslocs;
  59        uint32_t                ex_nflavors;
  60        struct exp_flavor_info  ex_flavors[MAX_SECINFO_LIST];
  61        u32                     ex_layout_types;
  62        struct nfsd4_deviceid_map *ex_devid_map;
  63        struct cache_detail     *cd;
  64        struct rcu_head         ex_rcu;
  65};
  66
  67/* an "export key" (expkey) maps a filehandlefragement to an
  68 * svc_export for a given client.  There can be several per export,
  69 * for the different fsid types.
  70 */
  71struct svc_expkey {
  72        struct cache_head       h;
  73
  74        struct auth_domain *    ek_client;
  75        int                     ek_fsidtype;
  76        u32                     ek_fsid[6];
  77
  78        struct path             ek_path;
  79        struct rcu_head         ek_rcu;
  80};
  81
  82#define EX_ISSYNC(exp)          (!((exp)->ex_flags & NFSEXP_ASYNC))
  83#define EX_NOHIDE(exp)          ((exp)->ex_flags & NFSEXP_NOHIDE)
  84#define EX_WGATHER(exp)         ((exp)->ex_flags & NFSEXP_GATHERED_WRITES)
  85
  86int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp);
  87__be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp);
  88
  89/*
  90 * Function declarations
  91 */
  92int                     nfsd_export_init(struct net *);
  93void                    nfsd_export_shutdown(struct net *);
  94void                    nfsd_export_flush(struct net *);
  95struct svc_export *     rqst_exp_get_by_name(struct svc_rqst *,
  96                                             struct path *);
  97struct svc_export *     rqst_exp_parent(struct svc_rqst *,
  98                                        struct path *);
  99struct svc_export *     rqst_find_fsidzero_export(struct svc_rqst *);
 100int                     exp_rootfh(struct net *, struct auth_domain *,
 101                                        char *path, struct knfsd_fh *, int maxsize);
 102__be32                  exp_pseudoroot(struct svc_rqst *, struct svc_fh *);
 103__be32                  nfserrno(int errno);
 104
 105static inline void exp_put(struct svc_export *exp)
 106{
 107        cache_put(&exp->h, exp->cd);
 108}
 109
 110static inline struct svc_export *exp_get(struct svc_export *exp)
 111{
 112        cache_get(&exp->h);
 113        return exp;
 114}
 115struct svc_export * rqst_exp_find(struct svc_rqst *, int, u32 *);
 116
 117#endif /* NFSD_EXPORT_H */
 118