Whamcloud - gitweb
premature service teardown bugfix
authoreeb <eeb>
Fri, 6 Sep 2002 10:43:15 +0000 (10:43 +0000)
committereeb <eeb>
Fri, 6 Sep 2002 10:43:15 +0000 (10:43 +0000)
lustre/ptlrpc/events.c
lustre/ptlrpc/service.c

index 23718b8..b8405fb 100644 (file)
@@ -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);
 
index af99b41..478b40a 100644 (file)
@@ -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);