raidcfg.c revision b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dc
711890bc9379ceea66272dc8d4981812224ea86ejc * CDDL HEADER START
711890bc9379ceea66272dc8d4981812224ea86ejc * The contents of this file are subject to the terms of the
711890bc9379ceea66272dc8d4981812224ea86ejc * Common Development and Distribution License (the "License").
711890bc9379ceea66272dc8d4981812224ea86ejc * You may not use this file except in compliance with the License.
711890bc9379ceea66272dc8d4981812224ea86ejc * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
711890bc9379ceea66272dc8d4981812224ea86ejc * See the License for the specific language governing permissions
711890bc9379ceea66272dc8d4981812224ea86ejc * and limitations under the License.
711890bc9379ceea66272dc8d4981812224ea86ejc * When distributing Covered Code, include this CDDL HEADER in each
711890bc9379ceea66272dc8d4981812224ea86ejc * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
711890bc9379ceea66272dc8d4981812224ea86ejc * If applicable, add the following below this CDDL HEADER, with the
711890bc9379ceea66272dc8d4981812224ea86ejc * fields enclosed by brackets "[]" replaced with your own identifying
711890bc9379ceea66272dc8d4981812224ea86ejc * information: Portions Copyright [yyyy] [name of copyright owner]
711890bc9379ceea66272dc8d4981812224ea86ejc * CDDL HEADER END
72e1c0551e3c92bca8ab60d3f38afd96f35cc88cjc * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
711890bc9379ceea66272dc8d4981812224ea86ejc * Use is subject to license terms.
711890bc9379ceea66272dc8d4981812224ea86ejc#pragma ident "%Z%%M% %I% %E% SMI"
711890bc9379ceea66272dc8d4981812224ea86ejc * Raid object status;
711890bc9379ceea66272dc8d4981812224ea86ejc#if defined(__sparcv9)
711890bc9379ceea66272dc8d4981812224ea86ejc * Basic types
711890bc9379ceea66272dc8d4981812224ea86ejc * Data structures used for object maintennance
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc size_t offset; /* offset of double-linked element (raid_list_el_t) */
711890bc9379ceea66272dc8d4981812224ea86ejc /* in the linked data structures (objects) */
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc * Object type structure containing function pointers;
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc int (*compnum)(raid_obj_tab_t *, raid_obj_id_t, raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*complist)(raid_obj_tab_t *, raid_obj_id_t, int, raid_obj_id_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc int (*set_attr)(raid_obj_tab_t *, raid_obj_id_t, uint32_t, uint32_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc int (*act)(raid_obj_tab_t *, raid_obj_id_t, uint32_t, void *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*delete_obj)(raid_obj_tab_t *, raid_obj_id_t, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*bind_obj)(raid_obj_tab_t *, int, raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*unbind_obj)(raid_obj_tab_t *, int, raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc * Common object data structure
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc * Definition about handle
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc * Function prototypes
711890bc9379ceea66272dc8d4981812224ea86ejcstatic uint64_t raid_space_noalign(raid_obj_tab_t *, uint32_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_handle_fini();
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_handle_t raid_handle_new(raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_handle_t raid_obj_to_handle(raid_obj_tab_t *,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_lib_t *raid_obj_get_lib(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_lib(raid_obj_tab_t *, raid_obj_id_t, raid_lib_t *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_get_fd(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_fd(raid_obj_tab_t *, raid_obj_id_t, int);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_scan_comp(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_get_comp(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_get_sibling(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_get_attr(raid_obj_tab_t *, raid_obj_id_t, void **);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_controller(raid_obj_tab_t *, uint32_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_array(raid_obj_tab_t *, uint32_t, uint32_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_array_recur(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_hsp(raid_obj_tab_t *, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_disk(raid_obj_tab_t *, uint32_t, uint32_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_arraypart(raid_obj_tab_t *, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_diskseg(raid_obj_tab_t *, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_task(raid_obj_tab_t *, uint32_t, uint32_t);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcywstatic raid_obj_id_t obj_locate_prop(raid_obj_tab_t *, uint32_t, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_get_controller(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_sys_compnum(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_sys_complist(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_controller_compnum(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_controller_complist(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_controller_get_attr(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_controller_act(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t, void *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_array_compnum(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_array_complist(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_array_get_attr(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_array_set_attr(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_disk_compnum(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_disk_complist(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_disk_get_attr(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_hsp_get_attr(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_arraypart_get_attr(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_diskseg_get_attr(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_task_get_attr(raid_obj_tab_t *, raid_obj_id_t);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcywstatic int obj_prop_get_attr(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_array_create(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_array_delete(raid_obj_tab_t *, raid_obj_id_t, char **);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_hsp_bind(raid_obj_tab_t *, int, raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_hsp_unbind(raid_obj_tab_t *, int, raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t raid_obj_create(raid_obj_tab_t *, raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_delete(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_add_org(raid_obj_tab_t *, raid_obj_id_t, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_type_id_t raid_obj_get_type(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_type(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_status_t raid_obj_get_status(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_status(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_clear_status(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t raid_obj_get_container(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_container(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t raid_obj_get_comp(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_comp(raid_obj_tab_t *, raid_obj_id_t, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t raid_obj_get_sibling(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_sibling(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_obj_get_data_ptr(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_data_ptr(raid_obj_tab_t *, raid_obj_id_t, void *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_handle_t raid_obj_get_handle(raid_obj_tab_t *,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_handle(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_list_find(raid_list_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_tab_insert(raid_obj_tab_t *, raid_obj_id_t, void *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_obj_tab_remove(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_obj_tab_find(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_plugin_init();
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_lib_t *raid_find_lib(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejc/* Global object table */
711890bc9379ceea66272dc8d4981812224ea86ejc/* Plug-in modules maintenance data structures */
711890bc9379ceea66272dc8d4981812224ea86ejc/* Handle table definition */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic struct {
711890bc9379ceea66272dc8d4981812224ea86ejc * RAID object method table definition
711890bc9379ceea66272dc8d4981812224ea86ejc {obj_array_compnum, obj_array_complist, obj_array_get_attr,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_array_delete, NULL, NULL}, /* array object methods */
711890bc9379ceea66272dc8d4981812224ea86ejc {obj_disk_compnum, obj_disk_complist, obj_disk_get_attr, NULL,
711890bc9379ceea66272dc8d4981812224ea86ejc {NULL, NULL, obj_hsp_get_attr, NULL, NULL, NULL, NULL, obj_hsp_bind,
711890bc9379ceea66272dc8d4981812224ea86ejc {NULL, NULL, obj_arraypart_get_attr, NULL, NULL, NULL, NULL,
711890bc9379ceea66272dc8d4981812224ea86ejc {NULL, NULL, obj_diskseg_get_attr, NULL, NULL, NULL, NULL, NULL, NULL},
711890bc9379ceea66272dc8d4981812224ea86ejc * Mutex for multithread safe
711890bc9379ceea66272dc8d4981812224ea86ejc * RaidCfg library APIs
711890bc9379ceea66272dc8d4981812224ea86ejcconst char *
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Operation succeeded.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Request standard IOCTL service.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Controller device can not be found.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Can not open controller.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Controller is locked.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Controller is not opened.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Operation across multiple controllers.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Operation not support with volume of this level.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Capacity of array out of range.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Illegal stripe size.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Illegal cache-write policy.\n");
474adcbbaccaea8fdfe9f051bdc1eea0b8add507yw ret_val = dgettext(TEXT_DOMAIN, "Array or disk in use.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Array has background task.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Configuration over device node failed.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Incorrect number of disks.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Illegal array layout.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Incorrect disk status for current operation.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "No enough disk space.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Too many disk segments.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Disk has occupied space.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Disk has background task.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Incorrect task state for current operation.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Operation is not implemented.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Illegal type of device.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Device record duplicated.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Device pool is not clean.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Device record is invalid.\n");
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Can not allocate more memory space.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_controller(&raid_tab_sys, controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_get_array(int controller_handle, uint64_t target_id, uint64_t lun)
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, controller_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(&raid_tab_sys, obj_id, OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(&raid_tab_sys, obj_id, (void **)(&attr));
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, controller_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(&raid_tab_sys, obj_id, OBJ_TYPE_DISK);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(&raid_tab_sys, obj_id, (void **)(&attr));
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_open_controller(int handle, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_close_controller(int handle, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc switch (type) {
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&ctlr_attr));
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&array_attr));
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&ctlr_attr));
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&disk_attr));
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_set_attr(int handle, uint32_t set_cmd, void *value,
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_update_fw(int handle, char *file, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(&raid_tab_sys, obj_id) != OBJ_TYPE_CONTROLLER) {
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_CONTROLLER].act(&raid_tab_sys,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t raid_level, uint64_t size, uint32_t stripe_size,
711890bc9379ceea66272dc8d4981812224ea86ejc disk_obj_ids = calloc(num_of_comps, sizeof (raid_obj_id_t));
711890bc9379ceea66272dc8d4981812224ea86ejc /* convert disk handles into disk object ids; */
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num_of_comps; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(&raid_tab_sys, *(disk_obj_ids + i)) !=
711890bc9379ceea66272dc8d4981812224ea86ejc /* Create an empty array object */
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = raid_obj_get_data_ptr(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_ARRAY].create_obj(&raid_tab_sys, obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc /* create_obj() method should put the array object in the device tree */
711890bc9379ceea66272dc8d4981812224ea86ejc array_handle = raid_obj_to_handle(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_delete_array(int array_handle, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc array_obj_id = raid_handle_to_obj(&raid_tab_sys, array_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_ARRAY].delete_obj(&raid_tab_sys,
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_set_hsp(int num, raidcfg_hsp_relation_t *hsp_relations,
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_relation_objs = malloc(2 * num * sizeof (raid_obj_id_t));
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; ++ i) {
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_HSP].bind_obj(&raid_tab_sys, num,
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_unset_hsp(int num, raidcfg_hsp_relation_t *hsp_relations,
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_relation_objs = malloc(2 * num * sizeof (raid_obj_id_t));
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; ++ i) {
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_HSP].unbind_obj(&raid_tab_sys,
711890bc9379ceea66272dc8d4981812224ea86ejc * RaidCfg lib routines
711890bc9379ceea66272dc8d4981812224ea86ejc * Need to close all opened controllers before destroying object table
711890bc9379ceea66272dc8d4981812224ea86ejc * Support routines
711890bc9379ceea66272dc8d4981812224ea86ejc i = *((int *)p1);
711890bc9379ceea66272dc8d4981812224ea86ejc j = *((int *)p2);
711890bc9379ceea66272dc8d4981812224ea86ejc return (i - j);
711890bc9379ceea66272dc8d4981812224ea86ejcraid_space_noalign(raid_obj_tab_t *raid_tab, uint32_t raid_level, int num,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *disk_objs, arraypart_attr_t *arraypart_attrs)
711890bc9379ceea66272dc8d4981812224ea86ejc /* Find out the maximum available space for all disks */
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; ++i) {
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&disk_attr));
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&diskseg_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if ((disk_attr->capacity - offset) > arraypart_attrs[i].size) {
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc * Raid handle maintenance routines
711890bc9379ceea66272dc8d4981812224ea86ejc /* Clean up the new allocated handles */
711890bc9379ceea66272dc8d4981812224ea86ejc /* For the first time of allocation, set up the system object handle */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejc /* Close all opened controllers */
711890bc9379ceea66272dc8d4981812224ea86ejc while (i != 0) {
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_handle_sys.handles[i].type == OBJ_TYPE_CONTROLLER) &&
711890bc9379ceea66272dc8d4981812224ea86ejc /* Clean up handle space */
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_handle_sys.unused == raid_handle_sys.handle_num - 1) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.unused = raid_handle_sys.handles[ret].next;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[ret].next = raid_handle_sys.used;
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejc while (i != 0 && i != handle) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (i == handle) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (j != 0)
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_handle_delete_controller_comp(uint32_t controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc while (i != 0) {
711890bc9379ceea66272dc8d4981812224ea86ejcraid_handle_to_obj(raid_obj_tab_t *raid_tab, raid_obj_handle_t handle)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_to_handle(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc /* If the object mapped by a handle */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Search for existing handles */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Allocate new handle for this object */
711890bc9379ceea66272dc8d4981812224ea86ejc switch (type) {
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].array_id = array_attr->array_id;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].disk_id = disk_attr->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].disk_id = disk_attr->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].seq_id = diskseg_attr->seq_no;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].task_id = task_attr->task_id;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_handle_sys.handles[handle].disk_id = disk_attr->disk_id;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_handle(raid_tab, obj_id_backup, handle);
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_lib(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_handle_sys.handles[handle].type != OBJ_TYPE_CONTROLLER ||
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_lib(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_handle_sys.handles[handle].type != OBJ_TYPE_CONTROLLER ||
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_fd(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_handle_sys.handles[handle].type != OBJ_TYPE_CONTROLLER ||
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_fd(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id, int fd)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_handle_sys.handles[handle].type != OBJ_TYPE_CONTROLLER ||
711890bc9379ceea66272dc8d4981812224ea86ejc * Raid object maintenance routines
711890bc9379ceea66272dc8d4981812224ea86ejcobj_scan_comp(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc for (obj_type_cnt = OBJ_SYSTEM; obj_type_cnt < OBJ_TYPE_ALL;
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_SCANCOMP);
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_tab_create(raid_tab, HASH_SLOTS) != SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc if ((ret = raid_obj_create_system_obj(raid_tab)) != SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejcobj_get_comp(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc if ((obj_type < OBJ_TYPE_SYSTEM) || (obj_type > OBJ_TYPE_ALL))
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_get_sibling(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id, void **data)
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_controller(raid_obj_tab_t *raid_tab, uint32_t controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, OBJ_SYSTEM, OBJ_TYPE_CONTROLLER);
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) != OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_array(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_array_recur(raid_tab, obj_id, array_id);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, container_obj_id, OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_locate_array_recur(raid_tab, obj_id, array_id);
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_hsp(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_disk(raid_tab, controller_id, disk_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(raid_tab, obj_id, (void **)(&hsp_attr));
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_disk(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_arraypart(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_array(raid_tab, controller_id, array_id);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_ARRAY_PART);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_diskseg(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_disk(raid_tab, controller_id, disk_id);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_DISK_SEG);
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_task(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id2 = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc task_obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_TASK);
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc task_obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_TASK);
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcywobj_locate_prop(raid_obj_tab_t *raid_tab, uint32_t controller_id,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw obj_id = obj_locate_disk(raid_tab, controller_id, disk_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) obj_get_attr(raid_tab, obj_id, (void **)(&prop_attr));
711890bc9379ceea66272dc8d4981812224ea86ejcobj_get_controller(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_obj_get_type(raid_tab, id) != OBJ_TYPE_CONTROLLER) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc * Raid object operation routines
711890bc9379ceea66272dc8d4981812224ea86ejcobj_sys_compnum(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_SYSTEM))
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_id_to_path(controller_id, path) == SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejcobj_sys_complist(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc int num, raid_obj_id_t *comp_list, raid_obj_type_id_t comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc int i = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_id_to_path(controller_id, path) == SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc qsort((void *)tmplist, num, sizeof (uint32_t), intcompare);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; i++) {
711890bc9379ceea66272dc8d4981812224ea86ejcobj_controller_compnum(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc if ((comp_type != OBJ_TYPE_ARRAY) && (comp_type != OBJ_TYPE_DISK))
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (ctl_attrp == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejcobj_controller_complist(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc int comp_num, raid_obj_id_t *comp_list, raid_obj_type_id_t comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc if ((comp_type != OBJ_TYPE_ARRAY) && (comp_type != OBJ_TYPE_DISK))
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++i)
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (ctl_attrp == NULL)|| (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc qsort((void *)ids, comp_num, sizeof (uint32_t), intcompare);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++ i) {
711890bc9379ceea66272dc8d4981812224ea86ejc attr_buf = raid_obj_get_data_ptr(raid_tab, *(comp_list + i));
711890bc9379ceea66272dc8d4981812224ea86ejcobj_controller_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc * For a controller, even it's not opened, we can still
711890bc9379ceea66272dc8d4981812224ea86ejc * get the driver name
711890bc9379ceea66272dc8d4981812224ea86ejc if (fd == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->get_attr(attr->controller_id, OBJ_ATTR_NONE,
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_controller_act(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t sub_cmd, void *prop_list, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if already opened */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if plugin is already attached */
711890bc9379ceea66272dc8d4981812224ea86ejc if (fd <= 0)
711890bc9379ceea66272dc8d4981812224ea86ejc /* Open firmware image file */
711890bc9379ceea66272dc8d4981812224ea86ejc if (fd <= 0) {
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_compnum(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->compnum(ctl_attrp->controller_id, attr->array_id,
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_complist(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc int comp_num, raid_obj_id_t *comp_list, raid_obj_type_id_t comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++i)
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->array_id, OBJ_TYPE_ARRAY, comp_type, comp_num, ids);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++ i) {
711890bc9379ceea66272dc8d4981812224ea86ejc attr_buf = raid_obj_get_data_ptr(raid_tab, *(comp_list + i));
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_set_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t sub_cmd, uint32_t *value, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY)
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_disk_compnum(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_DISK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_disk_complist(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc int comp_num, raid_obj_id_t *comp_list, raid_obj_type_id_t comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_DISK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++i)
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++ i) {
711890bc9379ceea66272dc8d4981812224ea86ejc attr_buf = raid_obj_get_data_ptr(raid_tab, *(comp_list + i));
711890bc9379ceea66272dc8d4981812224ea86ejcobj_disk_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_DISK)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_hsp_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejcobj_arraypart_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY_PART)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = raid_obj_get_data_ptr(raid_tab, array_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_diskseg_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_DISK_SEG)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr = raid_obj_get_data_ptr(raid_tab, disk_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw disk_attr->disk_id, attr->seq_no, OBJ_TYPE_DISK_SEG, attr);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_task_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_TASK)
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcywobj_prop_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_PROP)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw disk_attr = raid_obj_get_data_ptr(raid_tab, disk_obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw controller_obj_id = obj_get_controller(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw /* Get the property size at first */
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw /* Allocate memory for property and fill the buffer */
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw attr_new = realloc(attr, sizeof (property_attr_t) + attr->prop_size);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) raid_obj_set_data_ptr(raid_tab, obj_id, attr_new);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw disk_attr->disk_id, OBJ_ATTR_NONE, OBJ_TYPE_PROP, attr_new);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_create(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc int num_of_comp, raid_obj_id_t *disk_list, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc int disk_cnt = 0, disk_set_num = 0, set_num = 0, layer_cnt = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = raid_obj_get_data_ptr(raid_tab, array_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check the disk layout expression */
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num_of_comp; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs = calloc(num_of_comp, sizeof (arraypart_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num_of_comp; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc /* Keep seperators */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if it's a disk */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if it's duplicated with other disks */
711890bc9379ceea66272dc8d4981812224ea86ejc for (j = 0; j < i; ++j)
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check disk status */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&disk_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* All disks must belong to the same controller */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if the disk contains too many segments */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if controller is a hostraid controller */
711890bc9379ceea66272dc8d4981812224ea86ejc * For hostraid, the first disk should
711890bc9379ceea66272dc8d4981812224ea86ejc * be with of minimum capacity
711890bc9379ceea66272dc8d4981812224ea86ejc /* Can not specify capacity for hostraid */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Disk should not be used for hostraid */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if array amount exceeds limit */
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if the controller can support the array RAID level */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if plug in can calculate the maximum size */
711890bc9379ceea66272dc8d4981812224ea86ejc (void) memcpy(&array_attr2, array_attr, sizeof (array_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->array_create(controller_attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw &array_attr2, num_of_comp, arraypart_attrs, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc /* If plugin/driver will not calculate space */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Calculate the maximum capacity */
711890bc9379ceea66272dc8d4981812224ea86ejc * If controller is capable to allocate space,
711890bc9379ceea66272dc8d4981812224ea86ejc * set offset and size attributes to OBJ_ATTR_NONE
711890bc9379ceea66272dc8d4981812224ea86ejc * and let the controller to determine these value
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num_of_comp; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc /* There's no enough space for specified capacity */
711890bc9379ceea66272dc8d4981812224ea86ejc /* capacity == 0, allocate maximum space */
711890bc9379ceea66272dc8d4981812224ea86ejc } else if (array_attr2.capacity < array_attr->capacity) {
711890bc9379ceea66272dc8d4981812224ea86ejc /* Return the maximum size */
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_attr->capacity < ARRAYPART_MIN_SIZE * disk_cnt) {
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->array_create(controller_attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw array_attr, num_of_comp, arraypart_attrs, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc /* Add array object into device tree so that we can map the handle */
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_add_org(raid_tab, array_obj_id, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_delete(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, array_obj_id);
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(raid_tab, array_obj_id, (void **)(&array_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->array_delete(controller_attr->controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejcobj_hsp_bind(raid_obj_tab_t *raid_tab, int num, raid_obj_id_t *obj_ids,
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, disk_obj_id) != OBJ_TYPE_DISK ||
711890bc9379ceea66272dc8d4981812224ea86ejc /* Get controller attributes */
711890bc9379ceea66272dc8d4981812224ea86ejc else if (controller_obj_id != obj_get_controller(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* Get disk attributes */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&disk_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* If it's not a hsp disk, check if there's occupied space */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&diskseg_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* If local hsp is supported */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Get array attributes */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&array_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* RAID 0 array can not use hsp */
711890bc9379ceea66272dc8d4981812224ea86ejc /* If It's belong to another controller */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Get an array part attributes */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&arraypart_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if disk space is enough for array */
711890bc9379ceea66272dc8d4981812224ea86ejc } else if (!(controller_attr->capability & RAID_CAP_G_HSP)) {
711890bc9379ceea66272dc8d4981812224ea86ejc /* if global hsp is supported */
711890bc9379ceea66272dc8d4981812224ea86ejc * If the array is already associated with the
711890bc9379ceea66272dc8d4981812224ea86ejc * local hsp, or it's a global hsp, ignore it
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, disk_obj_id, OBJ_TYPE_HSP);
711890bc9379ceea66272dc8d4981812224ea86ejc if (j == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejcobj_hsp_unbind(raid_obj_tab_t *raid_tab, int num, raid_obj_id_t *obj_ids,
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, disk_obj_id) != OBJ_TYPE_DISK) {
711890bc9379ceea66272dc8d4981812224ea86ejc /* Get controller attributes */
711890bc9379ceea66272dc8d4981812224ea86ejc else if (controller_obj_id != obj_get_controller(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* Get disk attributes */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&disk_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* If it's not a hsp disk */
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, disk_obj_id, OBJ_TYPE_HSP);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(raid_tab, obj_id, (void **)(&hsp_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* Get array attributes */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&array_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* If It's belong to another controller */
711890bc9379ceea66272dc8d4981812224ea86ejc /* If want to remove an array from a global hsp */
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&hsp_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* if global hsp is supported */
711890bc9379ceea66272dc8d4981812224ea86ejc * If array is associated with a local hsp, or remove a
711890bc9379ceea66272dc8d4981812224ea86ejc * global hsp disk
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->hsp_unbind(controller_attr->controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc * Object maintennance routines
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_tab_insert(raid_tab, raid_obj->obj_id, raid_obj);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_create(raid_obj_tab_t *raid_tab, raid_obj_type_id_t obj_type)
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_tab_insert(raid_tab, raid_obj->obj_id, raid_obj);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_data_ptr(raid_tab, raid_obj->obj_id, data_ptr);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_type(raid_tab, raid_obj->obj_id, obj_type);
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_delete(raid_obj_tab_t *raid_tab, raid_obj_id_t raid_obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_add_org(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_container(raid_tab, obj_id, container_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_comp(raid_tab, container_id, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc while ((tmp1 = raid_obj_get_sibling(raid_tab, tmp)) != OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_set_sibling(raid_tab, tmp, obj_id) < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_container(raid_tab, obj_id, container_id);
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_type(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_type(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_status(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_status(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_clear_status(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_container(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_container(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_comp(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_comp(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_sibling(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_sibling(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_data_ptr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_data_ptr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_handle(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_handle(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc * Object list maintennance routines
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_tab_create(raid_obj_tab_t *tab, size_t hash_slots)
711890bc9379ceea66272dc8d4981812224ea86ejc unsigned i;
711890bc9379ceea66272dc8d4981812224ea86ejc if ((tab->table = calloc(hash_slots, sizeof (raid_list_t))) == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < hash_slots; i++)
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_create(&tab->table[i], offsetof(raid_obj_t, el));
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejc unsigned i;
711890bc9379ceea66272dc8d4981812224ea86ejc while ((obj = raid_list_remove_head(&tab->table[i])) != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_tab_insert(raid_obj_tab_t *tab, raid_obj_id_t id, void *obj)
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_tab_remove(raid_obj_tab_t *tab, raid_obj_id_t id)
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejc * Plug-in maintennance routines
711890bc9379ceea66272dc8d4981812224ea86ejc char buf[MAX_PATH_LEN] = {0}, buf1[MAX_PATH_LEN] = {0}, *colon;
711890bc9379ceea66272dc8d4981812224ea86ejc (void) snprintf(buf, MAX_PATH_LEN, "%s/c%d", CFGDIR, controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic char *
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_version")) == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_open_controller")) ==
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->open_controller = (int(*)(uint32_t, char **))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_close_controller")) ==
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->close_controller = (int (*)(uint32_t, char **))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_compnum")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_complist")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t, raid_obj_type_id_t, int, void *))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_get_attr")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->get_attr = (int (*)(uint32_t, uint32_t, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_array_create")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->array_create = (int (*)(uint32_t, array_attr_t *, int,
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_array_delete")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->hsp_bind = (int (*)(uint32_t, uint32_t, hsp_relation_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->hsp_unbind = (int (*)(uint32_t, uint32_t, hsp_relation_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->set_attr = (int (*)(uint32_t, uint32_t, uint32_t, uint32_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->flash_fw = (int (*)(uint32_t, char *, uint32_t, char **))
711890bc9379ceea66272dc8d4981812224ea86ejcraid_find_lib(raid_obj_tab_t *raid_tab, raid_obj_id_t controller_obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if it's mapped to handle structure */
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_obj_to_handle(raid_tab, controller_obj_id);
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if the plugin module is already loaded */
711890bc9379ceea66272dc8d4981812224ea86ejc /* Loading the plugin module */