at v2.6.23 6.0 kB view raw
1#ifndef LINUX_EXPORTFS_H 2#define LINUX_EXPORTFS_H 1 3 4#include <linux/types.h> 5 6struct dentry; 7struct super_block; 8struct vfsmount; 9 10 11/** 12 * struct export_operations - for nfsd to communicate with file systems 13 * @decode_fh: decode a file handle fragment and return a &struct dentry 14 * @encode_fh: encode a file handle fragment from a dentry 15 * @get_name: find the name for a given inode in a given directory 16 * @get_parent: find the parent of a given directory 17 * @get_dentry: find a dentry for the inode given a file handle sub-fragment 18 * @find_exported_dentry: 19 * set by the exporting module to a standard helper function. 20 * 21 * Description: 22 * The export_operations structure provides a means for nfsd to communicate 23 * with a particular exported file system - particularly enabling nfsd and 24 * the filesystem to co-operate when dealing with file handles. 25 * 26 * export_operations contains two basic operation for dealing with file 27 * handles, decode_fh() and encode_fh(), and allows for some other 28 * operations to be defined which standard helper routines use to get 29 * specific information from the filesystem. 30 * 31 * nfsd encodes information use to determine which filesystem a filehandle 32 * applies to in the initial part of the file handle. The remainder, termed 33 * a file handle fragment, is controlled completely by the filesystem. The 34 * standard helper routines assume that this fragment will contain one or 35 * two sub-fragments, one which identifies the file, and one which may be 36 * used to identify the (a) directory containing the file. 37 * 38 * In some situations, nfsd needs to get a dentry which is connected into a 39 * specific part of the file tree. To allow for this, it passes the 40 * function acceptable() together with a @context which can be used to see 41 * if the dentry is acceptable. As there can be multiple dentrys for a 42 * given file, the filesystem should check each one for acceptability before 43 * looking for the next. As soon as an acceptable one is found, it should 44 * be returned. 45 * 46 * decode_fh: 47 * @decode_fh is given a &struct super_block (@sb), a file handle fragment 48 * (@fh, @fh_len) and an acceptability testing function (@acceptable, 49 * @context). It should return a &struct dentry which refers to the same 50 * file that the file handle fragment refers to, and which passes the 51 * acceptability test. If it cannot, it should return a %NULL pointer if 52 * the file was found but no acceptable &dentries were available, or a 53 * %ERR_PTR error code indicating why it couldn't be found (e.g. %ENOENT or 54 * %ENOMEM). 55 * 56 * encode_fh: 57 * @encode_fh should store in the file handle fragment @fh (using at most 58 * @max_len bytes) information that can be used by @decode_fh to recover the 59 * file refered to by the &struct dentry @de. If the @connectable flag is 60 * set, the encode_fh() should store sufficient information so that a good 61 * attempt can be made to find not only the file but also it's place in the 62 * filesystem. This typically means storing a reference to de->d_parent in 63 * the filehandle fragment. encode_fh() should return the number of bytes 64 * stored or a negative error code such as %-ENOSPC 65 * 66 * get_name: 67 * @get_name should find a name for the given @child in the given @parent 68 * directory. The name should be stored in the @name (with the 69 * understanding that it is already pointing to a a %NAME_MAX+1 sized 70 * buffer. get_name() should return %0 on success, a negative error code 71 * or error. @get_name will be called without @parent->i_mutex held. 72 * 73 * get_parent: 74 * @get_parent should find the parent directory for the given @child which 75 * is also a directory. In the event that it cannot be found, or storage 76 * space cannot be allocated, a %ERR_PTR should be returned. 77 * 78 * get_dentry: 79 * Given a &super_block (@sb) and a pointer to a file-system specific inode 80 * identifier, possibly an inode number, (@inump) get_dentry() should find 81 * the identified inode and return a dentry for that inode. Any suitable 82 * dentry can be returned including, if necessary, a new dentry created with 83 * d_alloc_root. The caller can then find any other extant dentrys by 84 * following the d_alias links. If a new dentry was created using 85 * d_alloc_root, DCACHE_NFSD_DISCONNECTED should be set, and the dentry 86 * should be d_rehash()ed. 87 * 88 * If the inode cannot be found, either a %NULL pointer or an %ERR_PTR code 89 * can be returned. The @inump will be whatever was passed to 90 * nfsd_find_fh_dentry() in either the @obj or @parent parameters. 91 * 92 * Locking rules: 93 * get_parent is called with child->d_inode->i_mutex down 94 * get_name is not (which is possibly inconsistent) 95 */ 96 97struct export_operations { 98 struct dentry *(*decode_fh)(struct super_block *sb, __u32 *fh, 99 int fh_len, int fh_type, 100 int (*acceptable)(void *context, struct dentry *de), 101 void *context); 102 int (*encode_fh)(struct dentry *de, __u32 *fh, int *max_len, 103 int connectable); 104 int (*get_name)(struct dentry *parent, char *name, 105 struct dentry *child); 106 struct dentry * (*get_parent)(struct dentry *child); 107 struct dentry * (*get_dentry)(struct super_block *sb, void *inump); 108 109 /* This is set by the exporting module to a standard helper */ 110 struct dentry * (*find_exported_dentry)( 111 struct super_block *sb, void *obj, void *parent, 112 int (*acceptable)(void *context, struct dentry *de), 113 void *context); 114}; 115 116extern struct dentry *find_exported_dentry(struct super_block *sb, void *obj, 117 void *parent, int (*acceptable)(void *context, struct dentry *de), 118 void *context); 119 120extern int exportfs_encode_fh(struct dentry *dentry, __u32 *fh, int *max_len, 121 int connectable); 122extern struct dentry *exportfs_decode_fh(struct vfsmount *mnt, __u32 *fh, 123 int fh_len, int fileid_type, int (*acceptable)(void *, struct dentry *), 124 void *context); 125 126#endif /* LINUX_EXPORTFS_H */