static void vdev_mirror_close(vdev_t *vd) { int c; for (c = 0; c < vd->vdev_children; c++) vdev_close(vd->vdev_child[c]); }
void vdev_free(vdev_t *vd) { int c; /* * vdev_free() implies closing the vdev first. This is simpler than * trying to ensure complicated semantics for all callers. */ vdev_close(vd); ASSERT(!list_link_active(&vd->vdev_dirty_node)); /* * Free all children. */ for (c = 0; c < vd->vdev_children; c++) vdev_free(vd->vdev_child[c]); ASSERT(vd->vdev_child == NULL); ASSERT(vd->vdev_guid_sum == vd->vdev_guid); /* * Discard allocation state. */ if (vd == vd->vdev_top) vdev_metaslab_fini(vd); ASSERT3U(vd->vdev_stat.vs_space, ==, 0); ASSERT3U(vd->vdev_stat.vs_dspace, ==, 0); ASSERT3U(vd->vdev_stat.vs_alloc, ==, 0); /* * Remove this vdev from its parent's child list. */ vdev_remove_child(vd->vdev_parent, vd); ASSERT(vd->vdev_parent == NULL); vdev_free_common(vd); }
/** * close onet layer */ void onet_closelay( void ) { onet_t *onet = onet_main; GList *elem; // close all tunnel while( (elem = onet->tunnel_list) ){ onet_tunnel_t *tunnel = elem->data; onet_tunnel_close( tunnel ); } // close all pending ns_req_dst_iaddr while( (elem = onet->ns_req_dst_iaddr_list) ){ onet_ns_req_dst_iaddr_t *ns_req_dst_iaddr = elem->data; onet_ns_req_dst_iaddr_del( ns_req_dst_iaddr ); } // close the iaddr_log_client if it is still running if( ip_addr_is_null(&onet->ip_iaddr) ){ iaddr_log_client_close( &onet->iaddr_log_client ); }else{ // delete the handler in httpd httpd_handler_del_by_path( "/neoip_router" ); // vdev_unregister_callback( vdev, onet_vdev_in ); vdev_close( &onet->vdev ); // stop responder resp_stop(onet->resp); // stop the dnsgrab layer if( prop_get_bool_dfl( "neoip_router", "debug:dnsgrab", 1) ){ dnsgrab_stop(); watchdog_close(); } } // open the dst_iaddr_negcache dst_iaddr_negcache_close( onet->dst_iaddr_negcache ); // free the memory nipmem_free( onet ); onet_main = NULL; }