|
@@ -213,6 +213,8 @@ extern int rdma_read_chunk_frmr(struct svcxprt_rdma *, struct svc_rqst *,
|
|
|
|
|
|
/* svc_rdma_sendto.c */
|
|
|
extern int svc_rdma_sendto(struct svc_rqst *);
|
|
|
+extern struct rpcrdma_read_chunk *
|
|
|
+ svc_rdma_get_read_chunk(struct rpcrdma_msg *);
|
|
|
|
|
|
/* svc_rdma_transport.c */
|
|
|
extern int svc_rdma_send(struct svcxprt_rdma *, struct ib_send_wr *);
|
|
@@ -238,83 +240,4 @@ extern void svc_rdma_prep_reply_hdr(struct svc_rqst *);
|
|
|
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[ntohl(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
|