Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
423 | giacomo | 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 <asm/types.h> |
||
14 | #ifdef __KERNEL__ |
||
15 | # include <linux/types.h> |
||
16 | # include <linux/in.h> |
||
17 | #endif |
||
18 | |||
19 | /* |
||
20 | * Important limits for the exports stuff. |
||
21 | */ |
||
22 | #define NFSCLNT_IDMAX 1024 |
||
23 | #define NFSCLNT_ADDRMAX 16 |
||
24 | #define NFSCLNT_KEYMAX 32 |
||
25 | |||
26 | /* |
||
27 | * Export flags. |
||
28 | */ |
||
29 | #define NFSEXP_READONLY 0x0001 |
||
30 | #define NFSEXP_INSECURE_PORT 0x0002 |
||
31 | #define NFSEXP_ROOTSQUASH 0x0004 |
||
32 | #define NFSEXP_ALLSQUASH 0x0008 |
||
33 | #define NFSEXP_ASYNC 0x0010 |
||
34 | #define NFSEXP_GATHERED_WRITES 0x0020 |
||
35 | /* 40 80 100 currently unused */ |
||
36 | #define NFSEXP_NOHIDE 0x0200 |
||
37 | #define NFSEXP_NOSUBTREECHECK 0x0400 |
||
38 | #define NFSEXP_NOAUTHNLM 0x0800 /* Don't authenticate NLM requests - just trust */ |
||
39 | #define NFSEXP_MSNFS 0x1000 /* do silly things that MS clients expect */ |
||
40 | #define NFSEXP_FSID 0x2000 |
||
41 | #define NFSEXP_CROSSMOUNT 0x4000 |
||
42 | #define NFSEXP_NOACL 0x8000 /* reserved for possible ACL related use */ |
||
43 | #define NFSEXP_ALLFLAGS 0xFE3F |
||
44 | |||
45 | |||
46 | #ifdef __KERNEL__ |
||
47 | |||
48 | struct svc_export { |
||
49 | struct cache_head h; |
||
50 | struct auth_domain * ex_client; |
||
51 | int ex_flags; |
||
52 | struct vfsmount * ex_mnt; |
||
53 | struct dentry * ex_dentry; |
||
54 | uid_t ex_anon_uid; |
||
55 | gid_t ex_anon_gid; |
||
56 | int ex_fsid; |
||
57 | }; |
||
58 | |||
59 | /* an "export key" (expkey) maps a filehandlefragement to an |
||
60 | * svc_export for a given client. There can be two per export, one |
||
61 | * for type 0 (dev/ino), one for type 1 (fsid) |
||
62 | */ |
||
63 | struct svc_expkey { |
||
64 | struct cache_head h; |
||
65 | |||
66 | struct auth_domain * ek_client; |
||
67 | int ek_fsidtype; |
||
68 | u32 ek_fsid[3]; |
||
69 | |||
70 | struct svc_export * ek_export; |
||
71 | }; |
||
72 | |||
73 | #define EX_SECURE(exp) (!((exp)->ex_flags & NFSEXP_INSECURE_PORT)) |
||
74 | #define EX_ISSYNC(exp) (!((exp)->ex_flags & NFSEXP_ASYNC)) |
||
75 | #define EX_RDONLY(exp) ((exp)->ex_flags & NFSEXP_READONLY) |
||
76 | #define EX_NOHIDE(exp) ((exp)->ex_flags & NFSEXP_NOHIDE) |
||
77 | #define EX_WGATHER(exp) ((exp)->ex_flags & NFSEXP_GATHERED_WRITES) |
||
78 | |||
79 | |||
80 | /* |
||
81 | * Function declarations |
||
82 | */ |
||
83 | void nfsd_export_init(void); |
||
84 | void nfsd_export_shutdown(void); |
||
85 | void nfsd_export_flush(void); |
||
86 | void exp_readlock(void); |
||
87 | void exp_readunlock(void); |
||
88 | struct svc_expkey * exp_find_key(struct auth_domain *clp, |
||
89 | int fsid_type, u32 *fsidv, |
||
90 | struct cache_req *reqp); |
||
91 | struct svc_export * exp_get_by_name(struct auth_domain *clp, |
||
92 | struct vfsmount *mnt, |
||
93 | struct dentry *dentry, |
||
94 | struct cache_req *reqp); |
||
95 | struct svc_export * exp_parent(struct auth_domain *clp, |
||
96 | struct vfsmount *mnt, |
||
97 | struct dentry *dentry, |
||
98 | struct cache_req *reqp); |
||
99 | int exp_rootfh(struct auth_domain *, |
||
100 | char *path, struct knfsd_fh *, int maxsize); |
||
101 | int exp_pseudoroot(struct auth_domain *, struct svc_fh *fhp, struct cache_req *creq); |
||
102 | int nfserrno(int errno); |
||
103 | |||
104 | extern void expkey_put(struct cache_head *item, struct cache_detail *cd); |
||
105 | extern void svc_export_put(struct cache_head *item, struct cache_detail *cd); |
||
106 | extern struct cache_detail svc_export_cache, svc_expkey_cache; |
||
107 | |||
108 | static inline void exp_put(struct svc_export *exp) |
||
109 | { |
||
110 | svc_export_put(&exp->h, &svc_export_cache); |
||
111 | } |
||
112 | |||
113 | static inline struct svc_export * |
||
114 | exp_find(struct auth_domain *clp, int fsid_type, u32 *fsidv, |
||
115 | struct cache_req *reqp) |
||
116 | { |
||
117 | struct svc_expkey *ek = exp_find_key(clp, fsid_type, fsidv, reqp); |
||
118 | if (ek && !IS_ERR(ek)) { |
||
119 | struct svc_export *exp = ek->ek_export; |
||
120 | int err; |
||
121 | cache_get(&exp->h); |
||
122 | expkey_put(&ek->h, &svc_expkey_cache); |
||
123 | if (exp && |
||
124 | (err = cache_check(&svc_export_cache, &exp->h, reqp))) |
||
125 | exp = ERR_PTR(err); |
||
126 | return exp; |
||
127 | } else |
||
128 | return ERR_PTR(PTR_ERR(ek)); |
||
129 | } |
||
130 | |||
131 | #endif /* __KERNEL__ */ |
||
132 | |||
133 | #endif /* NFSD_EXPORT_H */ |
||
134 |