forked from mirrors/linux
		
	 70ba381e1a
			
		
	
	
		70ba381e1a
		
	
	
	
	
		
			
			Add client support for bypassing NFS for localhost reads, writes, and commits. This is only useful when the client and the server are running on the same host. nfs_local_probe() is stubbed out, later commits will enable client and server handshake via a Linux-only LOCALIO auxiliary RPC protocol. This has dynamic binding with the nfsd module (via nfs_localio module which is part of nfs_common). LOCALIO will only work if nfsd is already loaded. The "localio_enabled" nfs kernel module parameter can be used to disable and enable the ability to use LOCALIO support. CONFIG_NFS_LOCALIO enables NFS client support for LOCALIO. Lastly, LOCALIO uses an nfsd_file to initiate all IO. To make proper use of nfsd_file (and nfsd's filecache) its lifetime (duration before nfsd_file_put is called) must extend until after commit, read and write operations. So rather than immediately drop the nfsd_file reference in nfs_local_open_fh(), that doesn't happen until nfs_local_pgio_release() for read/write and not until nfs_local_release_commit_data() for commit. The same applies to the reference held on nfsd's nn->nfsd_serv. Both objects' lifetimes and associated references are managed through calls to nfs_to->nfsd_file_put_local(). Signed-off-by: Weston Andros Adamson <dros@primarydata.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Co-developed-by: Mike Snitzer <snitzer@kernel.org> Signed-off-by: Mike Snitzer <snitzer@kernel.org> Signed-off-by: NeilBrown <neilb@suse.de> # nfs_open_local_fh Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| /*
 | |
|  * NFS protocol definitions
 | |
|  *
 | |
|  * This file contains constants mostly for Version 2 of the protocol,
 | |
|  * but also has a couple of NFSv3 bits in (notably the error codes).
 | |
|  */
 | |
| #ifndef _LINUX_NFS_H
 | |
| #define _LINUX_NFS_H
 | |
| 
 | |
| #include <linux/cred.h>
 | |
| #include <linux/sunrpc/auth.h>
 | |
| #include <linux/sunrpc/msg_prot.h>
 | |
| #include <linux/string.h>
 | |
| #include <linux/crc32.h>
 | |
| #include <uapi/linux/nfs.h>
 | |
| 
 | |
| /* The LOCALIO program is entirely private to Linux and is
 | |
|  * NOT part of the uapi.
 | |
|  */
 | |
| #define NFS_LOCALIO_PROGRAM		400122
 | |
| #define LOCALIOPROC_NULL		0
 | |
| #define LOCALIOPROC_UUID_IS_LOCAL	1
 | |
| 
 | |
| /*
 | |
|  * This is the kernel NFS client file handle representation
 | |
|  */
 | |
| #define NFS_MAXFHSIZE		128
 | |
| struct nfs_fh {
 | |
| 	unsigned short		size;
 | |
| 	unsigned char		data[NFS_MAXFHSIZE];
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Returns a zero iff the size and data fields match.
 | |
|  * Checks only "size" bytes in the data field.
 | |
|  */
 | |
| static inline int nfs_compare_fh(const struct nfs_fh *a, const struct nfs_fh *b)
 | |
| {
 | |
| 	return a->size != b->size || memcmp(a->data, b->data, a->size) != 0;
 | |
| }
 | |
| 
 | |
| static inline void nfs_copy_fh(struct nfs_fh *target, const struct nfs_fh *source)
 | |
| {
 | |
| 	target->size = source->size;
 | |
| 	memcpy(target->data, source->data, source->size);
 | |
| }
 | |
| 
 | |
| enum nfs3_stable_how {
 | |
| 	NFS_UNSTABLE = 0,
 | |
| 	NFS_DATA_SYNC = 1,
 | |
| 	NFS_FILE_SYNC = 2,
 | |
| 
 | |
| 	/* used by direct.c to mark verf as invalid */
 | |
| 	NFS_INVALID_STABLE_HOW = -1
 | |
| };
 | |
| 
 | |
| #ifdef CONFIG_CRC32
 | |
| /**
 | |
|  * nfs_fhandle_hash - calculate the crc32 hash for the filehandle
 | |
|  * @fh - pointer to filehandle
 | |
|  *
 | |
|  * returns a crc32 hash for the filehandle that is compatible with
 | |
|  * the one displayed by "wireshark".
 | |
|  */
 | |
| static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh)
 | |
| {
 | |
| 	return ~crc32_le(0xFFFFFFFF, &fh->data[0], fh->size);
 | |
| }
 | |
| #else /* CONFIG_CRC32 */
 | |
| static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh)
 | |
| {
 | |
| 	return 0;
 | |
| }
 | |
| #endif /* CONFIG_CRC32 */
 | |
| #endif /* _LINUX_NFS_H */
 |