Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */
2 : #ifndef LINUX_EXPORTFS_H
3 : #define LINUX_EXPORTFS_H 1
4 :
5 : #include <linux/types.h>
6 :
7 : struct dentry;
8 : struct iattr;
9 : struct inode;
10 : struct iomap;
11 : struct super_block;
12 : struct vfsmount;
13 :
14 : /* limit the handle size to NFSv4 handle size now */
15 : #define MAX_HANDLE_SZ 128
16 :
17 : /*
18 : * The fileid_type identifies how the file within the filesystem is encoded.
19 : * In theory this is freely set and parsed by the filesystem, but we try to
20 : * stick to conventions so we can share some generic code and don't confuse
21 : * sniffers like ethereal/wireshark.
22 : *
23 : * The filesystem must not use the value '0' or '0xff'.
24 : */
25 : enum fid_type {
26 : /*
27 : * The root, or export point, of the filesystem.
28 : * (Never actually passed down to the filesystem.
29 : */
30 : FILEID_ROOT = 0,
31 :
32 : /*
33 : * 32bit inode number, 32 bit generation number.
34 : */
35 : FILEID_INO32_GEN = 1,
36 :
37 : /*
38 : * 32bit inode number, 32 bit generation number,
39 : * 32 bit parent directory inode number.
40 : */
41 : FILEID_INO32_GEN_PARENT = 2,
42 :
43 : /*
44 : * 64 bit object ID, 64 bit root object ID,
45 : * 32 bit generation number.
46 : */
47 : FILEID_BTRFS_WITHOUT_PARENT = 0x4d,
48 :
49 : /*
50 : * 64 bit object ID, 64 bit root object ID,
51 : * 32 bit generation number,
52 : * 64 bit parent object ID, 32 bit parent generation.
53 : */
54 : FILEID_BTRFS_WITH_PARENT = 0x4e,
55 :
56 : /*
57 : * 64 bit object ID, 64 bit root object ID,
58 : * 32 bit generation number,
59 : * 64 bit parent object ID, 32 bit parent generation,
60 : * 64 bit parent root object ID.
61 : */
62 : FILEID_BTRFS_WITH_PARENT_ROOT = 0x4f,
63 :
64 : /*
65 : * 32 bit block number, 16 bit partition reference,
66 : * 16 bit unused, 32 bit generation number.
67 : */
68 : FILEID_UDF_WITHOUT_PARENT = 0x51,
69 :
70 : /*
71 : * 32 bit block number, 16 bit partition reference,
72 : * 16 bit unused, 32 bit generation number,
73 : * 32 bit parent block number, 32 bit parent generation number
74 : */
75 : FILEID_UDF_WITH_PARENT = 0x52,
76 :
77 : /*
78 : * 64 bit checkpoint number, 64 bit inode number,
79 : * 32 bit generation number.
80 : */
81 : FILEID_NILFS_WITHOUT_PARENT = 0x61,
82 :
83 : /*
84 : * 64 bit checkpoint number, 64 bit inode number,
85 : * 32 bit generation number, 32 bit parent generation.
86 : * 64 bit parent inode number.
87 : */
88 : FILEID_NILFS_WITH_PARENT = 0x62,
89 :
90 : /*
91 : * 32 bit generation number, 40 bit i_pos.
92 : */
93 : FILEID_FAT_WITHOUT_PARENT = 0x71,
94 :
95 : /*
96 : * 32 bit generation number, 40 bit i_pos,
97 : * 32 bit parent generation number, 40 bit parent i_pos
98 : */
99 : FILEID_FAT_WITH_PARENT = 0x72,
100 :
101 : /*
102 : * 128 bit child FID (struct lu_fid)
103 : * 128 bit parent FID (struct lu_fid)
104 : */
105 : FILEID_LUSTRE = 0x97,
106 :
107 : /*
108 : * 64 bit unique kernfs id
109 : */
110 : FILEID_KERNFS = 0xfe,
111 :
112 : /*
113 : * Filesystems must not use 0xff file ID.
114 : */
115 : FILEID_INVALID = 0xff,
116 : };
117 :
118 : struct fid {
119 : union {
120 : struct {
121 : u32 ino;
122 : u32 gen;
123 : u32 parent_ino;
124 : u32 parent_gen;
125 : } i32;
126 : struct {
127 : u32 block;
128 : u16 partref;
129 : u16 parent_partref;
130 : u32 generation;
131 : u32 parent_block;
132 : u32 parent_generation;
133 : } udf;
134 : DECLARE_FLEX_ARRAY(__u32, raw);
135 : };
136 : };
137 :
138 : #define EXPORT_FH_CONNECTABLE 0x1 /* Encode file handle with parent */
139 : #define EXPORT_FH_FID 0x2 /* File handle may be non-decodeable */
140 :
141 : /**
142 : * struct export_operations - for nfsd to communicate with file systems
143 : * @encode_fh: encode a file handle fragment from a dentry
144 : * @fh_to_dentry: find the implied object and get a dentry for it
145 : * @fh_to_parent: find the implied object's parent and get a dentry for it
146 : * @get_name: find the name for a given inode in a given directory
147 : * @get_parent: find the parent of a given directory
148 : * @commit_metadata: commit metadata changes to stable storage
149 : *
150 : * See Documentation/filesystems/nfs/exporting.rst for details on how to use
151 : * this interface correctly.
152 : *
153 : * encode_fh:
154 : * @encode_fh should store in the file handle fragment @fh (using at most
155 : * @max_len bytes) information that can be used by @decode_fh to recover the
156 : * file referred to by the &struct dentry @de. If @flag has CONNECTABLE bit
157 : * set, the encode_fh() should store sufficient information so that a good
158 : * attempt can be made to find not only the file but also it's place in the
159 : * filesystem. This typically means storing a reference to de->d_parent in
160 : * the filehandle fragment. encode_fh() should return the fileid_type on
161 : * success and on error returns 255 (if the space needed to encode fh is
162 : * greater than @max_len*4 bytes). On error @max_len contains the minimum
163 : * size(in 4 byte unit) needed to encode the file handle.
164 : *
165 : * fh_to_dentry:
166 : * @fh_to_dentry is given a &struct super_block (@sb) and a file handle
167 : * fragment (@fh, @fh_len). It should return a &struct dentry which refers
168 : * to the same file that the file handle fragment refers to. If it cannot,
169 : * it should return a %NULL pointer if the file cannot be found, or an
170 : * %ERR_PTR error code of %ENOMEM if a memory allocation failure occurred.
171 : * Any other error code is treated like %NULL, and will cause an %ESTALE error
172 : * for callers of exportfs_decode_fh().
173 : * Any suitable dentry can be returned including, if necessary, a new dentry
174 : * created with d_alloc_root. The caller can then find any other extant
175 : * dentries by following the d_alias links.
176 : *
177 : * fh_to_parent:
178 : * Same as @fh_to_dentry, except that it returns a pointer to the parent
179 : * dentry if it was encoded into the filehandle fragment by @encode_fh.
180 : *
181 : * get_name:
182 : * @get_name should find a name for the given @child in the given @parent
183 : * directory. The name should be stored in the @name (with the
184 : * understanding that it is already pointing to a %NAME_MAX+1 sized
185 : * buffer. get_name() should return %0 on success, a negative error code
186 : * or error. @get_name will be called without @parent->i_mutex held.
187 : *
188 : * get_parent:
189 : * @get_parent should find the parent directory for the given @child which
190 : * is also a directory. In the event that it cannot be found, or storage
191 : * space cannot be allocated, a %ERR_PTR should be returned.
192 : *
193 : * commit_metadata:
194 : * @commit_metadata should commit metadata changes to stable storage.
195 : *
196 : * Locking rules:
197 : * get_parent is called with child->d_inode->i_mutex down
198 : * get_name is not (which is possibly inconsistent)
199 : */
200 :
201 : struct export_operations {
202 : int (*encode_fh)(struct inode *inode, __u32 *fh, int *max_len,
203 : struct inode *parent);
204 : struct dentry * (*fh_to_dentry)(struct super_block *sb, struct fid *fid,
205 : int fh_len, int fh_type);
206 : struct dentry * (*fh_to_parent)(struct super_block *sb, struct fid *fid,
207 : int fh_len, int fh_type);
208 : int (*get_name)(struct dentry *parent, char *name,
209 : struct dentry *child);
210 : struct dentry * (*get_parent)(struct dentry *child);
211 : int (*commit_metadata)(struct inode *inode);
212 :
213 : int (*get_uuid)(struct super_block *sb, u8 *buf, u32 *len, u64 *offset);
214 : int (*map_blocks)(struct inode *inode, loff_t offset,
215 : u64 len, struct iomap *iomap,
216 : bool write, u32 *device_generation);
217 : int (*commit_blocks)(struct inode *inode, struct iomap *iomaps,
218 : int nr_iomaps, struct iattr *iattr);
219 : #define EXPORT_OP_NOWCC (0x1) /* don't collect v3 wcc data */
220 : #define EXPORT_OP_NOSUBTREECHK (0x2) /* no subtree checking */
221 : #define EXPORT_OP_CLOSE_BEFORE_UNLINK (0x4) /* close files before unlink */
222 : #define EXPORT_OP_REMOTE_FS (0x8) /* Filesystem is remote */
223 : #define EXPORT_OP_NOATOMIC_ATTR (0x10) /* Filesystem cannot supply
224 : atomic attribute updates
225 : */
226 : #define EXPORT_OP_FLUSH_ON_CLOSE (0x20) /* fs flushes file data on close */
227 : unsigned long flags;
228 : };
229 :
230 : extern int exportfs_encode_inode_fh(struct inode *inode, struct fid *fid,
231 : int *max_len, struct inode *parent,
232 : int flags);
233 : extern int exportfs_encode_fh(struct dentry *dentry, struct fid *fid,
234 : int *max_len, int flags);
235 :
236 : static inline int exportfs_encode_fid(struct inode *inode, struct fid *fid,
237 : int *max_len)
238 : {
239 0 : return exportfs_encode_inode_fh(inode, fid, max_len, NULL,
240 : EXPORT_FH_FID);
241 : }
242 :
243 : extern struct dentry *exportfs_decode_fh_raw(struct vfsmount *mnt,
244 : struct fid *fid, int fh_len,
245 : int fileid_type,
246 : int (*acceptable)(void *, struct dentry *),
247 : void *context);
248 : extern struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
249 : int fh_len, int fileid_type, int (*acceptable)(void *, struct dentry *),
250 : void *context);
251 :
252 : /*
253 : * Generic helpers for filesystems.
254 : */
255 : extern struct dentry *generic_fh_to_dentry(struct super_block *sb,
256 : struct fid *fid, int fh_len, int fh_type,
257 : struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen));
258 : extern struct dentry *generic_fh_to_parent(struct super_block *sb,
259 : struct fid *fid, int fh_len, int fh_type,
260 : struct inode *(*get_inode) (struct super_block *sb, u64 ino, u32 gen));
261 :
262 : #endif /* LINUX_EXPORTFS_H */
|