1/* 2 * NFS internal definitions 3 */ 4 5#include <linux/mount.h> 6 7struct nfs_string; 8struct nfs_mount_data; 9struct nfs4_mount_data; 10 11#define NFS_MAX_READAHEAD (RPC_DEF_SLOT_TABLE - 1) 12 13struct nfs_clone_mount { 14 const struct super_block *sb; 15 const struct dentry *dentry; 16 struct nfs_fh *fh; 17 struct nfs_fattr *fattr; 18 char *hostname; 19 char *mnt_path; 20 struct sockaddr_in *addr; 21 rpc_authflavor_t authflavor; 22}; 23 24/* client.c */ 25extern struct rpc_program nfs_program; 26 27extern void nfs_put_client(struct nfs_client *); 28extern struct nfs_client *nfs_find_client(const struct sockaddr_in *, int); 29extern struct nfs_server *nfs_create_server(const struct nfs_mount_data *, 30 struct nfs_fh *); 31extern struct nfs_server *nfs4_create_server(const struct nfs4_mount_data *, 32 const char *, 33 const struct sockaddr_in *, 34 const char *, 35 const char *, 36 rpc_authflavor_t, 37 struct nfs_fh *); 38extern struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *, 39 struct nfs_fh *); 40extern void nfs_free_server(struct nfs_server *server); 41extern struct nfs_server *nfs_clone_server(struct nfs_server *, 42 struct nfs_fh *, 43 struct nfs_fattr *); 44#ifdef CONFIG_PROC_FS 45extern int __init nfs_fs_proc_init(void); 46extern void nfs_fs_proc_exit(void); 47#else 48static inline int nfs_fs_proc_init(void) 49{ 50 return 0; 51} 52static inline void nfs_fs_proc_exit(void) 53{ 54} 55#endif 56 57/* nfs4namespace.c */ 58#ifdef CONFIG_NFS_V4 59extern struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry); 60#else 61static inline 62struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry) 63{ 64 return ERR_PTR(-ENOENT); 65} 66#endif 67 68/* callback_xdr.c */ 69extern struct svc_version nfs4_callback_version1; 70 71/* pagelist.c */ 72extern int __init nfs_init_nfspagecache(void); 73extern void nfs_destroy_nfspagecache(void); 74extern int __init nfs_init_readpagecache(void); 75extern void nfs_destroy_readpagecache(void); 76extern int __init nfs_init_writepagecache(void); 77extern void nfs_destroy_writepagecache(void); 78 79#ifdef CONFIG_NFS_DIRECTIO 80extern int __init nfs_init_directcache(void); 81extern void nfs_destroy_directcache(void); 82#else 83#define nfs_init_directcache() (0) 84#define nfs_destroy_directcache() do {} while(0) 85#endif 86 87/* nfs2xdr.c */ 88extern int nfs_stat_to_errno(int); 89extern struct rpc_procinfo nfs_procedures[]; 90extern __be32 * nfs_decode_dirent(__be32 *, struct nfs_entry *, int); 91 92/* nfs3xdr.c */ 93extern struct rpc_procinfo nfs3_procedures[]; 94extern __be32 *nfs3_decode_dirent(__be32 *, struct nfs_entry *, int); 95 96/* nfs4xdr.c */ 97#ifdef CONFIG_NFS_V4 98extern __be32 *nfs4_decode_dirent(__be32 *p, struct nfs_entry *entry, int plus); 99#endif 100 101/* nfs4proc.c */ 102#ifdef CONFIG_NFS_V4 103extern struct rpc_procinfo nfs4_procedures[]; 104#endif 105 106/* dir.c */ 107extern int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask); 108 109/* inode.c */ 110extern struct inode *nfs_alloc_inode(struct super_block *sb); 111extern void nfs_destroy_inode(struct inode *); 112extern int nfs_write_inode(struct inode *,int); 113extern void nfs_clear_inode(struct inode *); 114#ifdef CONFIG_NFS_V4 115extern void nfs4_clear_inode(struct inode *); 116#endif 117 118/* super.c */ 119extern struct file_system_type nfs_xdev_fs_type; 120#ifdef CONFIG_NFS_V4 121extern struct file_system_type nfs4_xdev_fs_type; 122extern struct file_system_type nfs4_referral_fs_type; 123#endif 124 125extern struct rpc_stat nfs_rpcstat; 126 127extern int __init register_nfs_fs(void); 128extern void __exit unregister_nfs_fs(void); 129 130/* namespace.c */ 131extern char *nfs_path(const char *base, 132 const struct dentry *droot, 133 const struct dentry *dentry, 134 char *buffer, ssize_t buflen); 135 136/* getroot.c */ 137extern struct dentry *nfs_get_root(struct super_block *, struct nfs_fh *); 138#ifdef CONFIG_NFS_V4 139extern struct dentry *nfs4_get_root(struct super_block *, struct nfs_fh *); 140 141extern int nfs4_path_walk(struct nfs_server *server, 142 struct nfs_fh *mntfh, 143 const char *path); 144#endif 145 146/* 147 * Determine the device name as a string 148 */ 149static inline char *nfs_devname(const struct vfsmount *mnt_parent, 150 const struct dentry *dentry, 151 char *buffer, ssize_t buflen) 152{ 153 return nfs_path(mnt_parent->mnt_devname, mnt_parent->mnt_root, 154 dentry, buffer, buflen); 155} 156 157/* 158 * Determine the actual block size (and log2 thereof) 159 */ 160static inline 161unsigned long nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp) 162{ 163 /* make sure blocksize is a power of two */ 164 if ((bsize & (bsize - 1)) || nrbitsp) { 165 unsigned char nrbits; 166 167 for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--) 168 ; 169 bsize = 1 << nrbits; 170 if (nrbitsp) 171 *nrbitsp = nrbits; 172 } 173 174 return bsize; 175} 176 177/* 178 * Calculate the number of 512byte blocks used. 179 */ 180static inline unsigned long nfs_calc_block_size(u64 tsize) 181{ 182 loff_t used = (tsize + 511) >> 9; 183 return (used > ULONG_MAX) ? ULONG_MAX : used; 184} 185 186/* 187 * Compute and set NFS server blocksize 188 */ 189static inline 190unsigned long nfs_block_size(unsigned long bsize, unsigned char *nrbitsp) 191{ 192 if (bsize < NFS_MIN_FILE_IO_SIZE) 193 bsize = NFS_DEF_FILE_IO_SIZE; 194 else if (bsize >= NFS_MAX_FILE_IO_SIZE) 195 bsize = NFS_MAX_FILE_IO_SIZE; 196 197 return nfs_block_bits(bsize, nrbitsp); 198} 199 200/* 201 * Determine the maximum file size for a superblock 202 */ 203static inline 204void nfs_super_set_maxbytes(struct super_block *sb, __u64 maxfilesize) 205{ 206 sb->s_maxbytes = (loff_t)maxfilesize; 207 if (sb->s_maxbytes > MAX_LFS_FILESIZE || sb->s_maxbytes <= 0) 208 sb->s_maxbytes = MAX_LFS_FILESIZE; 209} 210 211/* 212 * Determine the number of bytes of data the page contains 213 */ 214static inline 215unsigned int nfs_page_length(struct page *page) 216{ 217 loff_t i_size = i_size_read(page->mapping->host); 218 219 if (i_size > 0) { 220 pgoff_t end_index = (i_size - 1) >> PAGE_CACHE_SHIFT; 221 if (page->index < end_index) 222 return PAGE_CACHE_SIZE; 223 if (page->index == end_index) 224 return ((i_size - 1) & ~PAGE_CACHE_MASK) + 1; 225 } 226 return 0; 227} 228 229/* 230 * Determine the number of pages in an array of length 'len' and 231 * with a base offset of 'base' 232 */ 233static inline 234unsigned int nfs_page_array_len(unsigned int base, size_t len) 235{ 236 return ((unsigned long)len + (unsigned long)base + 237 PAGE_SIZE - 1) >> PAGE_SHIFT; 238} 239