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