aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/exportfs.h119
-rw-r--r--include/linux/fs.h114
2 files changed, 120 insertions, 113 deletions
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h
new file mode 100644
index 000000000000..fdc306fbba50
--- /dev/null
+++ b/include/linux/exportfs.h
@@ -0,0 +1,119 @@
1#ifndef LINUX_EXPORTFS_H
2#define LINUX_EXPORTFS_H 1
3
4#include <linux/types.h>
5
6struct dentry;
7struct super_block;
8
9
10/**
11 * struct export_operations - for nfsd to communicate with file systems
12 * @decode_fh: decode a file handle fragment and return a &struct dentry
13 * @encode_fh: encode a file handle fragment from a dentry
14 * @get_name: find the name for a given inode in a given directory
15 * @get_parent: find the parent of a given directory
16 * @get_dentry: find a dentry for the inode given a file handle sub-fragment
17 * @find_exported_dentry:
18 * set by the exporting module to a standard helper function.
19 *
20 * Description:
21 * The export_operations structure provides a means for nfsd to communicate
22 * with a particular exported file system - particularly enabling nfsd and
23 * the filesystem to co-operate when dealing with file handles.
24 *
25 * export_operations contains two basic operation for dealing with file
26 * handles, decode_fh() and encode_fh(), and allows for some other
27 * operations to be defined which standard helper routines use to get
28 * specific information from the filesystem.
29 *
30 * nfsd encodes information use to determine which filesystem a filehandle
31 * applies to in the initial part of the file handle. The remainder, termed
32 * a file handle fragment, is controlled completely by the filesystem. The
33 * standard helper routines assume that this fragment will contain one or
34 * two sub-fragments, one which identifies the file, and one which may be
35 * used to identify the (a) directory containing the file.
36 *
37 * In some situations, nfsd needs to get a dentry which is connected into a
38 * specific part of the file tree. To allow for this, it passes the
39 * function acceptable() together with a @context which can be used to see
40 * if the dentry is acceptable. As there can be multiple dentrys for a
41 * given file, the filesystem should check each one for acceptability before
42 * looking for the next. As soon as an acceptable one is found, it should
43 * be returned.
44 *
45 * decode_fh:
46 * @decode_fh is given a &struct super_block (@sb), a file handle fragment
47 * (@fh, @fh_len) and an acceptability testing function (@acceptable,
48 * @context). It should return a &struct dentry which refers to the same
49 * file that the file handle fragment refers to, and which passes the
50 * acceptability test. If it cannot, it should return a %NULL pointer if
51 * the file was found but no acceptable &dentries were available, or a
52 * %ERR_PTR error code indicating why it couldn't be found (e.g. %ENOENT or
53 * %ENOMEM).
54 *
55 * encode_fh:
56 * @encode_fh should store in the file handle fragment @fh (using at most
57 * @max_len bytes) information that can be used by @decode_fh to recover the
58 * file refered to by the &struct dentry @de. If the @connectable flag is
59 * set, the encode_fh() should store sufficient information so that a good
60 * attempt can be made to find not only the file but also it's place in the
61 * filesystem. This typically means storing a reference to de->d_parent in
62 * the filehandle fragment. encode_fh() should return the number of bytes
63 * stored or a negative error code such as %-ENOSPC
64 *
65 * get_name:
66 * @get_name should find a name for the given @child in the given @parent
67 * directory. The name should be stored in the @name (with the
68 * understanding that it is already pointing to a a %NAME_MAX+1 sized
69 * buffer. get_name() should return %0 on success, a negative error code
70 * or error. @get_name will be called without @parent->i_mutex held.
71 *
72 * get_parent:
73 * @get_parent should find the parent directory for the given @child which
74 * is also a directory. In the event that it cannot be found, or storage
75 * space cannot be allocated, a %ERR_PTR should be returned.
76 *
77 * get_dentry:
78 * Given a &super_block (@sb) and a pointer to a file-system specific inode
79 * identifier, possibly an inode number, (@inump) get_dentry() should find
80 * the identified inode and return a dentry for that inode. Any suitable
81 * dentry can be returned including, if necessary, a new dentry created with
82 * d_alloc_root. The caller can then find any other extant dentrys by
83 * following the d_alias links. If a new dentry was created using
84 * d_alloc_root, DCACHE_NFSD_DISCONNECTED should be set, and the dentry
85 * should be d_rehash()ed.
86 *
87 * If the inode cannot be found, either a %NULL pointer or an %ERR_PTR code
88 * can be returned. The @inump will be whatever was passed to
89 * nfsd_find_fh_dentry() in either the @obj or @parent parameters.
90 *
91 * Locking rules:
92 * get_parent is called with child->d_inode->i_mutex down
93 * get_name is not (which is possibly inconsistent)
94 */
95
96struct export_operations {
97 struct dentry *(*decode_fh)(struct super_block *sb, __u32 *fh,
98 int fh_len, int fh_type,
99 int (*acceptable)(void *context, struct dentry *de),
100 void *context);
101 int (*encode_fh)(struct dentry *de, __u32 *fh, int *max_len,
102 int connectable);
103 int (*get_name)(struct dentry *parent, char *name,
104 struct dentry *child);
105 struct dentry * (*get_parent)(struct dentry *child);
106 struct dentry * (*get_dentry)(struct super_block *sb, void *inump);
107
108 /* This is set by the exporting module to a standard helper */
109 struct dentry * (*find_exported_dentry)(
110 struct super_block *sb, void *obj, void *parent,
111 int (*acceptable)(void *context, struct dentry *de),
112 void *context);
113};
114
115extern struct dentry *find_exported_dentry(struct super_block *sb, void *obj,
116 void *parent, int (*acceptable)(void *context, struct dentry *de),
117 void *context);
118
119#endif /* LINUX_EXPORTFS_H */
diff --git a/include/linux/fs.h b/include/linux/fs.h
index aa74f7de9dcd..58ce336d4a6b 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -289,6 +289,7 @@ extern int dir_notify_enable;
289#include <asm/semaphore.h> 289#include <asm/semaphore.h>
290#include <asm/byteorder.h> 290#include <asm/byteorder.h>
291 291
292struct export_operations;
292struct hd_geometry; 293struct hd_geometry;
293struct iovec; 294struct iovec;
294struct nameidata; 295struct nameidata;
@@ -1278,119 +1279,6 @@ static inline void file_accessed(struct file *file)
1278 1279
1279int sync_inode(struct inode *inode, struct writeback_control *wbc); 1280int sync_inode(struct inode *inode, struct writeback_control *wbc);
1280 1281
1281/**
1282 * struct export_operations - for nfsd to communicate with file systems
1283 * @decode_fh: decode a file handle fragment and return a &struct dentry
1284 * @encode_fh: encode a file handle fragment from a dentry
1285 * @get_name: find the name for a given inode in a given directory
1286 * @get_parent: find the parent of a given directory
1287 * @get_dentry: find a dentry for the inode given a file handle sub-fragment
1288 * @find_exported_dentry:
1289 * set by the exporting module to a standard helper function.
1290 *
1291 * Description:
1292 * The export_operations structure provides a means for nfsd to communicate
1293 * with a particular exported file system - particularly enabling nfsd and
1294 * the filesystem to co-operate when dealing with file handles.
1295 *
1296 * export_operations contains two basic operation for dealing with file
1297 * handles, decode_fh() and encode_fh(), and allows for some other
1298 * operations to be defined which standard helper routines use to get
1299 * specific information from the filesystem.
1300 *
1301 * nfsd encodes information use to determine which filesystem a filehandle
1302 * applies to in the initial part of the file handle. The remainder, termed
1303 * a file handle fragment, is controlled completely by the filesystem. The
1304 * standard helper routines assume that this fragment will contain one or
1305 * two sub-fragments, one which identifies the file, and one which may be
1306 * used to identify the (a) directory containing the file.
1307 *
1308 * In some situations, nfsd needs to get a dentry which is connected into a
1309 * specific part of the file tree. To allow for this, it passes the
1310 * function acceptable() together with a @context which can be used to see
1311 * if the dentry is acceptable. As there can be multiple dentrys for a
1312 * given file, the filesystem should check each one for acceptability before
1313 * looking for the next. As soon as an acceptable one is found, it should
1314 * be returned.
1315 *
1316 * decode_fh:
1317 * @decode_fh is given a &struct super_block (@sb), a file handle fragment
1318 * (@fh, @fh_len) and an acceptability testing function (@acceptable,
1319 * @context). It should return a &struct dentry which refers to the same
1320 * file that the file handle fragment refers to, and which passes the
1321 * acceptability test. If it cannot, it should return a %NULL pointer if
1322 * the file was found but no acceptable &dentries were available, or a
1323 * %ERR_PTR error code indicating why it couldn't be found (e.g. %ENOENT or
1324 * %ENOMEM).
1325 *
1326 * encode_fh:
1327 * @encode_fh should store in the file handle fragment @fh (using at most
1328 * @max_len bytes) information that can be used by @decode_fh to recover the
1329 * file refered to by the &struct dentry @de. If the @connectable flag is
1330 * set, the encode_fh() should store sufficient information so that a good
1331 * attempt can be made to find not only the file but also it's place in the
1332 * filesystem. This typically means storing a reference to de->d_parent in
1333 * the filehandle fragment. encode_fh() should return the number of bytes
1334 * stored or a negative error code such as %-ENOSPC
1335 *
1336 * get_name:
1337 * @get_name should find a name for the given @child in the given @parent
1338 * directory. The name should be stored in the @name (with the
1339 * understanding that it is already pointing to a a %NAME_MAX+1 sized
1340 * buffer. get_name() should return %0 on success, a negative error code
1341 * or error. @get_name will be called without @parent->i_mutex held.
1342 *
1343 * get_parent:
1344 * @get_parent should find the parent directory for the given @child which
1345 * is also a directory. In the event that it cannot be found, or storage
1346 * space cannot be allocated, a %ERR_PTR should be returned.
1347 *
1348 * get_dentry:
1349 * Given a &super_block (@sb) and a pointer to a file-system specific inode
1350 * identifier, possibly an inode number, (@inump) get_dentry() should find
1351 * the identified inode and return a dentry for that inode. Any suitable
1352 * dentry can be returned including, if necessary, a new dentry created with
1353 * d_alloc_root. The caller can then find any other extant dentrys by
1354 * following the d_alias links. If a new dentry was created using
1355 * d_alloc_root, DCACHE_NFSD_DISCONNECTED should be set, and the dentry
1356 * should be d_rehash()ed.
1357 *
1358 * If the inode cannot be found, either a %NULL pointer or an %ERR_PTR code
1359 * can be returned. The @inump will be whatever was passed to
1360 * nfsd_find_fh_dentry() in either the @obj or @parent parameters.
1361 *
1362 * Locking rules:
1363 * get_parent is called with child->d_inode->i_mutex down
1364 * get_name is not (which is possibly inconsistent)
1365 */
1366
1367struct export_operations {
1368 struct dentry *(*decode_fh)(struct super_block *sb, __u32 *fh, int fh_len, int fh_type,
1369 int (*acceptable)(void *context, struct dentry *de),
1370 void *context);
1371 int (*encode_fh)(struct dentry *de, __u32 *fh, int *max_len,
1372 int connectable);
1373
1374 /* the following are only called from the filesystem itself */
1375 int (*get_name)(struct dentry *parent, char *name,
1376 struct dentry *child);
1377 struct dentry * (*get_parent)(struct dentry *child);
1378 struct dentry * (*get_dentry)(struct super_block *sb, void *inump);
1379
1380 /* This is set by the exporting module to a standard helper */
1381 struct dentry * (*find_exported_dentry)(
1382 struct super_block *sb, void *obj, void *parent,
1383 int (*acceptable)(void *context, struct dentry *de),
1384 void *context);
1385
1386
1387};
1388
1389extern struct dentry *
1390find_exported_dentry(struct super_block *sb, void *obj, void *parent,
1391 int (*acceptable)(void *context, struct dentry *de),
1392 void *context);
1393
1394struct file_system_type { 1282struct file_system_type {
1395 const char *name; 1283 const char *name;
1396 int fs_flags; 1284 int fs_flags;