linux/include/linux/nfsd/export.h
<<
>>
Prefs
   1/*
   2 * include/linux/nfsd/export.h
   3 * 
   4 * Public declarations for NFS exports. The definitions for the
   5 * syscall interface are in nfsctl.h
   6 *
   7 * Copyright (C) 1995-1997 Olaf Kirch <okir@monad.swb.de>
   8 */
   9
  10#ifndef NFSD_EXPORT_H
  11#define NFSD_EXPORT_H
  12
  13# include <linux/types.h>
  14#ifdef __KERNEL__
  15# include <linux/nfsd/nfsfh.h>
  16#endif
  17
  18/*
  19 * Important limits for the exports stuff.
  20 */
  21#define NFSCLNT_IDMAX           1024
  22#define NFSCLNT_ADDRMAX         16
  23#define NFSCLNT_KEYMAX          32
  24
  25/*
  26 * Export flags.
  27 */
  28#define NFSEXP_READONLY         0x0001
  29#define NFSEXP_INSECURE_PORT    0x0002
  30#define NFSEXP_ROOTSQUASH       0x0004
  31#define NFSEXP_ALLSQUASH        0x0008
  32#define NFSEXP_ASYNC            0x0010
  33#define NFSEXP_GATHERED_WRITES  0x0020
  34/* 40 80 100 currently unused */
  35#define NFSEXP_NOHIDE           0x0200
  36#define NFSEXP_NOSUBTREECHECK   0x0400
  37#define NFSEXP_NOAUTHNLM        0x0800          /* Don't authenticate NLM requests - just trust */
  38#define NFSEXP_MSNFS            0x1000  /* do silly things that MS clients expect; no longer supported */
  39#define NFSEXP_FSID             0x2000
  40#define NFSEXP_CROSSMOUNT       0x4000
  41#define NFSEXP_NOACL            0x8000  /* reserved for possible ACL related use */
  42/*
  43 * The NFSEXP_V4ROOT flag causes the kernel to give access only to NFSv4
  44 * clients, and only to the single directory that is the root of the
  45 * export; further lookup and readdir operations are treated as if every
  46 * subdirectory was a mountpoint, and ignored if they are not themselves
  47 * exported.  This is used by nfsd and mountd to construct the NFSv4
  48 * pseudofilesystem, which provides access only to paths leading to each
  49 * exported filesystem.
  50 */
  51#define NFSEXP_V4ROOT           0x10000
  52/* All flags that we claim to support.  (Note we don't support NOACL.) */
  53#define NFSEXP_ALLFLAGS         0x17E3F
  54
  55/* The flags that may vary depending on security flavor: */
  56#define NFSEXP_SECINFO_FLAGS    (NFSEXP_READONLY | NFSEXP_ROOTSQUASH \
  57                                        | NFSEXP_ALLSQUASH \
  58                                        | NFSEXP_INSECURE_PORT)
  59
  60#ifdef __KERNEL__
  61
  62/*
  63 * FS Locations
  64 */
  65
  66#define MAX_FS_LOCATIONS        128
  67
  68struct nfsd4_fs_location {
  69        char *hosts; /* colon separated list of hosts */
  70        char *path;  /* slash separated list of path components */
  71};
  72
  73struct nfsd4_fs_locations {
  74        uint32_t locations_count;
  75        struct nfsd4_fs_location *locations;
  76/* If we're not actually serving this data ourselves (only providing a
  77 * list of replicas that do serve it) then we set "migrated": */
  78        int migrated;
  79};
  80
  81/*
  82 * We keep an array of pseudoflavors with the export, in order from most
  83 * to least preferred.  For the foreseeable future, we don't expect more
  84 * than the eight pseudoflavors null, unix, krb5, krb5i, krb5p, skpm3,
  85 * spkm3i, and spkm3p (and using all 8 at once should be rare).
  86 */
  87#define MAX_SECINFO_LIST        8
  88
  89struct exp_flavor_info {
  90        u32     pseudoflavor;
  91        u32     flags;
  92};
  93
  94struct svc_export {
  95        struct cache_head       h;
  96        struct auth_domain *    ex_client;
  97        int                     ex_flags;
  98        struct path             ex_path;
  99        uid_t                   ex_anon_uid;
 100        gid_t                   ex_anon_gid;
 101        int                     ex_fsid;
 102        unsigned char *         ex_uuid; /* 16 byte fsid */
 103        struct nfsd4_fs_locations ex_fslocs;
 104        int                     ex_nflavors;
 105        struct exp_flavor_info  ex_flavors[MAX_SECINFO_LIST];
 106        struct cache_detail     *cd;
 107};
 108
 109/* an "export key" (expkey) maps a filehandlefragement to an
 110 * svc_export for a given client.  There can be several per export,
 111 * for the different fsid types.
 112 */
 113struct svc_expkey {
 114        struct cache_head       h;
 115
 116        struct auth_domain *    ek_client;
 117        int                     ek_fsidtype;
 118        u32                     ek_fsid[6];
 119
 120        struct path             ek_path;
 121};
 122
 123#define EX_ISSYNC(exp)          (!((exp)->ex_flags & NFSEXP_ASYNC))
 124#define EX_NOHIDE(exp)          ((exp)->ex_flags & NFSEXP_NOHIDE)
 125#define EX_WGATHER(exp)         ((exp)->ex_flags & NFSEXP_GATHERED_WRITES)
 126
 127int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp);
 128__be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp);
 129
 130/*
 131 * Function declarations
 132 */
 133int                     nfsd_export_init(struct net *);
 134void                    nfsd_export_shutdown(struct net *);
 135void                    nfsd_export_flush(struct net *);
 136struct svc_export *     rqst_exp_get_by_name(struct svc_rqst *,
 137                                             struct path *);
 138struct svc_export *     rqst_exp_parent(struct svc_rqst *,
 139                                        struct path *);
 140struct svc_export *     rqst_find_fsidzero_export(struct svc_rqst *);
 141int                     exp_rootfh(struct net *, struct auth_domain *,
 142                                        char *path, struct knfsd_fh *, int maxsize);
 143__be32                  exp_pseudoroot(struct svc_rqst *, struct svc_fh *);
 144__be32                  nfserrno(int errno);
 145
 146static inline void exp_put(struct svc_export *exp)
 147{
 148        cache_put(&exp->h, exp->cd);
 149}
 150
 151static inline void exp_get(struct svc_export *exp)
 152{
 153        cache_get(&exp->h);
 154}
 155struct svc_export * rqst_exp_find(struct svc_rqst *, int, u32 *);
 156
 157#endif /* __KERNEL__ */
 158
 159#endif /* NFSD_EXPORT_H */
 160
 161