1 /* 2 * NFS internal definitions 3 */ 4 5 #include <linux/mount.h> 6 7 struct nfs_clone_mount { 8 const struct super_block *sb; 9 const struct dentry *dentry; 10 struct nfs_fh *fh; 11 struct nfs_fattr *fattr; 12 char *hostname; 13 char *mnt_path; 14 struct sockaddr_in *addr; 15 rpc_authflavor_t authflavor; 16 }; 17 18 /* namespace-nfs4.c */ 19 #ifdef CONFIG_NFS_V4 20 extern struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry); 21 #else 22 static inline 23 struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry) 24 { 25 return ERR_PTR(-ENOENT); 26 } 27 #endif 28 29 /* callback_xdr.c */ 30 extern struct svc_version nfs4_callback_version1; 31 32 /* pagelist.c */ 33 extern int __init nfs_init_nfspagecache(void); 34 extern void __exit nfs_destroy_nfspagecache(void); 35 extern int __init nfs_init_readpagecache(void); 36 extern void __exit nfs_destroy_readpagecache(void); 37 extern int __init nfs_init_writepagecache(void); 38 extern void __exit nfs_destroy_writepagecache(void); 39 40 #ifdef CONFIG_NFS_DIRECTIO 41 extern int __init nfs_init_directcache(void); 42 extern void __exit nfs_destroy_directcache(void); 43 #else 44 #define nfs_init_directcache() (0) 45 #define nfs_destroy_directcache() do {} while(0) 46 #endif 47 48 /* nfs2xdr.c */ 49 extern struct rpc_procinfo nfs_procedures[]; 50 extern u32 * nfs_decode_dirent(u32 *, struct nfs_entry *, int); 51 52 /* nfs3xdr.c */ 53 extern struct rpc_procinfo nfs3_procedures[]; 54 extern u32 *nfs3_decode_dirent(u32 *, struct nfs_entry *, int); 55 56 /* nfs4xdr.c */ 57 extern int nfs_stat_to_errno(int); 58 extern u32 *nfs4_decode_dirent(u32 *p, struct nfs_entry *entry, int plus); 59 60 /* nfs4proc.c */ 61 extern struct rpc_procinfo nfs4_procedures[]; 62 63 extern int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry, 64 struct nfs4_fs_locations *fs_locations, 65 struct page *page); 66 67 /* inode.c */ 68 extern struct inode *nfs_alloc_inode(struct super_block *sb); 69 extern void nfs_destroy_inode(struct inode *); 70 extern int nfs_write_inode(struct inode *,int); 71 extern void nfs_clear_inode(struct inode *); 72 #ifdef CONFIG_NFS_V4 73 extern void nfs4_clear_inode(struct inode *); 74 #endif 75 76 /* super.c */ 77 extern struct file_system_type nfs_referral_nfs4_fs_type; 78 extern struct file_system_type clone_nfs_fs_type; 79 #ifdef CONFIG_NFS_V4 80 extern struct file_system_type clone_nfs4_fs_type; 81 #endif 82 #ifdef CONFIG_PROC_FS 83 extern struct rpc_stat nfs_rpcstat; 84 #endif 85 extern int __init register_nfs_fs(void); 86 extern void __exit unregister_nfs_fs(void); 87 88 /* namespace.c */ 89 extern char *nfs_path(const char *base, const struct dentry *dentry, 90 char *buffer, ssize_t buflen); 91 92 /* 93 * Determine the mount path as a string 94 */ 95 static inline char *nfs4_path(const struct dentry *dentry, char *buffer, ssize_t buflen) 96 { 97 return nfs_path(NFS_SB(dentry->d_sb)->mnt_path, dentry, buffer, buflen); 98 } 99 100 /* 101 * Determine the device name as a string 102 */ 103 static inline char *nfs_devname(const struct vfsmount *mnt_parent, 104 const struct dentry *dentry, 105 char *buffer, ssize_t buflen) 106 { 107 return nfs_path(mnt_parent->mnt_devname, dentry, buffer, buflen); 108 } 109 110 /* 111 * Determine the actual block size (and log2 thereof) 112 */ 113 static inline 114 unsigned long nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp) 115 { 116 /* make sure blocksize is a power of two */ 117 if ((bsize & (bsize - 1)) || nrbitsp) { 118 unsigned char nrbits; 119 120 for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--) 121 ; 122 bsize = 1 << nrbits; 123 if (nrbitsp) 124 *nrbitsp = nrbits; 125 } 126 127 return bsize; 128 } 129 130 /* 131 * Calculate the number of 512byte blocks used. 132 */ 133 static inline unsigned long nfs_calc_block_size(u64 tsize) 134 { 135 loff_t used = (tsize + 511) >> 9; 136 return (used > ULONG_MAX) ? ULONG_MAX : used; 137 } 138 139 /* 140 * Compute and set NFS server blocksize 141 */ 142 static inline 143 unsigned long nfs_block_size(unsigned long bsize, unsigned char *nrbitsp) 144 { 145 if (bsize < NFS_MIN_FILE_IO_SIZE) 146 bsize = NFS_DEF_FILE_IO_SIZE; 147 else if (bsize >= NFS_MAX_FILE_IO_SIZE) 148 bsize = NFS_MAX_FILE_IO_SIZE; 149 150 return nfs_block_bits(bsize, nrbitsp); 151 } 152 153 /* 154 * Determine the maximum file size for a superblock 155 */ 156 static inline 157 void nfs_super_set_maxbytes(struct super_block *sb, __u64 maxfilesize) 158 { 159 sb->s_maxbytes = (loff_t)maxfilesize; 160 if (sb->s_maxbytes > MAX_LFS_FILESIZE || sb->s_maxbytes <= 0) 161 sb->s_maxbytes = MAX_LFS_FILESIZE; 162 } 163 164 /* 165 * Check if the string represents a "valid" IPv4 address 166 */ 167 static inline int valid_ipaddr4(const char *buf) 168 { 169 int rc, count, in[4]; 170 171 rc = sscanf(buf, "%d.%d.%d.%d", &in[0], &in[1], &in[2], &in[3]); 172 if (rc != 4) 173 return -EINVAL; 174 for (count = 0; count < 4; count++) { 175 if (in[count] > 255) 176 return -EINVAL; 177 } 178 return 0; 179 } 180