1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * CDDL HEADER START
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * The contents of this file are subject to the terms of the
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Common Development and Distribution License (the "License").
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * You may not use this file except in compliance with the License.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * or http://www.opensolaris.org/os/licensing.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * See the License for the specific language governing permissions
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * and limitations under the License.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * When distributing Covered Code, include this CDDL HEADER in each
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * If applicable, add the following below this CDDL HEADER, with the
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * fields enclosed by brackets "[]" replaced with your own identifying
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * information: Portions Copyright [yyyy] [name of copyright owner]
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * CDDL HEADER END
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Use is subject to license terms.
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport * Case management and saved state restoration
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/* Must be in sync with gmem_ptrsubtype_t */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportstatic gmem_case_closer_f *const gmem_case_closers[] = {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportgmem_case_create(fmd_hdl_t *hdl, gmem_header_t *hdr,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_ptrsubtype_t ptrsubtype, const char **uuidp)
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport cl = fmd_hdl_alloc(hdl, sizeof (gmem_case_closer_t), FMD_SLEEP);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport cl->cl_func = gmem_case_closers[ptrsubtype];
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport (void) strcpy(ptr.ptr_name, hdr->hdr_bufname);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_buf_write(hdl, cp, *uuidp, &ptr, sizeof (gmem_case_ptr_t));
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportgmem_case_redirect(fmd_hdl_t *hdl, fmd_case_t *cp, gmem_ptrsubtype_t newsubtype)
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_buf_read(hdl, cp, uuid, &ptr, sizeof (gmem_case_ptr_t));
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_hdl_debug(hdl, "redirecting case %s from %d to %d\n", uuid,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_buf_write(hdl, cp, uuid, &ptr, sizeof (gmem_case_ptr_t));
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportgmem_case_fini(fmd_hdl_t *hdl, fmd_case_t *cp, int close)
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport gmem_case_closer_t *cl = fmd_case_getspecific(hdl, cp);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_hdl_debug(hdl, "closing case %s\n", uuid);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_hdl_free(hdl, cl, sizeof (gmem_case_closer_t));
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport/* Must be in sync with gmem_nodetype_t */
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenportstatic gmem_case_restorer_f *const gmem_case_restorers[] = {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport while ((cp = fmd_case_next(hdl, cp)) != NULL) {
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport if ((sz = fmd_buf_size(hdl, cp, uuid)) == 0)
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_buf_read(hdl, cp, fmd_case_uuid(hdl, cp), &ptr,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport if ((thing = gmem_case_restorers[ptr.ptr_type](hdl,
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport fmd_hdl_debug(hdl, "Unable to restore case %s\n", uuid);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport cl = fmd_hdl_alloc(hdl, sizeof (gmem_case_closer_t), FMD_SLEEP);
1529f529004c61fcfd0d95ab79b0f257d6ad4451Scott Davenport cl->cl_func = gmem_case_closers[ptr.ptr_subtype];