From c1ddcbbd530a0d1ae6cff30f6a7317546053f069 Mon Sep 17 00:00:00 2001 From: eeb Date: Fri, 6 Sep 2002 10:43:15 +0000 Subject: [PATCH] premature service teardown bugfix --- lustre/ptlrpc/events.c | 11 +++++++++++ lustre/ptlrpc/service.c | 41 +++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/lustre/ptlrpc/events.c b/lustre/ptlrpc/events.c index 23718b8..b8405fb 100644 --- a/lustre/ptlrpc/events.c +++ b/lustre/ptlrpc/events.c @@ -130,6 +130,17 @@ static int bulk_source_callback(ptl_event_t *ev) struct list_head *next; ENTRY; + if (ev->mem_desc.niov != desc->bd_page_count) + { + int mdniov = ev->mem_desc.niov; + struct ptlrpc_bulk_desc desc_snapshot; + + desc_snapshot = *desc; + + printk ("ev(%p)->mem_desc.niov %d != desc(%p)->bd_page_count %d, snapshot %p\n", + ev, mdniov, desc, desc_snapshot.bd_page_count, &desc_snapshot); + LBUG(); + } /* 1 fragment for each page always */ LASSERT (ev->mem_desc.niov == desc->bd_page_count); diff --git a/lustre/ptlrpc/service.c b/lustre/ptlrpc/service.c index af99b41..478b40a 100644 --- a/lustre/ptlrpc/service.c +++ b/lustre/ptlrpc/service.c @@ -344,27 +344,32 @@ int ptlrpc_start_thread(struct obd_device *dev, struct ptlrpc_service *svc, int ptlrpc_unregister_service(struct ptlrpc_service *service) { int rc, i; - - for (i = 0; i < service->srv_nbuffs; i++) { - struct ptlrpc_request_buffer_desc *rqbd =&service->srv_rqbds[i]; - - if (rqbd->rqbd_buffer == NULL) /* no buffer allocated */ - continue; /* => never initialised */ - - /* Buffer allocated => got linked */ - LASSERT (ptl_is_valid_handle (&rqbd->rqbd_me_h)); - - rc = PtlMEUnlink(rqbd->rqbd_me_h); - if (rc) - CERROR("PtlMEUnlink failed: %d\n", rc); - - OBD_FREE(rqbd->rqbd_buffer, service->srv_buf_size); - } - + + /* NB service->srv_nbuffs gets set before we attempt (and possibly + * fail) to allocate srv_rqbds. + */ if (service->srv_rqbds != NULL) + { + for (i = 0; i < service->srv_nbuffs; i++) { + struct ptlrpc_request_buffer_desc *rqbd = &service->srv_rqbds[i]; + + if (rqbd->rqbd_buffer == NULL) /* no buffer allocated */ + continue; /* => never initialised */ + + /* Buffer allocated => got linked */ + LASSERT (ptl_is_valid_handle (&rqbd->rqbd_me_h)); + + rc = PtlMEUnlink(rqbd->rqbd_me_h); + if (rc) + CERROR("PtlMEUnlink failed: %d\n", rc); + + OBD_FREE(rqbd->rqbd_buffer, service->srv_buf_size); + } + OBD_FREE(service->srv_rqbds, service->srv_nbuffs * sizeof (struct ptlrpc_request_buffer_desc)); - + } + rc = PtlEQFree(service->srv_eq_h); if (rc) CERROR("PtlEQFree failed: %d\n", rc); -- 1.8.3.1