mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 02:36:02 +00:00
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>
77 lines
1.8 KiB
C
77 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 */
|