ptl_handle_md_t b_md_h;
ptl_handle_me_t b_me_h;
- struct iovec b_iov[16]; /* self-sized pre-allocated iov */
+ struct iovec b_iov[16]; /* self-sized pre-allocated iov */
};
struct ptlrpc_thread {
struct list_head srv_reqs;
struct list_head srv_threads;
int (*srv_handler)(struct ptlrpc_request *req);
+ char *srv_name; /* only statically allocated strings here; we don't clean them */
};
static inline void ptlrpc_hdl2req(struct ptlrpc_request *req, struct lustre_handle *h)
/* rpc/service.c */
struct ptlrpc_service *
ptlrpc_init_svc(__u32 bufsize, int req_portal, int rep_portal, char *uuid,
- svc_handler_t);
+ svc_handler_t, char *name);
void ptlrpc_stop_all_threads(struct ptlrpc_service *svc);
int ptlrpc_start_thread(struct obd_device *dev, struct ptlrpc_service *svc,
char *name);
ldlm->ldlm_service = ptlrpc_init_svc(64 * 1024, LDLM_REQUEST_PORTAL,
LDLM_REPLY_PORTAL, "self",
- ldlm_callback_handler);
+ ldlm_callback_handler, "ldlm");
if (!ldlm->ldlm_service)
GOTO(out_proc, rc = -ENOMEM);
/* prepare write should not read what lies beyond the end of
the file */
-
-
rc = ll_brw(OBD_BRW_READ, inode, page, 0);
EXIT;
}
mds->mds_service = ptlrpc_init_svc(64 * 1024, MDS_REQUEST_PORTAL,
- MDC_REPLY_PORTAL, "self",mds_handle);
+ MDC_REPLY_PORTAL, "self",mds_handle,
+ "mds");
if (!mds->mds_service) {
CERROR("failed to start service\n");
GOTO(err_fs, rc = -EINVAL);
/* This code must change if we ever stop passing an inode in as data */
/* This is ldlm and llite code. It makes me sad that it's in
* osc_request.c --phil */
- lock = ldlm_handle2lock(&lockh);
+ lock = ldlm_handle2lock(lockh);
if (lock) {
/* Lock already has an extra ref from handle2lock */
l_lock(&obddev->obd_namespace->ns_lock);
}
ost->ost_service = ptlrpc_init_svc(64 * 1024, OST_REQUEST_PORTAL,
- OSC_REPLY_PORTAL, "self",ost_handle);
+ OSC_REPLY_PORTAL, "self",ost_handle,
+ "ost");
if (!ost->ost_service) {
CERROR("failed to start service\n");
GOTO(error_disc, err = -EINVAL);
recovd->recovd_service = ptlrpc_init_svc(16* 1024,
CONNMGR_REQUEST_PORTAL,
CONNMGR_REPLY_PORTAL,
- "self", connmgr_handle);
+ "self", connmgr_handle,
+ "connmgr");
if (!recovd->recovd_service) {
CERROR("failed to start service\n");
GOTO(err_recovd, err = -ENOMEM);
struct ptlrpc_service *
ptlrpc_init_svc(__u32 bufsize, int req_portal, int rep_portal, char *uuid,
- svc_handler_t handler)
+ svc_handler_t handler, char *name)
{
int err;
int rc, i;
RETURN(NULL);
}
+ service->srv_name = name;
spin_lock_init(&service->srv_lock);
INIT_LIST_HEAD(&service->srv_reqs);
INIT_LIST_HEAD(&service->srv_threads);
CLONE_VM | CLONE_FS | CLONE_FILES);
if (rc < 0) {
CERROR("cannot start thread\n");
+ OBD_FREE(thread, sizeof(*thread));
RETURN(-EINVAL);
}
wait_event(thread->t_ctl_waitq, thread->t_flags & SVC_RUNNING);
if (!list_empty(&service->srv_reqs)) {
// XXX reply with errors and clean up
CERROR("Request list not empty!\n");
+ rc = -EBUSY;
}
OBD_FREE(service, sizeof(*service));
- return 0;
+ if (rc)
+ LBUG();
+ return rc;
}