#define MDS_REPLY_PORTAL 11
#define MDS_BULK_PORTAL 12
+#define LDLM_REQUEST_PORTAL 13
+#define LDLM_REPLY_PORTAL 14
+
/* default rpc ring length */
#define RPC_RING_LENGTH 2
-/* generic wrappable next */
-#define NEXT_INDEX(index, max) (((index+1) >= max) ? 0 : (index+1))
-
#define SVC_STOPPING 1
#define SVC_RUNNING 2
#define SVC_STOPPED 4
#define SVC_LIST 32
#define SVC_SIGNAL 64
-typedef int (*rep_unpack_t)(char *, int, struct ptlrep_hdr **, union ptl_rep *);
-typedef int (*req_pack_t)(char *, int, char *, int, struct ptlreq_hdr **,
- union ptl_req*, int *, char **);
-
-typedef int (*req_unpack_t)(char *buf, int len, struct ptlreq_hdr **,
- union ptl_req *);
-typedef int (*rep_pack_t)(char *buf1, int len1, char *buf2, int len2,
- struct ptlrep_hdr **, union ptl_rep*,
- int *replen, char **repbuf);
-
struct ptlrpc_client {
struct lustre_peer cli_server;
struct obd_device *cli_obd;
__u32 cli_request_portal;
__u32 cli_reply_portal;
- rep_unpack_t cli_rep_unpack;
- req_pack_t cli_req_pack;
spinlock_t cli_lock;
__u32 cli_xid;
+ struct semaphore cli_rpc_sem;
};
/* These do double-duty in rq_type and rq_flags */
#define PTL_RPC_BULK 4
#define PTL_RPC_SENT 5
#define PTL_BULK_SENT 6
-#define PTL_BULK_RCVD 6
+#define PTL_BULK_RCVD 7
+#define PTL_RPC_ERR 8
struct ptlrpc_request {
int rq_type; /* one of PTL_RPC_REQUEST, PTL_RPC_REPLY, PTL_RPC_BULK */
spinlock_t rq_lock;
- struct list_head rq_list;
- struct obd_device *rq_obd;
- int rq_status;
+ struct list_head rq_list;
+ struct obd_device *rq_obd;
+ int rq_status;
int rq_flags;
__u32 rq_connid;
__u32 rq_xid;
- char *rq_reqbuf;
- int rq_reqlen;
- struct ptlreq_hdr *rq_reqhdr;
- union ptl_req rq_req;
+ int rq_reqlen;
+ char *rq_reqbuf;
+ struct lustre_msg *rq_reqmsg;
- char *rq_repbuf;
- int rq_replen;
- struct ptlrep_hdr *rq_rephdr;
- union ptl_rep rq_rep;
+ int rq_replen;
+ char *rq_repbuf;
+ struct lustre_msg *rq_repmsg;
char *rq_bulkbuf;
int rq_bulklen;
void * rq_reply_handle;
- wait_queue_head_t rq_wait_for_rep;
+ wait_queue_head_t rq_wait_for_rep;
/* incoming reply */
ptl_md_t rq_reply_md;
struct obd_conn b_conn;
__u32 b_xid;
- wait_queue_head_t b_waitq;
+ wait_queue_head_t b_waitq;
ptl_md_t b_md;
ptl_handle_md_t b_md_h;
/* incoming request buffers */
/* FIXME: perhaps a list of EQs, if multiple NIs are used? */
char *srv_buf[RPC_RING_LENGTH];
+ __u32 srv_ref_count[RPC_RING_LENGTH];
+ ptl_handle_me_t srv_me_h[RPC_RING_LENGTH];
__u32 srv_buf_size;
- __u32 srv_me_active;
- __u32 srv_me_tail;
- __u32 srv_md_active;
__u32 srv_ring_length;
__u32 srv_req_portal;
__u32 srv_rep_portal;
- __u32 srv_ref_count[RPC_RING_LENGTH];
- ptl_handle_me_t srv_me_h[RPC_RING_LENGTH];
- ptl_process_id_t srv_id;
- ptl_md_t srv_md[RPC_RING_LENGTH];
- ptl_handle_md_t srv_md_h[RPC_RING_LENGTH];
+
__u32 srv_xid;
/* event queue */
__u32 srv_flags;
struct lustre_peer srv_self;
- struct task_struct *srv_thread;
- wait_queue_head_t srv_waitq;
- wait_queue_head_t srv_ctl_waitq;
- int ost_flags;
+ ptl_process_id_t srv_id;
+
+ struct task_struct *srv_thread;
+ wait_queue_head_t srv_waitq;
+ wait_queue_head_t srv_ctl_waitq;
- spinlock_t srv_lock;
- struct list_head srv_reqs;
+ spinlock_t srv_lock;
+ struct list_head srv_reqs;
ptl_event_t srv_ev;
- req_unpack_t srv_req_unpack;
- rep_pack_t srv_rep_pack;
int (*srv_handler)(struct obd_device *obddev,
struct ptlrpc_service *svc,
struct ptlrpc_request *req);
int ptlrpc_send_bulk(struct ptlrpc_bulk_desc *, int portal);
int ptl_send_buf(struct ptlrpc_request *, struct lustre_peer *, int portal);
int ptlrpc_register_bulk(struct ptlrpc_bulk_desc *);
+int ptlrpc_abort_bulk(struct ptlrpc_bulk_desc *bulk);
int ptlrpc_reply(struct obd_device *obddev, struct ptlrpc_service *svc,
struct ptlrpc_request *req);
int ptlrpc_error(struct obd_device *obddev, struct ptlrpc_service *svc,
struct ptlrpc_request *req);
-int ptl_send_rpc(struct ptlrpc_request *request, struct lustre_peer *peer);
+int ptl_send_rpc(struct ptlrpc_request *request, struct ptlrpc_client *cl);
+void ptlrpc_link_svc_me(struct ptlrpc_service *service, int i);
/* rpc/client.c */
-int ptlrpc_connect_client(int dev, char *uuid, int req_portal, int rep_portal,
- req_pack_t req_pack, rep_unpack_t rep_unpack,
+int ptlrpc_connect_client(int dev, char *uuid, int req_portal, int rep_portal,
struct ptlrpc_client *cl);
int ptlrpc_queue_wait(struct ptlrpc_client *cl, struct ptlrpc_request *req);
int ptlrpc_queue_req(struct ptlrpc_client *peer, struct ptlrpc_request *req);
-struct ptlrpc_request *ptlrpc_prep_req(struct ptlrpc_client *cl,
- int opcode, int namelen, char *name,
- int tgtlen, char *tgt);
+struct ptlrpc_request *ptlrpc_prep_req(struct ptlrpc_client *cl, int opcode,
+ int count, int *lengths, char **bufs);
void ptlrpc_free_req(struct ptlrpc_request *request);
struct ptlrpc_bulk_desc *ptlrpc_prep_bulk(struct lustre_peer *);
int ptlrpc_check_status(struct ptlrpc_request *req, int err);
/* rpc/service.c */
struct ptlrpc_service *
ptlrpc_init_svc(__u32 bufsize, int req_portal, int rep_portal, char *uuid,
- req_unpack_t unpack, rep_pack_t pack, svc_handler_t);
+ svc_handler_t);
void ptlrpc_stop_thread(struct ptlrpc_service *svc);
int ptlrpc_start_thread(struct obd_device *dev, struct ptlrpc_service *svc,
char *name);
-int rpc_register_service(struct ptlrpc_service *service, char *uuid);
int rpc_unregister_service(struct ptlrpc_service *service);
struct ptlrpc_svc_data {
struct obd_device *dev;
};
+/* rpc/pack_generic.c */
+int lustre_pack_msg(int count, int *lens, char **bufs, int *len, char **buf);
+int lustre_msg_size(int count, int *lengths);
+int lustre_unpack_msg(char *buf, int len);
+void *lustre_msg_buf(struct lustre_msg *m, int n);
+
#endif