Merge branch 'for-linus' of git://linux-nfs.org/~bfields/linux
* 'for-linus' of git://linux-nfs.org/~bfields/linux: (100 commits) SUNRPC: RPC program information is stored in unsigned integers SUNRPC: Move exported symbol definitions after function declaration part 2 NLM: tear down RPC clients in nlm_shutdown_hosts SUNRPC: spin svc_rqst initialization to its own function nfsd: more careful input validation in nfsctl write methods lockd: minor log message fix knfsd: don't bother mapping putrootfh enoent to eperm rdma: makefile rdma: ONCRPC RDMA protocol marshalling rdma: SVCRDMA sendto rdma: SVCRDMA recvfrom rdma: SVCRDMA Core Transport Services rdma: SVCRDMA Transport Module rdma: SVCRMDA Header File svc: Add svc_xprt_names service to replace svc_sock_names knfsd: Support adding transports by writing portlist file svc: Add svc API that queries for a transport instance svc: Add /proc/sys/sunrpc/transport files svc: Add transport hdr size for defer/revisit svc: Move the xprt independent code to the svc_xprt.c file ...
This commit is contained in:
@@ -173,14 +173,17 @@ void nlmclnt_next_cookie(struct nlm_cookie *);
|
||||
/*
|
||||
* Host cache
|
||||
*/
|
||||
struct nlm_host * nlmclnt_lookup_host(const struct sockaddr_in *, int, int, const char *, int);
|
||||
struct nlm_host * nlmsvc_lookup_host(struct svc_rqst *, const char *, int);
|
||||
struct nlm_host *nlmclnt_lookup_host(const struct sockaddr_in *, int, int,
|
||||
const char *, unsigned int);
|
||||
struct nlm_host *nlmsvc_lookup_host(struct svc_rqst *, const char *,
|
||||
unsigned int);
|
||||
struct rpc_clnt * nlm_bind_host(struct nlm_host *);
|
||||
void nlm_rebind_host(struct nlm_host *);
|
||||
struct nlm_host * nlm_get_host(struct nlm_host *);
|
||||
void nlm_release_host(struct nlm_host *);
|
||||
void nlm_shutdown_hosts(void);
|
||||
extern void nlm_host_rebooted(const struct sockaddr_in *, const char *, int, u32);
|
||||
extern void nlm_host_rebooted(const struct sockaddr_in *, const char *,
|
||||
unsigned int, u32);
|
||||
void nsm_release(struct nsm_handle *);
|
||||
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ struct svc_rqst;
|
||||
/* Lock info passed via NLM */
|
||||
struct nlm_lock {
|
||||
char * caller;
|
||||
int len; /* length of "caller" */
|
||||
unsigned int len; /* length of "caller" */
|
||||
struct nfs_fh fh;
|
||||
struct xdr_netobj oh;
|
||||
u32 svid;
|
||||
@@ -78,7 +78,7 @@ struct nlm_res {
|
||||
*/
|
||||
struct nlm_reboot {
|
||||
char * mon;
|
||||
int len;
|
||||
unsigned int len;
|
||||
u32 state;
|
||||
__be32 addr;
|
||||
__be32 vers;
|
||||
|
||||
@@ -4,4 +4,3 @@ unifdef-y += stats.h
|
||||
unifdef-y += syscall.h
|
||||
unifdef-y += nfsfh.h
|
||||
unifdef-y += debug.h
|
||||
unifdef-y += auth.h
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* include/linux/nfsd/auth.h
|
||||
*
|
||||
* nfsd-specific authentication stuff.
|
||||
* uid/gid mapping not yet implemented.
|
||||
*
|
||||
* Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
|
||||
*/
|
||||
|
||||
#ifndef LINUX_NFSD_AUTH_H
|
||||
#define LINUX_NFSD_AUTH_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define nfsd_luid(rq, uid) ((u32)(uid))
|
||||
#define nfsd_lgid(rq, gid) ((u32)(gid))
|
||||
#define nfsd_ruid(rq, uid) ((u32)(uid))
|
||||
#define nfsd_rgid(rq, gid) ((u32)(gid))
|
||||
|
||||
/*
|
||||
* Set the current process's fsuid/fsgid etc to those of the NFS
|
||||
* client user
|
||||
*/
|
||||
int nfsd_setuser(struct svc_rqst *, struct svc_export *);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* LINUX_NFSD_AUTH_H */
|
||||
@@ -72,8 +72,8 @@ enum {
|
||||
*/
|
||||
#define RC_DELAY (HZ/5)
|
||||
|
||||
void nfsd_cache_init(void);
|
||||
void nfsd_cache_shutdown(void);
|
||||
int nfsd_reply_cache_init(void);
|
||||
void nfsd_reply_cache_shutdown(void);
|
||||
int nfsd_cache_lookup(struct svc_rqst *, int);
|
||||
void nfsd_cache_update(struct svc_rqst *, int, __be32 *);
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp);
|
||||
/*
|
||||
* Function declarations
|
||||
*/
|
||||
void nfsd_export_init(void);
|
||||
int nfsd_export_init(void);
|
||||
void nfsd_export_shutdown(void);
|
||||
void nfsd_export_flush(void);
|
||||
void exp_readlock(void);
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include <linux/nfsd/debug.h>
|
||||
#include <linux/nfsd/nfsfh.h>
|
||||
#include <linux/nfsd/export.h>
|
||||
#include <linux/nfsd/auth.h>
|
||||
#include <linux/nfsd/stats.h>
|
||||
/*
|
||||
* nfsd version
|
||||
@@ -70,9 +69,9 @@ void nfsd_racache_shutdown(void);
|
||||
int nfsd_cross_mnt(struct svc_rqst *rqstp, struct dentry **dpp,
|
||||
struct svc_export **expp);
|
||||
__be32 nfsd_lookup(struct svc_rqst *, struct svc_fh *,
|
||||
const char *, int, struct svc_fh *);
|
||||
const char *, unsigned int, struct svc_fh *);
|
||||
__be32 nfsd_lookup_dentry(struct svc_rqst *, struct svc_fh *,
|
||||
const char *, int,
|
||||
const char *, unsigned int,
|
||||
struct svc_export **, struct dentry **);
|
||||
__be32 nfsd_setattr(struct svc_rqst *, struct svc_fh *,
|
||||
struct iattr *, int, time_t);
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <linux/nfsd/const.h>
|
||||
#include <linux/nfsd/export.h>
|
||||
#include <linux/nfsd/nfsfh.h>
|
||||
#include <linux/nfsd/auth.h>
|
||||
|
||||
/*
|
||||
* Version of the syscall interface
|
||||
|
||||
@@ -23,7 +23,7 @@ struct nfsd_sattrargs {
|
||||
struct nfsd_diropargs {
|
||||
struct svc_fh fh;
|
||||
char * name;
|
||||
int len;
|
||||
unsigned int len;
|
||||
};
|
||||
|
||||
struct nfsd_readargs {
|
||||
@@ -43,17 +43,17 @@ struct nfsd_writeargs {
|
||||
struct nfsd_createargs {
|
||||
struct svc_fh fh;
|
||||
char * name;
|
||||
int len;
|
||||
unsigned int len;
|
||||
struct iattr attrs;
|
||||
};
|
||||
|
||||
struct nfsd_renameargs {
|
||||
struct svc_fh ffh;
|
||||
char * fname;
|
||||
int flen;
|
||||
unsigned int flen;
|
||||
struct svc_fh tfh;
|
||||
char * tname;
|
||||
int tlen;
|
||||
unsigned int tlen;
|
||||
};
|
||||
|
||||
struct nfsd_readlinkargs {
|
||||
@@ -65,15 +65,15 @@ struct nfsd_linkargs {
|
||||
struct svc_fh ffh;
|
||||
struct svc_fh tfh;
|
||||
char * tname;
|
||||
int tlen;
|
||||
unsigned int tlen;
|
||||
};
|
||||
|
||||
struct nfsd_symlinkargs {
|
||||
struct svc_fh ffh;
|
||||
char * fname;
|
||||
int flen;
|
||||
unsigned int flen;
|
||||
char * tname;
|
||||
int tlen;
|
||||
unsigned int tlen;
|
||||
struct iattr attrs;
|
||||
};
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ struct nfsd3_sattrargs {
|
||||
struct nfsd3_diropargs {
|
||||
struct svc_fh fh;
|
||||
char * name;
|
||||
int len;
|
||||
unsigned int len;
|
||||
};
|
||||
|
||||
struct nfsd3_accessargs {
|
||||
@@ -48,7 +48,7 @@ struct nfsd3_writeargs {
|
||||
struct nfsd3_createargs {
|
||||
struct svc_fh fh;
|
||||
char * name;
|
||||
int len;
|
||||
unsigned int len;
|
||||
int createmode;
|
||||
struct iattr attrs;
|
||||
__be32 * verf;
|
||||
@@ -57,7 +57,7 @@ struct nfsd3_createargs {
|
||||
struct nfsd3_mknodargs {
|
||||
struct svc_fh fh;
|
||||
char * name;
|
||||
int len;
|
||||
unsigned int len;
|
||||
__u32 ftype;
|
||||
__u32 major, minor;
|
||||
struct iattr attrs;
|
||||
@@ -66,10 +66,10 @@ struct nfsd3_mknodargs {
|
||||
struct nfsd3_renameargs {
|
||||
struct svc_fh ffh;
|
||||
char * fname;
|
||||
int flen;
|
||||
unsigned int flen;
|
||||
struct svc_fh tfh;
|
||||
char * tname;
|
||||
int tlen;
|
||||
unsigned int tlen;
|
||||
};
|
||||
|
||||
struct nfsd3_readlinkargs {
|
||||
@@ -81,15 +81,15 @@ struct nfsd3_linkargs {
|
||||
struct svc_fh ffh;
|
||||
struct svc_fh tfh;
|
||||
char * tname;
|
||||
int tlen;
|
||||
unsigned int tlen;
|
||||
};
|
||||
|
||||
struct nfsd3_symlinkargs {
|
||||
struct svc_fh ffh;
|
||||
char * fname;
|
||||
int flen;
|
||||
unsigned int flen;
|
||||
char * tname;
|
||||
int tlen;
|
||||
unsigned int tlen;
|
||||
struct iattr attrs;
|
||||
};
|
||||
|
||||
|
||||
@@ -441,7 +441,7 @@ void nfsd4_encode_operation(struct nfsd4_compoundres *, struct nfsd4_op *);
|
||||
void nfsd4_encode_replay(struct nfsd4_compoundres *resp, struct nfsd4_op *op);
|
||||
__be32 nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
|
||||
struct dentry *dentry, __be32 *buffer, int *countp,
|
||||
u32 *bmval, struct svc_rqst *);
|
||||
u32 *bmval, struct svc_rqst *, int ignore_crossmnt);
|
||||
extern __be32 nfsd4_setclientid(struct svc_rqst *rqstp,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_setclientid *setclid);
|
||||
|
||||
@@ -44,11 +44,16 @@
|
||||
#define IDMAP_NAMESZ 128
|
||||
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
void nfsd_idmap_init(void);
|
||||
int nfsd_idmap_init(void);
|
||||
void nfsd_idmap_shutdown(void);
|
||||
#else
|
||||
static inline void nfsd_idmap_init(void) {};
|
||||
static inline void nfsd_idmap_shutdown(void) {};
|
||||
static inline int nfsd_idmap_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void nfsd_idmap_shutdown(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
int nfsd_map_name_to_uid(struct svc_rqst *, const char *, size_t, __u32 *);
|
||||
|
||||
@@ -169,8 +169,8 @@ extern int cache_check(struct cache_detail *detail,
|
||||
extern void cache_flush(void);
|
||||
extern void cache_purge(struct cache_detail *detail);
|
||||
#define NEVER (0x7FFFFFFF)
|
||||
extern void cache_register(struct cache_detail *cd);
|
||||
extern int cache_unregister(struct cache_detail *cd);
|
||||
extern int cache_register(struct cache_detail *cd);
|
||||
extern void cache_unregister(struct cache_detail *cd);
|
||||
|
||||
extern void qword_add(char **bpp, int *lp, char *str);
|
||||
extern void qword_addhex(char **bpp, int *lp, char *buf, int blen);
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
#define RPCDBG_BIND 0x0020
|
||||
#define RPCDBG_SCHED 0x0040
|
||||
#define RPCDBG_TRANS 0x0080
|
||||
#define RPCDBG_SVCSOCK 0x0100
|
||||
#define RPCDBG_SVCXPRT 0x0100
|
||||
#define RPCDBG_SVCDSP 0x0200
|
||||
#define RPCDBG_MISC 0x0400
|
||||
#define RPCDBG_CACHE 0x0800
|
||||
|
||||
@@ -204,7 +204,7 @@ union svc_addr_u {
|
||||
struct svc_rqst {
|
||||
struct list_head rq_list; /* idle list */
|
||||
struct list_head rq_all; /* all threads list */
|
||||
struct svc_sock * rq_sock; /* socket */
|
||||
struct svc_xprt * rq_xprt; /* transport ptr */
|
||||
struct sockaddr_storage rq_addr; /* peer address */
|
||||
size_t rq_addrlen;
|
||||
|
||||
@@ -214,9 +214,10 @@ struct svc_rqst {
|
||||
struct auth_ops * rq_authop; /* authentication flavour */
|
||||
u32 rq_flavor; /* pseudoflavor */
|
||||
struct svc_cred rq_cred; /* auth info */
|
||||
struct sk_buff * rq_skbuff; /* fast recv inet buffer */
|
||||
void * rq_xprt_ctxt; /* transport specific context ptr */
|
||||
struct svc_deferred_req*rq_deferred; /* deferred request we are replaying */
|
||||
|
||||
size_t rq_xprt_hlen; /* xprt header len */
|
||||
struct xdr_buf rq_arg;
|
||||
struct xdr_buf rq_res;
|
||||
struct page * rq_pages[RPCSVC_MAXPAGES];
|
||||
@@ -317,11 +318,12 @@ static inline void svc_free_res_pages(struct svc_rqst *rqstp)
|
||||
|
||||
struct svc_deferred_req {
|
||||
u32 prot; /* protocol (UDP or TCP) */
|
||||
struct svc_sock *svsk;
|
||||
struct svc_xprt *xprt;
|
||||
struct sockaddr_storage addr; /* where reply must go */
|
||||
size_t addrlen;
|
||||
union svc_addr_u daddr; /* where reply must come from */
|
||||
struct cache_deferred_req handle;
|
||||
size_t xprt_hlen;
|
||||
int argslen;
|
||||
__be32 args[0];
|
||||
};
|
||||
@@ -382,6 +384,8 @@ struct svc_procedure {
|
||||
*/
|
||||
struct svc_serv * svc_create(struct svc_program *, unsigned int,
|
||||
void (*shutdown)(struct svc_serv*));
|
||||
struct svc_rqst *svc_prepare_thread(struct svc_serv *serv,
|
||||
struct svc_pool *pool);
|
||||
int svc_create_thread(svc_thread_fn, struct svc_serv *);
|
||||
void svc_exit_thread(struct svc_rqst *);
|
||||
struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int,
|
||||
|
||||
262
include/linux/sunrpc/svc_rdma.h
Normal file
262
include/linux/sunrpc/svc_rdma.h
Normal file
@@ -0,0 +1,262 @@
|
||||
/*
|
||||
* Copyright (c) 2005-2006 Network Appliance, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the BSD-type
|
||||
* license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
*
|
||||
* Neither the name of the Network Appliance, Inc. nor the names of
|
||||
* its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* Author: Tom Tucker <tom@opengridcomputing.com>
|
||||
*/
|
||||
|
||||
#ifndef SVC_RDMA_H
|
||||
#define SVC_RDMA_H
|
||||
#include <linux/sunrpc/xdr.h>
|
||||
#include <linux/sunrpc/svcsock.h>
|
||||
#include <linux/sunrpc/rpc_rdma.h>
|
||||
#include <rdma/ib_verbs.h>
|
||||
#include <rdma/rdma_cm.h>
|
||||
#define SVCRDMA_DEBUG
|
||||
|
||||
/* RPC/RDMA parameters and stats */
|
||||
extern unsigned int svcrdma_ord;
|
||||
extern unsigned int svcrdma_max_requests;
|
||||
extern unsigned int svcrdma_max_req_size;
|
||||
|
||||
extern atomic_t rdma_stat_recv;
|
||||
extern atomic_t rdma_stat_read;
|
||||
extern atomic_t rdma_stat_write;
|
||||
extern atomic_t rdma_stat_sq_starve;
|
||||
extern atomic_t rdma_stat_rq_starve;
|
||||
extern atomic_t rdma_stat_rq_poll;
|
||||
extern atomic_t rdma_stat_rq_prod;
|
||||
extern atomic_t rdma_stat_sq_poll;
|
||||
extern atomic_t rdma_stat_sq_prod;
|
||||
|
||||
#define RPCRDMA_VERSION 1
|
||||
|
||||
/*
|
||||
* Contexts are built when an RDMA request is created and are a
|
||||
* record of the resources that can be recovered when the request
|
||||
* completes.
|
||||
*/
|
||||
struct svc_rdma_op_ctxt {
|
||||
struct svc_rdma_op_ctxt *next;
|
||||
struct xdr_buf arg;
|
||||
struct list_head dto_q;
|
||||
enum ib_wr_opcode wr_op;
|
||||
enum ib_wc_status wc_status;
|
||||
u32 byte_len;
|
||||
struct svcxprt_rdma *xprt;
|
||||
unsigned long flags;
|
||||
enum dma_data_direction direction;
|
||||
int count;
|
||||
struct ib_sge sge[RPCSVC_MAXPAGES];
|
||||
struct page *pages[RPCSVC_MAXPAGES];
|
||||
};
|
||||
|
||||
#define RDMACTXT_F_READ_DONE 1
|
||||
#define RDMACTXT_F_LAST_CTXT 2
|
||||
|
||||
struct svcxprt_rdma {
|
||||
struct svc_xprt sc_xprt; /* SVC transport structure */
|
||||
struct rdma_cm_id *sc_cm_id; /* RDMA connection id */
|
||||
struct list_head sc_accept_q; /* Conn. waiting accept */
|
||||
int sc_ord; /* RDMA read limit */
|
||||
wait_queue_head_t sc_read_wait;
|
||||
int sc_max_sge;
|
||||
|
||||
int sc_sq_depth; /* Depth of SQ */
|
||||
atomic_t sc_sq_count; /* Number of SQ WR on queue */
|
||||
|
||||
int sc_max_requests; /* Depth of RQ */
|
||||
int sc_max_req_size; /* Size of each RQ WR buf */
|
||||
|
||||
struct ib_pd *sc_pd;
|
||||
|
||||
struct svc_rdma_op_ctxt *sc_ctxt_head;
|
||||
int sc_ctxt_cnt;
|
||||
int sc_ctxt_bump;
|
||||
int sc_ctxt_max;
|
||||
spinlock_t sc_ctxt_lock;
|
||||
struct list_head sc_rq_dto_q;
|
||||
spinlock_t sc_rq_dto_lock;
|
||||
struct ib_qp *sc_qp;
|
||||
struct ib_cq *sc_rq_cq;
|
||||
struct ib_cq *sc_sq_cq;
|
||||
struct ib_mr *sc_phys_mr; /* MR for server memory */
|
||||
|
||||
spinlock_t sc_lock; /* transport lock */
|
||||
|
||||
wait_queue_head_t sc_send_wait; /* SQ exhaustion waitlist */
|
||||
unsigned long sc_flags;
|
||||
struct list_head sc_dto_q; /* DTO tasklet I/O pending Q */
|
||||
struct list_head sc_read_complete_q;
|
||||
spinlock_t sc_read_complete_lock;
|
||||
};
|
||||
/* sc_flags */
|
||||
#define RDMAXPRT_RQ_PENDING 1
|
||||
#define RDMAXPRT_SQ_PENDING 2
|
||||
#define RDMAXPRT_CONN_PENDING 3
|
||||
|
||||
#define RPCRDMA_LISTEN_BACKLOG 10
|
||||
/* The default ORD value is based on two outstanding full-size writes with a
|
||||
* page size of 4k, or 32k * 2 ops / 4k = 16 outstanding RDMA_READ. */
|
||||
#define RPCRDMA_ORD (64/4)
|
||||
#define RPCRDMA_SQ_DEPTH_MULT 8
|
||||
#define RPCRDMA_MAX_THREADS 16
|
||||
#define RPCRDMA_MAX_REQUESTS 16
|
||||
#define RPCRDMA_MAX_REQ_SIZE 4096
|
||||
|
||||
/* svc_rdma_marshal.c */
|
||||
extern void svc_rdma_rcl_chunk_counts(struct rpcrdma_read_chunk *,
|
||||
int *, int *);
|
||||
extern int svc_rdma_xdr_decode_req(struct rpcrdma_msg **, struct svc_rqst *);
|
||||
extern int svc_rdma_xdr_decode_deferred_req(struct svc_rqst *);
|
||||
extern int svc_rdma_xdr_encode_error(struct svcxprt_rdma *,
|
||||
struct rpcrdma_msg *,
|
||||
enum rpcrdma_errcode, u32 *);
|
||||
extern void svc_rdma_xdr_encode_write_list(struct rpcrdma_msg *, int);
|
||||
extern void svc_rdma_xdr_encode_reply_array(struct rpcrdma_write_array *, int);
|
||||
extern void svc_rdma_xdr_encode_array_chunk(struct rpcrdma_write_array *, int,
|
||||
u32, u64, u32);
|
||||
extern void svc_rdma_xdr_encode_reply_header(struct svcxprt_rdma *,
|
||||
struct rpcrdma_msg *,
|
||||
struct rpcrdma_msg *,
|
||||
enum rpcrdma_proc);
|
||||
extern int svc_rdma_xdr_get_reply_hdr_len(struct rpcrdma_msg *);
|
||||
|
||||
/* svc_rdma_recvfrom.c */
|
||||
extern int svc_rdma_recvfrom(struct svc_rqst *);
|
||||
|
||||
/* svc_rdma_sendto.c */
|
||||
extern int svc_rdma_sendto(struct svc_rqst *);
|
||||
|
||||
/* svc_rdma_transport.c */
|
||||
extern int svc_rdma_send(struct svcxprt_rdma *, struct ib_send_wr *);
|
||||
extern int svc_rdma_send_error(struct svcxprt_rdma *, struct rpcrdma_msg *,
|
||||
enum rpcrdma_errcode);
|
||||
struct page *svc_rdma_get_page(void);
|
||||
extern int svc_rdma_post_recv(struct svcxprt_rdma *);
|
||||
extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *);
|
||||
extern struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *);
|
||||
extern void svc_rdma_put_context(struct svc_rdma_op_ctxt *, int);
|
||||
extern void svc_sq_reap(struct svcxprt_rdma *);
|
||||
extern void svc_rq_reap(struct svcxprt_rdma *);
|
||||
extern struct svc_xprt_class svc_rdma_class;
|
||||
extern void svc_rdma_prep_reply_hdr(struct svc_rqst *);
|
||||
|
||||
/* svc_rdma.c */
|
||||
extern int svc_rdma_init(void);
|
||||
extern void svc_rdma_cleanup(void);
|
||||
|
||||
/*
|
||||
* Returns the address of the first read chunk or <nul> if no read chunk is
|
||||
* present
|
||||
*/
|
||||
static inline struct rpcrdma_read_chunk *
|
||||
svc_rdma_get_read_chunk(struct rpcrdma_msg *rmsgp)
|
||||
{
|
||||
struct rpcrdma_read_chunk *ch =
|
||||
(struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0];
|
||||
|
||||
if (ch->rc_discrim == 0)
|
||||
return NULL;
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the address of the first read write array element or <nul> if no
|
||||
* write array list is present
|
||||
*/
|
||||
static inline struct rpcrdma_write_array *
|
||||
svc_rdma_get_write_array(struct rpcrdma_msg *rmsgp)
|
||||
{
|
||||
if (rmsgp->rm_body.rm_chunks[0] != 0
|
||||
|| rmsgp->rm_body.rm_chunks[1] == 0)
|
||||
return NULL;
|
||||
|
||||
return (struct rpcrdma_write_array *)&rmsgp->rm_body.rm_chunks[1];
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the address of the first reply array element or <nul> if no
|
||||
* reply array is present
|
||||
*/
|
||||
static inline struct rpcrdma_write_array *
|
||||
svc_rdma_get_reply_array(struct rpcrdma_msg *rmsgp)
|
||||
{
|
||||
struct rpcrdma_read_chunk *rch;
|
||||
struct rpcrdma_write_array *wr_ary;
|
||||
struct rpcrdma_write_array *rp_ary;
|
||||
|
||||
/* XXX: Need to fix when reply list may occur with read-list and/or
|
||||
* write list */
|
||||
if (rmsgp->rm_body.rm_chunks[0] != 0 ||
|
||||
rmsgp->rm_body.rm_chunks[1] != 0)
|
||||
return NULL;
|
||||
|
||||
rch = svc_rdma_get_read_chunk(rmsgp);
|
||||
if (rch) {
|
||||
while (rch->rc_discrim)
|
||||
rch++;
|
||||
|
||||
/* The reply list follows an empty write array located
|
||||
* at 'rc_position' here. The reply array is at rc_target.
|
||||
*/
|
||||
rp_ary = (struct rpcrdma_write_array *)&rch->rc_target;
|
||||
|
||||
goto found_it;
|
||||
}
|
||||
|
||||
wr_ary = svc_rdma_get_write_array(rmsgp);
|
||||
if (wr_ary) {
|
||||
rp_ary = (struct rpcrdma_write_array *)
|
||||
&wr_ary->
|
||||
wc_array[wr_ary->wc_nchunks].wc_target.rs_length;
|
||||
|
||||
goto found_it;
|
||||
}
|
||||
|
||||
/* No read list, no write list */
|
||||
rp_ary = (struct rpcrdma_write_array *)
|
||||
&rmsgp->rm_body.rm_chunks[2];
|
||||
|
||||
found_it:
|
||||
if (rp_ary->wc_discrim == 0)
|
||||
return NULL;
|
||||
|
||||
return rp_ary;
|
||||
}
|
||||
#endif
|
||||
159
include/linux/sunrpc/svc_xprt.h
Normal file
159
include/linux/sunrpc/svc_xprt.h
Normal file
@@ -0,0 +1,159 @@
|
||||
/*
|
||||
* linux/include/linux/sunrpc/svc_xprt.h
|
||||
*
|
||||
* RPC server transport I/O
|
||||
*/
|
||||
|
||||
#ifndef SUNRPC_SVC_XPRT_H
|
||||
#define SUNRPC_SVC_XPRT_H
|
||||
|
||||
#include <linux/sunrpc/svc.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
struct svc_xprt_ops {
|
||||
struct svc_xprt *(*xpo_create)(struct svc_serv *,
|
||||
struct sockaddr *, int,
|
||||
int);
|
||||
struct svc_xprt *(*xpo_accept)(struct svc_xprt *);
|
||||
int (*xpo_has_wspace)(struct svc_xprt *);
|
||||
int (*xpo_recvfrom)(struct svc_rqst *);
|
||||
void (*xpo_prep_reply_hdr)(struct svc_rqst *);
|
||||
int (*xpo_sendto)(struct svc_rqst *);
|
||||
void (*xpo_release_rqst)(struct svc_rqst *);
|
||||
void (*xpo_detach)(struct svc_xprt *);
|
||||
void (*xpo_free)(struct svc_xprt *);
|
||||
};
|
||||
|
||||
struct svc_xprt_class {
|
||||
const char *xcl_name;
|
||||
struct module *xcl_owner;
|
||||
struct svc_xprt_ops *xcl_ops;
|
||||
struct list_head xcl_list;
|
||||
u32 xcl_max_payload;
|
||||
};
|
||||
|
||||
struct svc_xprt {
|
||||
struct svc_xprt_class *xpt_class;
|
||||
struct svc_xprt_ops *xpt_ops;
|
||||
struct kref xpt_ref;
|
||||
struct list_head xpt_list;
|
||||
struct list_head xpt_ready;
|
||||
unsigned long xpt_flags;
|
||||
#define XPT_BUSY 0 /* enqueued/receiving */
|
||||
#define XPT_CONN 1 /* conn pending */
|
||||
#define XPT_CLOSE 2 /* dead or dying */
|
||||
#define XPT_DATA 3 /* data pending */
|
||||
#define XPT_TEMP 4 /* connected transport */
|
||||
#define XPT_DEAD 6 /* transport closed */
|
||||
#define XPT_CHNGBUF 7 /* need to change snd/rcv buf sizes */
|
||||
#define XPT_DEFERRED 8 /* deferred request pending */
|
||||
#define XPT_OLD 9 /* used for xprt aging mark+sweep */
|
||||
#define XPT_DETACHED 10 /* detached from tempsocks list */
|
||||
#define XPT_LISTENER 11 /* listening endpoint */
|
||||
#define XPT_CACHE_AUTH 12 /* cache auth info */
|
||||
|
||||
struct svc_pool *xpt_pool; /* current pool iff queued */
|
||||
struct svc_serv *xpt_server; /* service for transport */
|
||||
atomic_t xpt_reserved; /* space on outq that is rsvd */
|
||||
struct mutex xpt_mutex; /* to serialize sending data */
|
||||
spinlock_t xpt_lock; /* protects sk_deferred
|
||||
* and xpt_auth_cache */
|
||||
void *xpt_auth_cache;/* auth cache */
|
||||
struct list_head xpt_deferred; /* deferred requests that need
|
||||
* to be revisted */
|
||||
struct sockaddr_storage xpt_local; /* local address */
|
||||
size_t xpt_locallen; /* length of address */
|
||||
struct sockaddr_storage xpt_remote; /* remote peer's address */
|
||||
size_t xpt_remotelen; /* length of address */
|
||||
};
|
||||
|
||||
int svc_reg_xprt_class(struct svc_xprt_class *);
|
||||
void svc_unreg_xprt_class(struct svc_xprt_class *);
|
||||
void svc_xprt_init(struct svc_xprt_class *, struct svc_xprt *,
|
||||
struct svc_serv *);
|
||||
int svc_create_xprt(struct svc_serv *, char *, unsigned short, int);
|
||||
void svc_xprt_enqueue(struct svc_xprt *xprt);
|
||||
void svc_xprt_received(struct svc_xprt *);
|
||||
void svc_xprt_put(struct svc_xprt *xprt);
|
||||
void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt);
|
||||
void svc_close_xprt(struct svc_xprt *xprt);
|
||||
void svc_delete_xprt(struct svc_xprt *xprt);
|
||||
int svc_port_is_privileged(struct sockaddr *sin);
|
||||
int svc_print_xprts(char *buf, int maxlen);
|
||||
struct svc_xprt *svc_find_xprt(struct svc_serv *, char *, int, int);
|
||||
int svc_xprt_names(struct svc_serv *serv, char *buf, int buflen);
|
||||
|
||||
static inline void svc_xprt_get(struct svc_xprt *xprt)
|
||||
{
|
||||
kref_get(&xprt->xpt_ref);
|
||||
}
|
||||
static inline void svc_xprt_set_local(struct svc_xprt *xprt,
|
||||
struct sockaddr *sa, int salen)
|
||||
{
|
||||
memcpy(&xprt->xpt_local, sa, salen);
|
||||
xprt->xpt_locallen = salen;
|
||||
}
|
||||
static inline void svc_xprt_set_remote(struct svc_xprt *xprt,
|
||||
struct sockaddr *sa, int salen)
|
||||
{
|
||||
memcpy(&xprt->xpt_remote, sa, salen);
|
||||
xprt->xpt_remotelen = salen;
|
||||
}
|
||||
static inline unsigned short svc_addr_port(struct sockaddr *sa)
|
||||
{
|
||||
unsigned short ret = 0;
|
||||
switch (sa->sa_family) {
|
||||
case AF_INET:
|
||||
ret = ntohs(((struct sockaddr_in *)sa)->sin_port);
|
||||
break;
|
||||
case AF_INET6:
|
||||
ret = ntohs(((struct sockaddr_in6 *)sa)->sin6_port);
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline size_t svc_addr_len(struct sockaddr *sa)
|
||||
{
|
||||
switch (sa->sa_family) {
|
||||
case AF_INET:
|
||||
return sizeof(struct sockaddr_in);
|
||||
case AF_INET6:
|
||||
return sizeof(struct sockaddr_in6);
|
||||
}
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
static inline unsigned short svc_xprt_local_port(struct svc_xprt *xprt)
|
||||
{
|
||||
return svc_addr_port((struct sockaddr *)&xprt->xpt_local);
|
||||
}
|
||||
|
||||
static inline unsigned short svc_xprt_remote_port(struct svc_xprt *xprt)
|
||||
{
|
||||
return svc_addr_port((struct sockaddr *)&xprt->xpt_remote);
|
||||
}
|
||||
|
||||
static inline char *__svc_print_addr(struct sockaddr *addr,
|
||||
char *buf, size_t len)
|
||||
{
|
||||
switch (addr->sa_family) {
|
||||
case AF_INET:
|
||||
snprintf(buf, len, "%u.%u.%u.%u, port=%u",
|
||||
NIPQUAD(((struct sockaddr_in *) addr)->sin_addr),
|
||||
ntohs(((struct sockaddr_in *) addr)->sin_port));
|
||||
break;
|
||||
|
||||
case AF_INET6:
|
||||
snprintf(buf, len, "%x:%x:%x:%x:%x:%x:%x:%x, port=%u",
|
||||
NIP6(((struct sockaddr_in6 *) addr)->sin6_addr),
|
||||
ntohs(((struct sockaddr_in6 *) addr)->sin6_port));
|
||||
break;
|
||||
|
||||
default:
|
||||
snprintf(buf, len, "unknown address type: %d", addr->sa_family);
|
||||
break;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
#endif /* SUNRPC_SVC_XPRT_H */
|
||||
@@ -10,42 +10,16 @@
|
||||
#define SUNRPC_SVCSOCK_H
|
||||
|
||||
#include <linux/sunrpc/svc.h>
|
||||
#include <linux/sunrpc/svc_xprt.h>
|
||||
|
||||
/*
|
||||
* RPC server socket.
|
||||
*/
|
||||
struct svc_sock {
|
||||
struct list_head sk_ready; /* list of ready sockets */
|
||||
struct list_head sk_list; /* list of all sockets */
|
||||
struct svc_xprt sk_xprt;
|
||||
struct socket * sk_sock; /* berkeley socket layer */
|
||||
struct sock * sk_sk; /* INET layer */
|
||||
|
||||
struct svc_pool * sk_pool; /* current pool iff queued */
|
||||
struct svc_serv * sk_server; /* service for this socket */
|
||||
atomic_t sk_inuse; /* use count */
|
||||
unsigned long sk_flags;
|
||||
#define SK_BUSY 0 /* enqueued/receiving */
|
||||
#define SK_CONN 1 /* conn pending */
|
||||
#define SK_CLOSE 2 /* dead or dying */
|
||||
#define SK_DATA 3 /* data pending */
|
||||
#define SK_TEMP 4 /* temp (TCP) socket */
|
||||
#define SK_DEAD 6 /* socket closed */
|
||||
#define SK_CHNGBUF 7 /* need to change snd/rcv buffer sizes */
|
||||
#define SK_DEFERRED 8 /* request on sk_deferred */
|
||||
#define SK_OLD 9 /* used for temp socket aging mark+sweep */
|
||||
#define SK_DETACHED 10 /* detached from tempsocks list */
|
||||
|
||||
atomic_t sk_reserved; /* space on outq that is reserved */
|
||||
|
||||
spinlock_t sk_lock; /* protects sk_deferred and
|
||||
* sk_info_authunix */
|
||||
struct list_head sk_deferred; /* deferred requests that need to
|
||||
* be revisted */
|
||||
struct mutex sk_mutex; /* to serialize sending data */
|
||||
|
||||
int (*sk_recvfrom)(struct svc_rqst *rqstp);
|
||||
int (*sk_sendto)(struct svc_rqst *rqstp);
|
||||
|
||||
/* We keep the old state_change and data_ready CB's here */
|
||||
void (*sk_ostate)(struct sock *);
|
||||
void (*sk_odata)(struct sock *, int bytes);
|
||||
@@ -54,21 +28,12 @@ struct svc_sock {
|
||||
/* private TCP part */
|
||||
int sk_reclen; /* length of record */
|
||||
int sk_tcplen; /* current read length */
|
||||
time_t sk_lastrecv; /* time of last received request */
|
||||
|
||||
/* cache of various info for TCP sockets */
|
||||
void *sk_info_authunix;
|
||||
|
||||
struct sockaddr_storage sk_local; /* local address */
|
||||
struct sockaddr_storage sk_remote; /* remote peer's address */
|
||||
int sk_remotelen; /* length of address */
|
||||
};
|
||||
|
||||
/*
|
||||
* Function prototypes.
|
||||
*/
|
||||
int svc_makesock(struct svc_serv *, int, unsigned short, int flags);
|
||||
void svc_force_close_socket(struct svc_sock *);
|
||||
void svc_close_all(struct list_head *);
|
||||
int svc_recv(struct svc_rqst *, long);
|
||||
int svc_send(struct svc_rqst *);
|
||||
void svc_drop(struct svc_rqst *);
|
||||
@@ -78,6 +43,8 @@ int svc_addsock(struct svc_serv *serv,
|
||||
int fd,
|
||||
char *name_return,
|
||||
int *proto);
|
||||
void svc_init_xprt_sock(void);
|
||||
void svc_cleanup_xprt_sock(void);
|
||||
|
||||
/*
|
||||
* svc_makesock socket characteristics
|
||||
|
||||
@@ -112,7 +112,8 @@ struct xdr_buf {
|
||||
__be32 *xdr_encode_opaque_fixed(__be32 *p, const void *ptr, unsigned int len);
|
||||
__be32 *xdr_encode_opaque(__be32 *p, const void *ptr, unsigned int len);
|
||||
__be32 *xdr_encode_string(__be32 *p, const char *s);
|
||||
__be32 *xdr_decode_string_inplace(__be32 *p, char **sp, int *lenp, int maxlen);
|
||||
__be32 *xdr_decode_string_inplace(__be32 *p, char **sp, unsigned int *lenp,
|
||||
unsigned int maxlen);
|
||||
__be32 *xdr_encode_netobj(__be32 *p, const struct xdr_netobj *);
|
||||
__be32 *xdr_decode_netobj(__be32 *p, struct xdr_netobj *);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user