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 nfs_destroy_nfspagecache(void); 35 extern int __init nfs_init_readpagecache(void); 36 extern void nfs_destroy_readpagecache(void); 37 extern int __init nfs_init_writepagecache(void); 38 extern void nfs_destroy_writepagecache(void); 39 40 #ifdef CONFIG_NFS_DIRECTIO 41 extern int __init nfs_init_directcache(void); 42 extern void 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 #ifdef CONFIG_NFS_V4 62 extern struct rpc_procinfo nfs4_procedures[]; 63 64 extern int nfs4_proc_fs_locations(struct inode *dir, struct dentry *dentry, 65 struct nfs4_fs_locations *fs_locations, 66 struct page *page); 67 #endif 68 69 /* inode.c */ 70 extern struct inode *nfs_alloc_inode(struct super_block *sb); 71 extern void nfs_destroy_inode(struct inode *); 72 extern int nfs_write_inode(struct inode *,int); 73 extern void nfs_clear_inode(struct inode *); 74 #ifdef CONFIG_NFS_V4 75 extern void nfs4_clear_inode(struct inode *); 76 #endif 77 78 /* super.c */ 79 extern struct file_system_type nfs_referral_nfs4_fs_type; 80 extern struct file_system_type clone_nfs_fs_type; 81 #ifdef CONFIG_NFS_V4 82 extern struct file_system_type clone_nfs4_fs_type; 83 #endif 84 85 extern struct rpc_stat nfs_rpcstat; 86 87 extern int __init register_nfs_fs(void); 88 extern void __exit unregister_nfs_fs(void); 89 90 /* namespace.c */ 91 extern char *nfs_path(const char *base, const struct dentry *dentry, 92 char *buffer, ssize_t buflen); 93 94 /* 95 * Determine the mount path as a string 96 */ 97 static inline char * 98 nfs4_path(const struct dentry *dentry, char *buffer, ssize_t buflen) 99 { 100 #ifdef CONFIG_NFS_V4 101 return nfs_path(NFS_SB(dentry->d_sb)->mnt_path, dentry, buffer, buflen); 102 #else 103 return NULL; 104 #endif 105 } 106 107 /* 108 * Determine the device name as a string 109 */ 110 static inline char *nfs_devname(const struct vfsmount *mnt_parent, 111 const struct dentry *dentry, 112 char *buffer, ssize_t buflen) 113 { 114 return nfs_path(mnt_parent->mnt_devname, dentry, buffer, buflen); 115 } 116 117 /* 118 * Determine the actual block size (and log2 thereof) 119 */ 120 static inline 121 unsigned long nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp) 122 { 123 /* make sure blocksize is a power of two */ 124 if ((bsize & (bsize - 1)) || nrbitsp) { 125 unsigned char nrbits; 126 127 for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--) 128 ; 129 bsize = 1 << nrbits; 130 if (nrbitsp) 131 *nrbitsp = nrbits; 132 } 133 134 return bsize; 135 } 136 137 /* 138 * Calculate the number of 512byte blocks used. 139 */ 140 static inline unsigned long nfs_calc_block_size(u64 tsize) 141 { 142 loff_t used = (tsize + 511) >> 9; 143 return (used > ULONG_MAX) ? ULONG_MAX : used; 144 } 145 146 /* 147 * Compute and set NFS server blocksize 148 */ 149 static inline 150 unsigned long nfs_block_size(unsigned long bsize, unsigned char *nrbitsp) 151 { 152 if (bsize < NFS_MIN_FILE_IO_SIZE) 153 bsize = NFS_DEF_FILE_IO_SIZE; 154 else if (bsize >= NFS_MAX_FILE_IO_SIZE) 155 bsize = NFS_MAX_FILE_IO_SIZE; 156 157 return nfs_block_bits(bsize, nrbitsp); 158 } 159 160 /* 161 * Determine the maximum file size for a superblock 162 */ 163 static inline 164 void nfs_super_set_maxbytes(struct super_block *sb, __u64 maxfilesize) 165 { 166 sb->s_maxbytes = (loff_t)maxfilesize; 167 if (sb->s_maxbytes > MAX_LFS_FILESIZE || sb->s_maxbytes <= 0) 168 sb->s_maxbytes = MAX_LFS_FILESIZE; 169 } 170 171 /* 172 * Check if the string represents a "valid" IPv4 address 173 */ 174 static inline int valid_ipaddr4(const char *buf) 175 { 176 int rc, count, in[4]; 177 178 rc = sscanf(buf, "%d.%d.%d.%d", &in[0], &in[1], &in[2], &in[3]); 179 if (rc != 4) 180 return -EINVAL; 181 for (count = 0; count < 4; count++) { 182 if (in[count] > 255) 183 return -EINVAL; 184 } 185 return 0; 186 } 187