OBD_ALLOC(service, sizeof(*service));
if ( !service ) {
- CERROR("no memory\n");
LBUG();
- return NULL;
+ RETURN(NULL);
}
memset(service, 0, sizeof(*service));
err = kportal_uuid_to_peer(uuid, &service->srv_self);
if (err) {
CERROR("cannot get peer for uuid %s", uuid);
- OBD_FREE(service, sizeof(*service));
- return NULL;
+ GOTO(err_free, NULL);
}
service->srv_ring_length = RPC_RING_LENGTH;
if (rc != PTL_OK) {
CERROR("PtlEQAlloc failed: %d\n", rc);
LBUG();
- return NULL;
+ GOTO(err_free, NULL);
}
for (i = 0; i < service->srv_ring_length; i++) {
if (service->srv_buf[i] == NULL) {
CERROR("no memory\n");
LBUG();
- return NULL;
+ GOTO(err_ring, NULL);
}
service->srv_ref_count[i] = 0;
ptlrpc_link_svc_me(service, i);
service->srv_req_portal);
return service;
+err_ring:
+ service->srv_ring_length = i;
+ rpc_unregister_service(service); // XXX verify this is right
+ PtlEQFree(service->srv_eq_h);
+err_free:
+ OBD_FREE(service, sizeof(*service));
+ return NULL;
}
static int ptlrpc_main(void *arg)