Merge branch 'for-2.6.31' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
* 'for-2.6.31' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6: (128 commits) nfs41: sunrpc: xprt_alloc_bc_request() should not use spin_lock_bh() nfs41: Move initialization of nfs4_opendata seq_res to nfs4_init_opendata_res nfs: remove unnecessary NFS_INO_INVALID_ACL checks NFS: More "sloppy" parsing problems NFS: Invalid mount option values should always fail, even with "sloppy" NFS: Remove unused XDR decoder functions NFS: Update MNT and MNT3 reply decoding functions NFS: add XDR decoder for mountd version 3 auth-flavor lists NFS: add new file handle decoders to in-kernel mountd client NFS: Add separate mountd status code decoders for each mountd version NFS: remove unused function in fs/nfs/mount_clnt.c NFS: Use xdr_stream-based XDR encoder for MNT's dirpath argument NFS: Clean up MNT program definitions lockd: Don't bother with RPC ping for NSM upcalls lockd: Update NSM state from SM_MON replies NFS: Fix false error return from nfs_callback_up() if ipv6.ko is not available NFS: Return error code from nfs_callback_up() to user space NFS: Do not display the setting of the "intr" mount option NFS: add support for splice writes nfs41: Backchannel: CB_SEQUENCE validation ...
This commit is contained in:
commit
df36b439c5
49 changed files with 5222 additions and 605 deletions
|
|
@ -195,7 +195,7 @@ extern struct svc_procedure nlmsvc_procedures4[];
|
|||
extern int nlmsvc_grace_period;
|
||||
extern unsigned long nlmsvc_timeout;
|
||||
extern int nsm_use_hostnames;
|
||||
extern int nsm_local_state;
|
||||
extern u32 nsm_local_state;
|
||||
|
||||
/*
|
||||
* Lockd client functions
|
||||
|
|
|
|||
|
|
@ -25,8 +25,9 @@
|
|||
#define NFSMODE_SOCK 0140000
|
||||
#define NFSMODE_FIFO 0010000
|
||||
|
||||
#define NFS_MNT_PROGRAM 100005
|
||||
#define NFS_MNT_PORT 627
|
||||
#define NFS_MNT_PROGRAM 100005
|
||||
#define NFS_MNT_VERSION 1
|
||||
#define NFS_MNT3_VERSION 3
|
||||
|
||||
/*
|
||||
* NFS stats. The good thing with these values is that NFSv3 errors are
|
||||
|
|
|
|||
|
|
@ -64,11 +64,4 @@ struct nfs2_fh {
|
|||
#define NFSPROC_READDIR 16
|
||||
#define NFSPROC_STATFS 17
|
||||
|
||||
#define NFS_MNT_PROGRAM 100005
|
||||
#define NFS_MNT_VERSION 1
|
||||
#define MNTPROC_NULL 0
|
||||
#define MNTPROC_MNT 1
|
||||
#define MNTPROC_UMNT 3
|
||||
#define MNTPROC_UMNTALL 4
|
||||
|
||||
#endif /* _LINUX_NFS2_H */
|
||||
|
|
|
|||
|
|
@ -88,12 +88,7 @@ struct nfs3_fh {
|
|||
#define NFS3PROC_PATHCONF 20
|
||||
#define NFS3PROC_COMMIT 21
|
||||
|
||||
#define NFS_MNT3_PROGRAM 100005
|
||||
#define NFS_MNT3_VERSION 3
|
||||
#define MOUNTPROC3_NULL 0
|
||||
#define MOUNTPROC3_MNT 1
|
||||
#define MOUNTPROC3_UMNT 3
|
||||
#define MOUNTPROC3_UMNTALL 4
|
||||
|
||||
|
||||
#if defined(__KERNEL__)
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
#define NFS4_FHSIZE 128
|
||||
#define NFS4_MAXPATHLEN PATH_MAX
|
||||
#define NFS4_MAXNAMLEN NAME_MAX
|
||||
#define NFS4_OPAQUE_LIMIT 1024
|
||||
#define NFS4_MAX_SESSIONID_LEN 16
|
||||
|
||||
#define NFS4_ACCESS_READ 0x0001
|
||||
|
|
@ -130,6 +131,16 @@
|
|||
|
||||
#define NFS4_MAX_UINT64 (~(u64)0)
|
||||
|
||||
/* An NFS4 sessions server must support at least NFS4_MAX_OPS operations.
|
||||
* If a compound requires more operations, adjust NFS4_MAX_OPS accordingly.
|
||||
*/
|
||||
#define NFS4_MAX_OPS 8
|
||||
|
||||
/* Our NFS4 client back channel server only wants the cb_sequene and the
|
||||
* actual operation per compound
|
||||
*/
|
||||
#define NFS4_MAX_BACK_CHANNEL_OPS 2
|
||||
|
||||
enum nfs4_acl_whotype {
|
||||
NFS4_ACL_WHO_NAMED = 0,
|
||||
NFS4_ACL_WHO_OWNER,
|
||||
|
|
@ -462,6 +473,13 @@ enum lock_type4 {
|
|||
#define NFSPROC4_NULL 0
|
||||
#define NFSPROC4_COMPOUND 1
|
||||
#define NFS4_MINOR_VERSION 0
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
#define NFS4_MAX_MINOR_VERSION 1
|
||||
#else
|
||||
#define NFS4_MAX_MINOR_VERSION 0
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
#define NFS4_DEBUG 1
|
||||
|
||||
/* Index of predefined Linux client operations */
|
||||
|
|
|
|||
|
|
@ -4,11 +4,17 @@
|
|||
#include <linux/list.h>
|
||||
#include <linux/backing-dev.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/nfs_xdr.h>
|
||||
#include <linux/sunrpc/xprt.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
|
||||
struct nfs4_session;
|
||||
struct nfs_iostats;
|
||||
struct nlm_host;
|
||||
struct nfs4_sequence_args;
|
||||
struct nfs4_sequence_res;
|
||||
struct nfs_server;
|
||||
|
||||
/*
|
||||
* The nfs_client identifies our client state to the server.
|
||||
|
|
@ -18,6 +24,7 @@ struct nfs_client {
|
|||
int cl_cons_state; /* current construction state (-ve: init error) */
|
||||
#define NFS_CS_READY 0 /* ready to be used */
|
||||
#define NFS_CS_INITING 1 /* busy initialising */
|
||||
#define NFS_CS_SESSION_INITING 2 /* busy initialising session */
|
||||
unsigned long cl_res_state; /* NFS resources state */
|
||||
#define NFS_CS_CALLBACK 1 /* - callback started */
|
||||
#define NFS_CS_IDMAP 2 /* - idmap started */
|
||||
|
|
@ -32,6 +39,7 @@ struct nfs_client {
|
|||
const struct nfs_rpc_ops *rpc_ops; /* NFS protocol vector */
|
||||
int cl_proto; /* Network transport protocol */
|
||||
|
||||
u32 cl_minorversion;/* NFSv4 minorversion */
|
||||
struct rpc_cred *cl_machine_cred;
|
||||
|
||||
#ifdef CONFIG_NFS_V4
|
||||
|
|
@ -63,7 +71,22 @@ struct nfs_client {
|
|||
*/
|
||||
char cl_ipaddr[48];
|
||||
unsigned char cl_id_uniquifier;
|
||||
#endif
|
||||
int (* cl_call_sync)(struct nfs_server *server,
|
||||
struct rpc_message *msg,
|
||||
struct nfs4_sequence_args *args,
|
||||
struct nfs4_sequence_res *res,
|
||||
int cache_reply);
|
||||
#endif /* CONFIG_NFS_V4 */
|
||||
|
||||
#ifdef CONFIG_NFS_V4_1
|
||||
/* clientid returned from EXCHANGE_ID, used by session operations */
|
||||
u64 cl_ex_clid;
|
||||
/* The sequence id to use for the next CREATE_SESSION */
|
||||
u32 cl_seqid;
|
||||
/* The flags used for obtaining the clientid during EXCHANGE_ID */
|
||||
u32 cl_exchange_flags;
|
||||
struct nfs4_session *cl_session; /* sharred session */
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
#ifdef CONFIG_NFS_FSCACHE
|
||||
struct fscache_cookie *fscache; /* client index cache cookie */
|
||||
|
|
@ -145,4 +168,46 @@ struct nfs_server {
|
|||
#define NFS_CAP_ACLS (1U << 3)
|
||||
#define NFS_CAP_ATOMIC_OPEN (1U << 4)
|
||||
|
||||
|
||||
/* maximum number of slots to use */
|
||||
#define NFS4_MAX_SLOT_TABLE RPC_MAX_SLOT_TABLE
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
|
||||
/* Sessions */
|
||||
#define SLOT_TABLE_SZ (NFS4_MAX_SLOT_TABLE/(8*sizeof(long)))
|
||||
struct nfs4_slot_table {
|
||||
struct nfs4_slot *slots; /* seqid per slot */
|
||||
unsigned long used_slots[SLOT_TABLE_SZ]; /* used/unused bitmap */
|
||||
spinlock_t slot_tbl_lock;
|
||||
struct rpc_wait_queue slot_tbl_waitq; /* allocators may wait here */
|
||||
int max_slots; /* # slots in table */
|
||||
int highest_used_slotid; /* sent to server on each SEQ.
|
||||
* op for dynamic resizing */
|
||||
};
|
||||
|
||||
static inline int slot_idx(struct nfs4_slot_table *tbl, struct nfs4_slot *sp)
|
||||
{
|
||||
return sp - tbl->slots;
|
||||
}
|
||||
|
||||
/*
|
||||
* Session related parameters
|
||||
*/
|
||||
struct nfs4_session {
|
||||
struct nfs4_sessionid sess_id;
|
||||
u32 flags;
|
||||
unsigned long session_state;
|
||||
u32 hash_alg;
|
||||
u32 ssv_len;
|
||||
|
||||
/* The fore and back channel */
|
||||
struct nfs4_channel_attrs fc_attrs;
|
||||
struct nfs4_slot_table fc_slot_table;
|
||||
struct nfs4_channel_attrs bc_attrs;
|
||||
struct nfs4_slot_table bc_slot_table;
|
||||
struct nfs_client *clp;
|
||||
};
|
||||
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -145,6 +145,44 @@ struct nfs4_change_info {
|
|||
};
|
||||
|
||||
struct nfs_seqid;
|
||||
|
||||
/* nfs41 sessions channel attributes */
|
||||
struct nfs4_channel_attrs {
|
||||
u32 headerpadsz;
|
||||
u32 max_rqst_sz;
|
||||
u32 max_resp_sz;
|
||||
u32 max_resp_sz_cached;
|
||||
u32 max_ops;
|
||||
u32 max_reqs;
|
||||
};
|
||||
|
||||
/* nfs41 sessions slot seqid */
|
||||
struct nfs4_slot {
|
||||
u32 seq_nr;
|
||||
};
|
||||
|
||||
struct nfs4_sequence_args {
|
||||
struct nfs4_session *sa_session;
|
||||
u8 sa_slotid;
|
||||
u8 sa_cache_this;
|
||||
};
|
||||
|
||||
struct nfs4_sequence_res {
|
||||
struct nfs4_session *sr_session;
|
||||
u8 sr_slotid; /* slot used to send request */
|
||||
unsigned long sr_renewal_time;
|
||||
int sr_status; /* sequence operation status */
|
||||
};
|
||||
|
||||
struct nfs4_get_lease_time_args {
|
||||
struct nfs4_sequence_args la_seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_get_lease_time_res {
|
||||
struct nfs_fsinfo *lr_fsinfo;
|
||||
struct nfs4_sequence_res lr_seq_res;
|
||||
};
|
||||
|
||||
/*
|
||||
* Arguments to the open call.
|
||||
*/
|
||||
|
|
@ -165,6 +203,7 @@ struct nfs_openargs {
|
|||
const struct nfs_server *server; /* Needed for ID mapping */
|
||||
const u32 * bitmask;
|
||||
__u32 claim;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_openres {
|
||||
|
|
@ -181,6 +220,7 @@ struct nfs_openres {
|
|||
__u32 do_recall;
|
||||
__u64 maxsize;
|
||||
__u32 attrset[NFS4_BITMAP_SIZE];
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -206,6 +246,7 @@ struct nfs_closeargs {
|
|||
struct nfs_seqid * seqid;
|
||||
fmode_t fmode;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_closeres {
|
||||
|
|
@ -213,6 +254,7 @@ struct nfs_closeres {
|
|||
struct nfs_fattr * fattr;
|
||||
struct nfs_seqid * seqid;
|
||||
const struct nfs_server *server;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
/*
|
||||
* * Arguments to the lock,lockt, and locku call.
|
||||
|
|
@ -233,12 +275,14 @@ struct nfs_lock_args {
|
|||
unsigned char block : 1;
|
||||
unsigned char reclaim : 1;
|
||||
unsigned char new_lock_owner : 1;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_lock_res {
|
||||
nfs4_stateid stateid;
|
||||
struct nfs_seqid * lock_seqid;
|
||||
struct nfs_seqid * open_seqid;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs_locku_args {
|
||||
|
|
@ -246,32 +290,38 @@ struct nfs_locku_args {
|
|||
struct file_lock * fl;
|
||||
struct nfs_seqid * seqid;
|
||||
nfs4_stateid * stateid;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_locku_res {
|
||||
nfs4_stateid stateid;
|
||||
struct nfs_seqid * seqid;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs_lockt_args {
|
||||
struct nfs_fh * fh;
|
||||
struct file_lock * fl;
|
||||
struct nfs_lowner lock_owner;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_lockt_res {
|
||||
struct file_lock * denied; /* LOCK, LOCKT failed */
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_delegreturnargs {
|
||||
const struct nfs_fh *fhandle;
|
||||
const nfs4_stateid *stateid;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_delegreturnres {
|
||||
struct nfs_fattr * fattr;
|
||||
const struct nfs_server *server;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -284,12 +334,14 @@ struct nfs_readargs {
|
|||
__u32 count;
|
||||
unsigned int pgbase;
|
||||
struct page ** pages;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_readres {
|
||||
struct nfs_fattr * fattr;
|
||||
__u32 count;
|
||||
int eof;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -304,6 +356,7 @@ struct nfs_writeargs {
|
|||
unsigned int pgbase;
|
||||
struct page ** pages;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_writeverf {
|
||||
|
|
@ -316,6 +369,7 @@ struct nfs_writeres {
|
|||
struct nfs_writeverf * verf;
|
||||
__u32 count;
|
||||
const struct nfs_server *server;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -325,12 +379,14 @@ struct nfs_removeargs {
|
|||
const struct nfs_fh *fh;
|
||||
struct qstr name;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_removeres {
|
||||
const struct nfs_server *server;
|
||||
struct nfs4_change_info cinfo;
|
||||
struct nfs_fattr dir_attr;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -383,6 +439,7 @@ struct nfs_setattrargs {
|
|||
struct iattr * iap;
|
||||
const struct nfs_server * server; /* Needed for name mapping */
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_setaclargs {
|
||||
|
|
@ -390,6 +447,11 @@ struct nfs_setaclargs {
|
|||
size_t acl_len;
|
||||
unsigned int acl_pgbase;
|
||||
struct page ** acl_pages;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_setaclres {
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs_getaclargs {
|
||||
|
|
@ -397,11 +459,18 @@ struct nfs_getaclargs {
|
|||
size_t acl_len;
|
||||
unsigned int acl_pgbase;
|
||||
struct page ** acl_pages;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs_getaclres {
|
||||
size_t acl_len;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs_setattrres {
|
||||
struct nfs_fattr * fattr;
|
||||
const struct nfs_server * server;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs_linkargs {
|
||||
|
|
@ -583,6 +652,7 @@ struct nfs4_accessargs {
|
|||
const struct nfs_fh * fh;
|
||||
const u32 * bitmask;
|
||||
u32 access;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_accessres {
|
||||
|
|
@ -590,6 +660,7 @@ struct nfs4_accessres {
|
|||
struct nfs_fattr * fattr;
|
||||
u32 supported;
|
||||
u32 access;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_create_arg {
|
||||
|
|
@ -609,6 +680,7 @@ struct nfs4_create_arg {
|
|||
const struct iattr * attrs;
|
||||
const struct nfs_fh * dir_fh;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_create_res {
|
||||
|
|
@ -617,21 +689,30 @@ struct nfs4_create_res {
|
|||
struct nfs_fattr * fattr;
|
||||
struct nfs4_change_info dir_cinfo;
|
||||
struct nfs_fattr * dir_fattr;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_fsinfo_arg {
|
||||
const struct nfs_fh * fh;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_fsinfo_res {
|
||||
struct nfs_fsinfo *fsinfo;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_getattr_arg {
|
||||
const struct nfs_fh * fh;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_getattr_res {
|
||||
const struct nfs_server * server;
|
||||
struct nfs_fattr * fattr;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_link_arg {
|
||||
|
|
@ -639,6 +720,7 @@ struct nfs4_link_arg {
|
|||
const struct nfs_fh * dir_fh;
|
||||
const struct qstr * name;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_link_res {
|
||||
|
|
@ -646,6 +728,7 @@ struct nfs4_link_res {
|
|||
struct nfs_fattr * fattr;
|
||||
struct nfs4_change_info cinfo;
|
||||
struct nfs_fattr * dir_attr;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -653,21 +736,30 @@ struct nfs4_lookup_arg {
|
|||
const struct nfs_fh * dir_fh;
|
||||
const struct qstr * name;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_lookup_res {
|
||||
const struct nfs_server * server;
|
||||
struct nfs_fattr * fattr;
|
||||
struct nfs_fh * fh;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_lookup_root_arg {
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_pathconf_arg {
|
||||
const struct nfs_fh * fh;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_pathconf_res {
|
||||
struct nfs_pathconf *pathconf;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_readdir_arg {
|
||||
|
|
@ -678,11 +770,13 @@ struct nfs4_readdir_arg {
|
|||
struct page ** pages; /* zero-copy data */
|
||||
unsigned int pgbase; /* zero-copy data */
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_readdir_res {
|
||||
nfs4_verifier verifier;
|
||||
unsigned int pgbase;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_readlink {
|
||||
|
|
@ -690,6 +784,11 @@ struct nfs4_readlink {
|
|||
unsigned int pgbase;
|
||||
unsigned int pglen; /* zero-copy data */
|
||||
struct page ** pages; /* zero-copy data */
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_readlink_res {
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_rename_arg {
|
||||
|
|
@ -698,6 +797,7 @@ struct nfs4_rename_arg {
|
|||
const struct qstr * old_name;
|
||||
const struct qstr * new_name;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_rename_res {
|
||||
|
|
@ -706,6 +806,7 @@ struct nfs4_rename_res {
|
|||
struct nfs_fattr * old_fattr;
|
||||
struct nfs4_change_info new_cinfo;
|
||||
struct nfs_fattr * new_fattr;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
#define NFS4_SETCLIENTID_NAMELEN (127)
|
||||
|
|
@ -724,6 +825,17 @@ struct nfs4_setclientid {
|
|||
struct nfs4_statfs_arg {
|
||||
const struct nfs_fh * fh;
|
||||
const u32 * bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_statfs_res {
|
||||
struct nfs_fsstat *fsstat;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_server_caps_arg {
|
||||
struct nfs_fh *fhandle;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_server_caps_res {
|
||||
|
|
@ -731,6 +843,7 @@ struct nfs4_server_caps_res {
|
|||
u32 acl_bitmask;
|
||||
u32 has_links;
|
||||
u32 has_symlinks;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
struct nfs4_string {
|
||||
|
|
@ -765,10 +878,68 @@ struct nfs4_fs_locations_arg {
|
|||
const struct qstr *name;
|
||||
struct page *page;
|
||||
const u32 *bitmask;
|
||||
struct nfs4_sequence_args seq_args;
|
||||
};
|
||||
|
||||
struct nfs4_fs_locations_res {
|
||||
struct nfs4_fs_locations *fs_locations;
|
||||
struct nfs4_sequence_res seq_res;
|
||||
};
|
||||
|
||||
#endif /* CONFIG_NFS_V4 */
|
||||
|
||||
struct nfstime4 {
|
||||
u64 seconds;
|
||||
u32 nseconds;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_NFS_V4_1
|
||||
struct nfs_impl_id4 {
|
||||
u32 domain_len;
|
||||
char *domain;
|
||||
u32 name_len;
|
||||
char *name;
|
||||
struct nfstime4 date;
|
||||
};
|
||||
|
||||
#define NFS4_EXCHANGE_ID_LEN (48)
|
||||
struct nfs41_exchange_id_args {
|
||||
struct nfs_client *client;
|
||||
nfs4_verifier *verifier;
|
||||
unsigned int id_len;
|
||||
char id[NFS4_EXCHANGE_ID_LEN];
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
struct server_owner {
|
||||
uint64_t minor_id;
|
||||
uint32_t major_id_sz;
|
||||
char major_id[NFS4_OPAQUE_LIMIT];
|
||||
};
|
||||
|
||||
struct server_scope {
|
||||
uint32_t server_scope_sz;
|
||||
char server_scope[NFS4_OPAQUE_LIMIT];
|
||||
};
|
||||
|
||||
struct nfs41_exchange_id_res {
|
||||
struct nfs_client *client;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
struct nfs41_create_session_args {
|
||||
struct nfs_client *client;
|
||||
uint32_t flags;
|
||||
uint32_t cb_program;
|
||||
struct nfs4_channel_attrs fc_attrs; /* Fore Channel */
|
||||
struct nfs4_channel_attrs bc_attrs; /* Back Channel */
|
||||
};
|
||||
|
||||
struct nfs41_create_session_res {
|
||||
struct nfs_client *client;
|
||||
};
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
struct nfs_page;
|
||||
|
||||
#define NFS_PAGEVEC_SIZE (8U)
|
||||
|
|
|
|||
|
|
@ -41,7 +41,6 @@
|
|||
#include <linux/kref.h>
|
||||
#include <linux/sunrpc/clnt.h>
|
||||
|
||||
#define NFS4_OPAQUE_LIMIT 1024
|
||||
typedef struct {
|
||||
u32 cl_boot;
|
||||
u32 cl_id;
|
||||
|
|
|
|||
49
include/linux/sunrpc/bc_xprt.h
Normal file
49
include/linux/sunrpc/bc_xprt.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/******************************************************************************
|
||||
|
||||
(c) 2008 NetApp. All Rights Reserved.
|
||||
|
||||
NetApp provides this source code under the GPL v2 License.
|
||||
The GPL v2 license is available at
|
||||
http://opensource.org/licenses/gpl-license.php.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Functions to create and manage the backchannel
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_SUNRPC_BC_XPRT_H
|
||||
#define _LINUX_SUNRPC_BC_XPRT_H
|
||||
|
||||
#include <linux/sunrpc/svcsock.h>
|
||||
#include <linux/sunrpc/xprt.h>
|
||||
#include <linux/sunrpc/sched.h>
|
||||
|
||||
#ifdef CONFIG_NFS_V4_1
|
||||
struct rpc_rqst *xprt_alloc_bc_request(struct rpc_xprt *xprt);
|
||||
void xprt_free_bc_request(struct rpc_rqst *req);
|
||||
int xprt_setup_backchannel(struct rpc_xprt *, unsigned int min_reqs);
|
||||
void xprt_destroy_backchannel(struct rpc_xprt *, int max_reqs);
|
||||
void bc_release_request(struct rpc_task *);
|
||||
int bc_send(struct rpc_rqst *req);
|
||||
#else /* CONFIG_NFS_V4_1 */
|
||||
static inline int xprt_setup_backchannel(struct rpc_xprt *xprt,
|
||||
unsigned int min_reqs)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
#endif /* _LINUX_SUNRPC_BC_XPRT_H */
|
||||
|
||||
|
|
@ -143,6 +143,7 @@ int rpc_call_sync(struct rpc_clnt *clnt,
|
|||
const struct rpc_message *msg, int flags);
|
||||
struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred,
|
||||
int flags);
|
||||
void rpc_restart_call_prepare(struct rpc_task *);
|
||||
void rpc_restart_call(struct rpc_task *);
|
||||
void rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int);
|
||||
size_t rpc_max_payload(struct rpc_clnt *);
|
||||
|
|
|
|||
|
|
@ -210,6 +210,8 @@ struct rpc_wait_queue {
|
|||
*/
|
||||
struct rpc_task *rpc_new_task(const struct rpc_task_setup *);
|
||||
struct rpc_task *rpc_run_task(const struct rpc_task_setup *);
|
||||
struct rpc_task *rpc_run_bc_task(struct rpc_rqst *req,
|
||||
const struct rpc_call_ops *ops);
|
||||
void rpc_put_task(struct rpc_task *);
|
||||
void rpc_exit_task(struct rpc_task *);
|
||||
void rpc_release_calldata(const struct rpc_call_ops *, void *);
|
||||
|
|
@ -237,6 +239,7 @@ void rpc_show_tasks(void);
|
|||
int rpc_init_mempool(void);
|
||||
void rpc_destroy_mempool(void);
|
||||
extern struct workqueue_struct *rpciod_workqueue;
|
||||
void rpc_prepare_task(struct rpc_task *task);
|
||||
|
||||
static inline void rpc_exit(struct rpc_task *task, int status)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -96,6 +96,15 @@ struct svc_serv {
|
|||
svc_thread_fn sv_function; /* main function for threads */
|
||||
unsigned int sv_drc_max_pages; /* Total pages for DRC */
|
||||
unsigned int sv_drc_pages_used;/* DRC pages used */
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
struct list_head sv_cb_list; /* queue for callback requests
|
||||
* that arrive over the same
|
||||
* connection */
|
||||
spinlock_t sv_cb_lock; /* protects the svc_cb_list */
|
||||
wait_queue_head_t sv_cb_waitq; /* sleep here if there are no
|
||||
* entries in the svc_cb_list */
|
||||
struct svc_xprt *bc_xprt;
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -411,6 +420,8 @@ int svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
|
|||
int svc_pool_stats_open(struct svc_serv *serv, struct file *file);
|
||||
void svc_destroy(struct svc_serv *);
|
||||
int svc_process(struct svc_rqst *);
|
||||
int bc_svc_process(struct svc_serv *, struct rpc_rqst *,
|
||||
struct svc_rqst *);
|
||||
int svc_register(const struct svc_serv *, const int,
|
||||
const unsigned short, const unsigned short);
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@ int svc_sock_names(char *buf, struct svc_serv *serv, char *toclose);
|
|||
int svc_addsock(struct svc_serv *serv, int fd, char *name_return);
|
||||
void svc_init_xprt_sock(void);
|
||||
void svc_cleanup_xprt_sock(void);
|
||||
struct svc_xprt *svc_sock_create(struct svc_serv *serv, int prot);
|
||||
void svc_sock_destroy(struct svc_xprt *);
|
||||
|
||||
/*
|
||||
* svc_makesock socket characteristics
|
||||
|
|
|
|||
|
|
@ -67,7 +67,8 @@ struct rpc_rqst {
|
|||
struct rpc_task * rq_task; /* RPC task data */
|
||||
__be32 rq_xid; /* request XID */
|
||||
int rq_cong; /* has incremented xprt->cong */
|
||||
int rq_received; /* receive completed */
|
||||
int rq_reply_bytes_recvd; /* number of reply */
|
||||
/* bytes received */
|
||||
u32 rq_seqno; /* gss seq no. used on req. */
|
||||
int rq_enc_pages_num;
|
||||
struct page **rq_enc_pages; /* scratch pages for use by
|
||||
|
|
@ -97,6 +98,12 @@ struct rpc_rqst {
|
|||
|
||||
unsigned long rq_xtime; /* when transmitted */
|
||||
int rq_ntrans;
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
struct list_head rq_bc_list; /* Callback service list */
|
||||
unsigned long rq_bc_pa_state; /* Backchannel prealloc state */
|
||||
struct list_head rq_bc_pa_list; /* Backchannel prealloc list */
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
};
|
||||
#define rq_svec rq_snd_buf.head
|
||||
#define rq_slen rq_snd_buf.len
|
||||
|
|
@ -174,6 +181,15 @@ struct rpc_xprt {
|
|||
spinlock_t reserve_lock; /* lock slot table */
|
||||
u32 xid; /* Next XID value to use */
|
||||
struct rpc_task * snd_task; /* Task blocked in send */
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
struct svc_serv *bc_serv; /* The RPC service which will */
|
||||
/* process the callback */
|
||||
unsigned int bc_alloc_count; /* Total number of preallocs */
|
||||
spinlock_t bc_pa_lock; /* Protects the preallocated
|
||||
* items */
|
||||
struct list_head bc_pa_list; /* List of preallocated
|
||||
* backchannel rpc_rqst's */
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
struct list_head recv;
|
||||
|
||||
struct {
|
||||
|
|
@ -192,6 +208,26 @@ struct rpc_xprt {
|
|||
const char *address_strings[RPC_DISPLAY_MAX];
|
||||
};
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
/*
|
||||
* Backchannel flags
|
||||
*/
|
||||
#define RPC_BC_PA_IN_USE 0x0001 /* Preallocated backchannel */
|
||||
/* buffer in use */
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
static inline int bc_prealloc(struct rpc_rqst *req)
|
||||
{
|
||||
return test_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state);
|
||||
}
|
||||
#else
|
||||
static inline int bc_prealloc(struct rpc_rqst *req)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
struct xprt_create {
|
||||
int ident; /* XPRT_TRANSPORT identifier */
|
||||
struct sockaddr * srcaddr; /* optional local address */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue