1 /* 2 * NFS internal definitions 3 */ 4 5 #include "nfs4_fs.h" 6 #include <linux/mount.h> 7 #include <linux/security.h> 8 9 #define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS) 10 11 struct nfs_string; 12 13 /* Maximum number of readahead requests 14 * FIXME: this should really be a sysctl so that users may tune it to suit 15 * their needs. People that do NFS over a slow network, might for 16 * instance want to reduce it to something closer to 1 for improved 17 * interactive response. 18 */ 19 #define NFS_MAX_READAHEAD (RPC_DEF_SLOT_TABLE - 1) 20 21 /* 22 * Determine if sessions are in use. 23 */ 24 static inline int nfs4_has_session(const struct nfs_client *clp) 25 { 26 #ifdef CONFIG_NFS_V4_1 27 if (clp->cl_session) 28 return 1; 29 #endif /* CONFIG_NFS_V4_1 */ 30 return 0; 31 } 32 33 struct nfs_clone_mount { 34 const struct super_block *sb; 35 const struct dentry *dentry; 36 struct nfs_fh *fh; 37 struct nfs_fattr *fattr; 38 char *hostname; 39 char *mnt_path; 40 struct sockaddr *addr; 41 size_t addrlen; 42 rpc_authflavor_t authflavor; 43 }; 44 45 /* 46 * Note: RFC 1813 doesn't limit the number of auth flavors that 47 * a server can return, so make something up. 48 */ 49 #define NFS_MAX_SECFLAVORS (12) 50 51 /* 52 * In-kernel mount arguments 53 */ 54 struct nfs_parsed_mount_data { 55 int flags; 56 int rsize, wsize; 57 int timeo, retrans; 58 int acregmin, acregmax, 59 acdirmin, acdirmax; 60 int namlen; 61 unsigned int options; 62 unsigned int bsize; 63 unsigned int auth_flavor_len; 64 rpc_authflavor_t auth_flavors[1]; 65 char *client_address; 66 unsigned int minorversion; 67 char *fscache_uniq; 68 69 struct { 70 struct sockaddr_storage address; 71 size_t addrlen; 72 char *hostname; 73 u32 version; 74 unsigned short port; 75 unsigned short protocol; 76 } mount_server; 77 78 struct { 79 struct sockaddr_storage address; 80 size_t addrlen; 81 char *hostname; 82 char *export_path; 83 unsigned short port; 84 unsigned short protocol; 85 } nfs_server; 86 87 struct security_mnt_opts lsm_opts; 88 }; 89 90 /* mount_clnt.c */ 91 struct nfs_mount_request { 92 struct sockaddr *sap; 93 size_t salen; 94 char *hostname; 95 char *dirpath; 96 u32 version; 97 unsigned short protocol; 98 struct nfs_fh *fh; 99 int noresvport; 100 unsigned int *auth_flav_len; 101 rpc_authflavor_t *auth_flavs; 102 }; 103 104 extern int nfs_mount(struct nfs_mount_request *info); 105 106 /* client.c */ 107 extern struct rpc_program nfs_program; 108 109 extern void nfs_put_client(struct nfs_client *); 110 extern struct nfs_client *nfs_find_client(const struct sockaddr *, u32); 111 extern struct nfs_client *nfs_find_client_next(struct nfs_client *); 112 extern struct nfs_server *nfs_create_server( 113 const struct nfs_parsed_mount_data *, 114 struct nfs_fh *); 115 extern struct nfs_server *nfs4_create_server( 116 const struct nfs_parsed_mount_data *, 117 struct nfs_fh *); 118 extern struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *, 119 struct nfs_fh *); 120 extern void nfs_free_server(struct nfs_server *server); 121 extern struct nfs_server *nfs_clone_server(struct nfs_server *, 122 struct nfs_fh *, 123 struct nfs_fattr *); 124 extern void nfs_mark_client_ready(struct nfs_client *clp, int state); 125 extern int nfs4_check_client_ready(struct nfs_client *clp); 126 #ifdef CONFIG_PROC_FS 127 extern int __init nfs_fs_proc_init(void); 128 extern void nfs_fs_proc_exit(void); 129 #else 130 static inline int nfs_fs_proc_init(void) 131 { 132 return 0; 133 } 134 static inline void nfs_fs_proc_exit(void) 135 { 136 } 137 #endif 138 139 /* nfs4namespace.c */ 140 #ifdef CONFIG_NFS_V4 141 extern struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry); 142 #else 143 static inline 144 struct vfsmount *nfs_do_refmount(const struct vfsmount *mnt_parent, struct dentry *dentry) 145 { 146 return ERR_PTR(-ENOENT); 147 } 148 #endif 149 150 /* callback_xdr.c */ 151 extern struct svc_version nfs4_callback_version1; 152 153 /* pagelist.c */ 154 extern int __init nfs_init_nfspagecache(void); 155 extern void nfs_destroy_nfspagecache(void); 156 extern int __init nfs_init_readpagecache(void); 157 extern void nfs_destroy_readpagecache(void); 158 extern int __init nfs_init_writepagecache(void); 159 extern void nfs_destroy_writepagecache(void); 160 161 extern int __init nfs_init_directcache(void); 162 extern void nfs_destroy_directcache(void); 163 164 /* nfs2xdr.c */ 165 extern int nfs_stat_to_errno(int); 166 extern struct rpc_procinfo nfs_procedures[]; 167 extern __be32 * nfs_decode_dirent(__be32 *, struct nfs_entry *, int); 168 169 /* nfs3xdr.c */ 170 extern struct rpc_procinfo nfs3_procedures[]; 171 extern __be32 *nfs3_decode_dirent(__be32 *, struct nfs_entry *, int); 172 173 /* nfs4proc.c */ 174 static inline void nfs4_restart_rpc(struct rpc_task *task, 175 const struct nfs_client *clp) 176 { 177 #ifdef CONFIG_NFS_V4_1 178 if (nfs4_has_session(clp) && 179 test_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state)) { 180 rpc_restart_call_prepare(task); 181 return; 182 } 183 #endif /* CONFIG_NFS_V4_1 */ 184 rpc_restart_call(task); 185 } 186 187 /* nfs4xdr.c */ 188 #ifdef CONFIG_NFS_V4 189 extern __be32 *nfs4_decode_dirent(__be32 *p, struct nfs_entry *entry, int plus); 190 #endif 191 192 /* nfs4proc.c */ 193 #ifdef CONFIG_NFS_V4 194 extern struct rpc_procinfo nfs4_procedures[]; 195 #endif 196 197 /* proc.c */ 198 void nfs_close_context(struct nfs_open_context *ctx, int is_sync); 199 200 /* dir.c */ 201 extern int nfs_access_cache_shrinker(int nr_to_scan, gfp_t gfp_mask); 202 203 /* inode.c */ 204 extern struct workqueue_struct *nfsiod_workqueue; 205 extern struct inode *nfs_alloc_inode(struct super_block *sb); 206 extern void nfs_destroy_inode(struct inode *); 207 extern int nfs_write_inode(struct inode *,int); 208 extern void nfs_clear_inode(struct inode *); 209 #ifdef CONFIG_NFS_V4 210 extern void nfs4_clear_inode(struct inode *); 211 #endif 212 void nfs_zap_acl_cache(struct inode *inode); 213 extern int nfs_wait_bit_killable(void *word); 214 215 /* super.c */ 216 void nfs_parse_ip_address(char *, size_t, struct sockaddr *, size_t *); 217 extern struct file_system_type nfs_xdev_fs_type; 218 #ifdef CONFIG_NFS_V4 219 extern struct file_system_type nfs4_xdev_fs_type; 220 extern struct file_system_type nfs4_referral_fs_type; 221 #endif 222 223 extern struct rpc_stat nfs_rpcstat; 224 225 extern int __init register_nfs_fs(void); 226 extern void __exit unregister_nfs_fs(void); 227 extern void nfs_sb_active(struct super_block *sb); 228 extern void nfs_sb_deactive(struct super_block *sb); 229 230 /* namespace.c */ 231 extern char *nfs_path(const char *base, 232 const struct dentry *droot, 233 const struct dentry *dentry, 234 char *buffer, ssize_t buflen); 235 236 /* getroot.c */ 237 extern struct dentry *nfs_get_root(struct super_block *, struct nfs_fh *); 238 #ifdef CONFIG_NFS_V4 239 extern struct dentry *nfs4_get_root(struct super_block *, struct nfs_fh *); 240 241 extern int nfs4_path_walk(struct nfs_server *server, 242 struct nfs_fh *mntfh, 243 const char *path); 244 #endif 245 246 /* read.c */ 247 extern void nfs_read_prepare(struct rpc_task *task, void *calldata); 248 249 /* write.c */ 250 extern void nfs_write_prepare(struct rpc_task *task, void *calldata); 251 #ifdef CONFIG_MIGRATION 252 extern int nfs_migrate_page(struct address_space *, 253 struct page *, struct page *); 254 #else 255 #define nfs_migrate_page NULL 256 #endif 257 258 /* nfs4proc.c */ 259 extern int _nfs4_call_sync(struct nfs_server *server, 260 struct rpc_message *msg, 261 struct nfs4_sequence_args *args, 262 struct nfs4_sequence_res *res, 263 int cache_reply); 264 extern int _nfs4_call_sync_session(struct nfs_server *server, 265 struct rpc_message *msg, 266 struct nfs4_sequence_args *args, 267 struct nfs4_sequence_res *res, 268 int cache_reply); 269 270 #ifdef CONFIG_NFS_V4_1 271 extern void nfs41_sequence_free_slot(const struct nfs_client *, 272 struct nfs4_sequence_res *res); 273 #endif /* CONFIG_NFS_V4_1 */ 274 275 static inline void nfs4_sequence_free_slot(const struct nfs_client *clp, 276 struct nfs4_sequence_res *res) 277 { 278 #ifdef CONFIG_NFS_V4_1 279 if (nfs4_has_session(clp)) 280 nfs41_sequence_free_slot(clp, res); 281 #endif /* CONFIG_NFS_V4_1 */ 282 } 283 284 /* 285 * Determine the device name as a string 286 */ 287 static inline char *nfs_devname(const struct vfsmount *mnt_parent, 288 const struct dentry *dentry, 289 char *buffer, ssize_t buflen) 290 { 291 return nfs_path(mnt_parent->mnt_devname, mnt_parent->mnt_root, 292 dentry, buffer, buflen); 293 } 294 295 /* 296 * Determine the actual block size (and log2 thereof) 297 */ 298 static inline 299 unsigned long nfs_block_bits(unsigned long bsize, unsigned char *nrbitsp) 300 { 301 /* make sure blocksize is a power of two */ 302 if ((bsize & (bsize - 1)) || nrbitsp) { 303 unsigned char nrbits; 304 305 for (nrbits = 31; nrbits && !(bsize & (1 << nrbits)); nrbits--) 306 ; 307 bsize = 1 << nrbits; 308 if (nrbitsp) 309 *nrbitsp = nrbits; 310 } 311 312 return bsize; 313 } 314 315 /* 316 * Calculate the number of 512byte blocks used. 317 */ 318 static inline blkcnt_t nfs_calc_block_size(u64 tsize) 319 { 320 blkcnt_t used = (tsize + 511) >> 9; 321 return (used > ULONG_MAX) ? ULONG_MAX : used; 322 } 323 324 /* 325 * Compute and set NFS server blocksize 326 */ 327 static inline 328 unsigned long nfs_block_size(unsigned long bsize, unsigned char *nrbitsp) 329 { 330 if (bsize < NFS_MIN_FILE_IO_SIZE) 331 bsize = NFS_DEF_FILE_IO_SIZE; 332 else if (bsize >= NFS_MAX_FILE_IO_SIZE) 333 bsize = NFS_MAX_FILE_IO_SIZE; 334 335 return nfs_block_bits(bsize, nrbitsp); 336 } 337 338 /* 339 * Determine the maximum file size for a superblock 340 */ 341 static inline 342 void nfs_super_set_maxbytes(struct super_block *sb, __u64 maxfilesize) 343 { 344 sb->s_maxbytes = (loff_t)maxfilesize; 345 if (sb->s_maxbytes > MAX_LFS_FILESIZE || sb->s_maxbytes <= 0) 346 sb->s_maxbytes = MAX_LFS_FILESIZE; 347 } 348 349 /* 350 * Determine the number of bytes of data the page contains 351 */ 352 static inline 353 unsigned int nfs_page_length(struct page *page) 354 { 355 loff_t i_size = i_size_read(page->mapping->host); 356 357 if (i_size > 0) { 358 pgoff_t end_index = (i_size - 1) >> PAGE_CACHE_SHIFT; 359 if (page->index < end_index) 360 return PAGE_CACHE_SIZE; 361 if (page->index == end_index) 362 return ((i_size - 1) & ~PAGE_CACHE_MASK) + 1; 363 } 364 return 0; 365 } 366 367 /* 368 * Determine the number of pages in an array of length 'len' and 369 * with a base offset of 'base' 370 */ 371 static inline 372 unsigned int nfs_page_array_len(unsigned int base, size_t len) 373 { 374 return ((unsigned long)len + (unsigned long)base + 375 PAGE_SIZE - 1) >> PAGE_SHIFT; 376 } 377 378 #define IPV6_SCOPE_DELIMITER '%' 379 380 /* 381 * Set the port number in an address. Be agnostic about the address 382 * family. 383 */ 384 static inline void nfs_set_port(struct sockaddr *sap, unsigned short port) 385 { 386 struct sockaddr_in *ap = (struct sockaddr_in *)sap; 387 struct sockaddr_in6 *ap6 = (struct sockaddr_in6 *)sap; 388 389 switch (sap->sa_family) { 390 case AF_INET: 391 ap->sin_port = htons(port); 392 break; 393 case AF_INET6: 394 ap6->sin6_port = htons(port); 395 break; 396 } 397 } 398