711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * CDDL HEADER START
711890bc9379ceea66272dc8d4981812224ea86ejc *
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 *
711890bc9379ceea66272dc8d4981812224ea86ejc * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
711890bc9379ceea66272dc8d4981812224ea86ejc * or http://www.opensolaris.org/os/licensing.
711890bc9379ceea66272dc8d4981812224ea86ejc * See the License for the specific language governing permissions
711890bc9379ceea66272dc8d4981812224ea86ejc * and limitations under the License.
711890bc9379ceea66272dc8d4981812224ea86ejc *
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 *
711890bc9379ceea66272dc8d4981812224ea86ejc * CDDL HEADER END
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
edabaf6ffacd63543916397cd0987024b1f1e1deMilan Jurik * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
711890bc9379ceea66272dc8d4981812224ea86ejc * Use is subject to license terms.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc#include <fcntl.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <sys/types.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <sys/stat.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <stddef.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <stdlib.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <dirent.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <dlfcn.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <link.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <strings.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <stdio.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <unistd.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <sys/mnttab.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <config_admin.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <sys/param.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <libintl.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <libdevinfo.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <raidcfg.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <thread.h>
711890bc9379ceea66272dc8d4981812224ea86ejc#include <synch.h>
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc#ifndef TEXT_DOMAIN
711890bc9379ceea66272dc8d4981812224ea86ejc#define TEXT_DOMAIN "SYS_TEST"
711890bc9379ceea66272dc8d4981812224ea86ejc#endif
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc#define HASH_SLOTS 16
711890bc9379ceea66272dc8d4981812224ea86ejc#define HANDLER_SLOTS 256
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Raid object status;
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejc#define OBJ_STATUS_CMD_CLEAN -1
711890bc9379ceea66272dc8d4981812224ea86ejc#define OBJ_STATUS_OPENED 1
711890bc9379ceea66272dc8d4981812224ea86ejc#define OBJ_STATUS_SCANCOMP 1 << 1
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc#if defined(__sparcv9)
711890bc9379ceea66272dc8d4981812224ea86ejc#define SUPP_PLUGIN_DIR "/usr/lib/raidcfg/sparcv9"
711890bc9379ceea66272dc8d4981812224ea86ejc#elif defined(__amd64)
711890bc9379ceea66272dc8d4981812224ea86ejc#define SUPP_PLUGIN_DIR "/usr/lib/raidcfg/amd64"
711890bc9379ceea66272dc8d4981812224ea86ejc#else
711890bc9379ceea66272dc8d4981812224ea86ejc#define SUPP_PLUGIN_DIR "/usr/lib/raidcfg"
711890bc9379ceea66272dc8d4981812224ea86ejc#endif
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Basic types
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejctypedef int raid_obj_id_t;
711890bc9379ceea66272dc8d4981812224ea86ejctypedef int raid_obj_status_t;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Data structures used for object maintennance
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc void *head;
711890bc9379ceea66272dc8d4981812224ea86ejc void *tail;
711890bc9379ceea66272dc8d4981812224ea86ejc size_t offset; /* offset of double-linked element (raid_list_el_t) */
711890bc9379ceea66272dc8d4981812224ea86ejc /* in the linked data structures (objects) */
711890bc9379ceea66272dc8d4981812224ea86ejc} raid_list_t;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc void *prev;
711890bc9379ceea66272dc8d4981812224ea86ejc void *next;
711890bc9379ceea66272dc8d4981812224ea86ejc} raid_list_el_t;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id_cnt; /* id 0 is reserved */
711890bc9379ceea66272dc8d4981812224ea86ejc size_t slots; /* How many lists linked by *table */
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_t *table;
711890bc9379ceea66272dc8d4981812224ea86ejc} raid_obj_tab_t;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Object type structure containing function pointers;
711890bc9379ceea66272dc8d4981812224ea86ejc */
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 raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*get_attr)(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*set_attr)(raid_obj_tab_t *, raid_obj_id_t, uint32_t, uint32_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc char **);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*act)(raid_obj_tab_t *, raid_obj_id_t, uint32_t, void *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*create_obj)(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc int (*delete_obj)(raid_obj_tab_t *, raid_obj_id_t, char **);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang int (*bind_obj)(raid_obj_tab_t *, raid_obj_id_t *, char **);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang int (*unbind_obj)(raid_obj_tab_t *, raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc} raid_obj_op_t;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Common object data structure
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_el_t el; /* double-links */
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t obj_type_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_status_t status;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t container;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t sibling;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t component;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc void *data; /* Pointer to attribute structure */
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t handle;
711890bc9379ceea66272dc8d4981812224ea86ejc} raid_obj_t;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Definition about handle
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejctypedef struct {
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t next;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t type;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t array_id;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc uint64_t seq_id;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t task_id;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw uint32_t prop_id;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t fd; /* Only for controller */
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib; /* Only for controller */
711890bc9379ceea66272dc8d4981812224ea86ejc} handle_attr_t;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc#define LIST_OBJ_TO_EL(list, obj) \
711890bc9379ceea66272dc8d4981812224ea86ejc ((void *)((char *)(obj) + (list)->offset))
711890bc9379ceea66272dc8d4981812224ea86ejc#define OBJ_TAB_SLOT(tab, id) \
711890bc9379ceea66272dc8d4981812224ea86ejc ((tab)->table + ((id)%(tab)->slots))
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc#pragma init(raidcfg_init)
711890bc9379ceea66272dc8d4981812224ea86ejc#pragma fini(raidcfg_fini)
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Function prototypes
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int intcompare(const void *p1, const void *p2);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic uint64_t raid_space_noalign(raid_obj_tab_t *, uint32_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *, arraypart_attr_t *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_handle_init();
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_handle_fini();
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_handle_t raid_handle_new(raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_handle_delete(raid_obj_handle_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_handle_delete_controller_comp(uint32_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t raid_handle_to_obj(raid_obj_tab_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_handle_t raid_obj_to_handle(raid_obj_tab_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_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 int obj_rescan(raid_obj_tab_t *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_get_comp(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_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,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_hsp(raid_obj_tab_t *, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_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,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t, uint32_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_locate_diskseg(raid_obj_tab_t *, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_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,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw uint32_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t obj_get_controller(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_sys_compnum(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_sys_complist(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *, raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_controller_compnum(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_controller_complist(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *, raid_obj_type_id_t);
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,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_array_complist(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *, raid_obj_type_id_t);
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,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t, uint32_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_disk_compnum(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int obj_disk_complist(raid_obj_tab_t *, raid_obj_id_t, int,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *, raid_obj_type_id_t);
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 **);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wangstatic int obj_hsp_bind(raid_obj_tab_t *, raid_obj_id_t *, char **);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wangstatic int obj_hsp_unbind(raid_obj_tab_t *, raid_obj_id_t *, char **);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_create_system_obj(raid_obj_tab_t *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t raid_obj_id_new(raid_obj_tab_t *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_obj_attr_new(raid_obj_type_id_t);
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,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_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,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_status_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_clear_status(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_status_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,
711890bc9379ceea66272dc8d4981812224ea86ejc 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,
711890bc9379ceea66272dc8d4981812224ea86ejc 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 *,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_set_handle(raid_obj_tab_t *, raid_obj_id_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_list_create(raid_list_t *, size_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_list_head(raid_list_t *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_list_next(raid_list_t *, void *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_list_insert_tail(raid_list_t *, void *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_list_remove(raid_list_t *, void *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_list_remove_head(raid_list_t *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *raid_list_find(raid_list_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int raid_obj_tab_create(raid_obj_tab_t *, size_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_obj_tab_destroy(raid_obj_tab_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_list_destroy(raid_list_t *);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int controller_id_to_path(uint32_t, char *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic char *controller_id_to_driver_name(uint32_t);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void raid_plugin_init();
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_lib_t *raid_plugin_load(char *);
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_lib_t *raid_find_lib(raid_obj_tab_t *, raid_obj_id_t);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/* Global object table */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_tab_t raid_tab_sys = {0, 0, NULL};
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/* Plug-in modules maintenance data structures */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_lib_t *raid_lib_sys = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/* Handle table definition */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic struct {
711890bc9379ceea66272dc8d4981812224ea86ejc int handle_num;
711890bc9379ceea66272dc8d4981812224ea86ejc int used;
711890bc9379ceea66272dc8d4981812224ea86ejc int unused;
711890bc9379ceea66272dc8d4981812224ea86ejc handle_attr_t *handles;
711890bc9379ceea66272dc8d4981812224ea86ejc} raid_handle_sys = {0, 0, 0, NULL};
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * RAID object method table definition
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_op_t raid_obj_op_sys[OBJ_TYPE_ALL] = {
711890bc9379ceea66272dc8d4981812224ea86ejc {obj_sys_compnum, obj_sys_complist, NULL, NULL, NULL,
711890bc9379ceea66272dc8d4981812224ea86ejc NULL, NULL, NULL, NULL}, /* system object methods */
711890bc9379ceea66272dc8d4981812224ea86ejc {obj_controller_compnum, obj_controller_complist,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_controller_get_attr, NULL, obj_controller_act,
711890bc9379ceea66272dc8d4981812224ea86ejc NULL, NULL, NULL, NULL}, /* controller object methods */
711890bc9379ceea66272dc8d4981812224ea86ejc {obj_array_compnum, obj_array_complist, obj_array_get_attr,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_array_set_attr, NULL, obj_array_create,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_array_delete, NULL, NULL}, /* array object methods */
711890bc9379ceea66272dc8d4981812224ea86ejc {obj_disk_compnum, obj_disk_complist, obj_disk_get_attr, NULL,
711890bc9379ceea66272dc8d4981812224ea86ejc NULL, NULL, NULL, NULL, NULL}, /* disk object methods */
711890bc9379ceea66272dc8d4981812224ea86ejc {NULL, NULL, obj_hsp_get_attr, NULL, NULL, NULL, NULL, obj_hsp_bind,
711890bc9379ceea66272dc8d4981812224ea86ejc obj_hsp_unbind}, /* hsp object methods */
711890bc9379ceea66272dc8d4981812224ea86ejc {NULL, NULL, obj_arraypart_get_attr, NULL, NULL, NULL, NULL,
711890bc9379ceea66272dc8d4981812224ea86ejc NULL, NULL}, /* array part object methods */
711890bc9379ceea66272dc8d4981812224ea86ejc {NULL, NULL, obj_diskseg_get_attr, NULL, NULL, NULL, NULL, NULL, NULL},
711890bc9379ceea66272dc8d4981812224ea86ejc {NULL, NULL, obj_task_get_attr, NULL, NULL, NULL, NULL,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw NULL, NULL}, /* disk seg object methods */
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw {NULL, NULL, obj_prop_get_attr, NULL, NULL, NULL, NULL,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw NULL, NULL} /* property object methods */
711890bc9379ceea66272dc8d4981812224ea86ejc};
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Mutex for multithread safe
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic mutex_t raidcfg_mp;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * RaidCfg library APIs
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcconst char *
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_errstr(int err_code)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc char *ret_val;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc switch (err_code) {
711890bc9379ceea66272dc8d4981812224ea86ejc case SUCCESS:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Operation succeeded.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case STD_IOCTL:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Request standard IOCTL service.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DRIVER_NOT_FOUND:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Controller device can not be found.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DRIVER_OPEN:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Can not open controller.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DRIVER_LOCK:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Controller is locked.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DRIVER_CLOSED:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Controller is not opened.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DRIVER_ACROSS:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Operation across multiple controllers.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_LEVEL:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Operation not support with volume of this level.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_SIZE:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Capacity of array out of range.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_STRIPE_SIZE:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Illegal stripe size.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_CACHE_POLICY:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Illegal cache-write policy.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_IN_USE:
474adcbbaccaea8fdfe9f051bdc1eea0b8add507yw ret_val = dgettext(TEXT_DOMAIN, "Array or disk in use.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_TASK:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Array has background task.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_CONFIG:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Configuration over device node failed.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_DISKNUM:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Incorrect number of disks.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_LAYOUT:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Illegal array layout.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_ARRAY_AMOUNT:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Too many arrays.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DISK_STATE:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Incorrect disk status for current operation.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DISK_SPACE:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "No enough disk space.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DISK_SEG_AMOUNT:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Too many disk segments.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DISK_NOT_EMPTY:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Disk has occupied space.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DISK_TASK:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Disk has background task.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_TASK_STATE:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Incorrect task state for current operation.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_OP_ILLEGAL:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Illegal operation.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_OP_NO_IMPL:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Operation is not implemented.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_OP_FAILED:
474adcbbaccaea8fdfe9f051bdc1eea0b8add507yw ret_val = dgettext(TEXT_DOMAIN, "Operation failed.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DEVICE_NOENT:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Device not found.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DEVICE_TYPE:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Illegal type of device.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DEVICE_DUP:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Device record duplicated.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DEVICE_OVERFLOW:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Too many devices.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DEVICE_UNCLEAN:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Device pool is not clean.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_DEVICE_INVALID:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Device record is invalid.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_NOMEM:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw "Can not allocate more memory space.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ERR_PRIV:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "No privilege.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = dgettext(TEXT_DOMAIN, "Undefined error.\n");
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret_val);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_get_controller(uint32_t controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret_val;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_controller(&raid_tab_sys, controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id == OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = raid_obj_to_handle(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret_val);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_get_array(int controller_handle, uint64_t target_id, uint64_t lun)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raidcfg_array_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret_val;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, controller_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(&raid_tab_sys, obj_id, OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while (obj_id > OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(&raid_tab_sys, obj_id, (void **)(&attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->tag.idl.target_id == target_id &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->tag.idl.lun == lun)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_sibling(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id == OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = raid_obj_to_handle(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret_val);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_get_disk(int controller_handle, disk_tag_t tag)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raidcfg_disk_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret_val;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, controller_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(&raid_tab_sys, obj_id, OBJ_TYPE_DISK);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while (obj_id > OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(&raid_tab_sys, obj_id, (void **)(&attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->tag.cidl.bus == tag.cidl.bus &&
711890bc9379ceea66272dc8d4981812224ea86ejc attr->tag.cidl.target_id == tag.cidl.target_id &&
711890bc9379ceea66272dc8d4981812224ea86ejc attr->tag.cidl.lun == tag.cidl.lun)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_sibling(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id == OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = raid_obj_to_handle(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret_val);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_open_controller(int handle, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_controller_act(&raid_tab_sys, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw ACT_CONTROLLER_OPEN, NULL, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_close_controller(int handle, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_controller_act(&raid_tab_sys, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw ACT_CONTROLLER_CLOSE, NULL, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_get_type(int handle)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret_val;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = raid_obj_get_type(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret_val);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_get_attr(int handle, void *attr)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t type;
711890bc9379ceea66272dc8d4981812224ea86ejc void *data;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret, size;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc type = raid_obj_get_type(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(&raid_tab_sys, obj_id, &data);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (type) {
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_CONTROLLER:
711890bc9379ceea66272dc8d4981812224ea86ejc size = sizeof (controller_attr_t);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY:
711890bc9379ceea66272dc8d4981812224ea86ejc size = sizeof (array_attr_t);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_HSP:
711890bc9379ceea66272dc8d4981812224ea86ejc {
711890bc9379ceea66272dc8d4981812224ea86ejc raidcfg_hsp_t *dst = attr;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr_t *src = data;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctlr_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc dst->associated_id = src->associated_id;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->type = src->type;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(&raid_tab_sys, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&ctlr_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (src->type == HSP_TYPE_LOCAL) {
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_array(&raid_tab_sys,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw ctlr_attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw src->associated_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(&raid_tab_sys, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&array_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc dst->tag.idl.target_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw array_attr->tag.idl.target_id;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->tag.idl.lun = array_attr->tag.idl.lun;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK:
711890bc9379ceea66272dc8d4981812224ea86ejc size = sizeof (disk_attr_t);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY_PART:
711890bc9379ceea66272dc8d4981812224ea86ejc {
711890bc9379ceea66272dc8d4981812224ea86ejc raidcfg_arraypart_t *dst = attr;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr_t *src = data;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctlr_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *disk_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc dst->disk_id = src->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->offset = src->offset;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->size = src->size;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->state = src->state;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(&raid_tab_sys, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&ctlr_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_disk(&raid_tab_sys,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw ctlr_attr->controller_id, src->disk_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc dst->tag.cidl.bus = (uint64_t)OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->tag.cidl.target_id =
711890bc9379ceea66272dc8d4981812224ea86ejc (uint64_t)OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->tag.cidl.lun = (uint64_t)OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(&raid_tab_sys, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&disk_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc dst->tag.cidl.bus = disk_attr->tag.cidl.bus;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->tag.cidl.target_id = disk_attr->tag.cidl.target_id;
711890bc9379ceea66272dc8d4981812224ea86ejc dst->tag.cidl.lun = disk_attr->tag.cidl.lun;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK_SEG:
711890bc9379ceea66272dc8d4981812224ea86ejc size = sizeof (diskseg_attr_t);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_TASK:
711890bc9379ceea66272dc8d4981812224ea86ejc size = sizeof (task_attr_t);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw case OBJ_TYPE_PROP:
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw {
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw property_attr_t *src = data, *dst = attr;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw dst->prop_id = src->prop_id;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw dst->prop_type = src->prop_type;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (dst->prop_size == 0) {
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw dst->prop_size = src->prop_size;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) mutex_unlock(&raidcfg_mp);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (SUCCESS);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw }
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (dst->prop_size < src->prop_size)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw size = dst->prop_size;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw else
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw size = src->prop_size;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) memcpy(dst->prop, src->prop, size);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) mutex_unlock(&raidcfg_mp);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (SUCCESS);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw }
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) memcpy(attr, data, size);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_get_container(int handle)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret_val;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_obj_get_container(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = raid_obj_to_handle(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret_val);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_list_head(int handle, raid_obj_type_id_t type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret_val;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(&raid_tab_sys, obj_id, type);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = raid_obj_to_handle(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret_val);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_list_next(int handle)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret_val;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_sibling(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret_val = raid_obj_to_handle(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret_val);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_set_attr(int handle, uint32_t set_cmd, void *value,
711890bc9379ceea66272dc8d4981812224ea86ejc char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t type;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc type = raid_obj_get_type(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_op_sys[type].set_attr == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_NO_IMPL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[type].set_attr(&raid_tab_sys,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw obj_id, set_cmd, value, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_update_fw(int handle, char *file, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_handle_to_obj(&raid_tab_sys, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(handle);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(&raid_tab_sys, obj_id) != OBJ_TYPE_CONTROLLER) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_NO_IMPL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_CONTROLLER].act(&raid_tab_sys,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw obj_id, ACT_CONTROLLER_FLASH_FW, file, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_create_array(int num_of_comps, int *disk_handles,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t raid_level, uint64_t size, uint32_t stripe_size,
711890bc9379ceea66272dc8d4981812224ea86ejc char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *disk_obj_ids, obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t array_handle;
711890bc9379ceea66272dc8d4981812224ea86ejc int i, ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc disk_obj_ids = calloc(num_of_comps, sizeof (raid_obj_id_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_obj_ids == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* convert disk handles into disk object ids; */
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num_of_comps; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (*(disk_handles + i) == OBJ_SEPARATOR_BEGIN ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw *(disk_handles + i) == OBJ_SEPARATOR_END) {
711890bc9379ceea66272dc8d4981812224ea86ejc *(disk_obj_ids + i) = *(disk_handles + i);
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc *(disk_obj_ids + i) = raid_handle_to_obj(&raid_tab_sys,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw *(disk_handles + i));
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(&raid_tab_sys, *(disk_obj_ids + i)) !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_DISK) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(disk_obj_ids);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Create an empty array object */
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_obj_create(&raid_tab_sys, OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(disk_obj_ids);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_clear_status(&raid_tab_sys, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_STATUS_CMD_CLEAN);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = raid_obj_get_data_ptr(&raid_tab_sys, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->array_id = (uint32_t)OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->raid_level = raid_level;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->capacity = size;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->stripe_size = stripe_size;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->write_policy = CACHE_WR_ON;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->read_policy = CACHE_RD_ON;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_ARRAY].create_obj(&raid_tab_sys, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw num_of_comps, disk_obj_ids, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc free(disk_obj_ids);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
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);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (array_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_delete_array(int array_handle, char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t array_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raidcfg_get_type(array_handle) != OBJ_TYPE_ARRAY) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc array_obj_id = raid_handle_to_obj(&raid_tab_sys, array_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (array_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_obj_id == OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_ARRAY].delete_obj(&raid_tab_sys,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw array_obj_id, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wangraidcfg_set_hsp(raidcfg_hsp_relation_t *hsp_relations,
711890bc9379ceea66272dc8d4981812224ea86ejc char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t disk_obj_id, array_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *hsp_relation_objs;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (hsp_relations == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation_objs = malloc(2 * sizeof (raid_obj_id_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (hsp_relation_objs == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (hsp_relations->array_handle != OBJ_ATTR_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_obj_id = raid_handle_to_obj(&raid_tab_sys,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relations->array_handle);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation_objs);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (array_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_obj_id == OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void) free(hsp_relation_objs);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (raidcfg_get_type(hsp_relations->array_handle) !=
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_ARRAY) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation_objs);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang } else
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_obj_id = OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_obj_id = raid_handle_to_obj(&raid_tab_sys,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relations->disk_handle);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (disk_obj_id < OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation_objs);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void) mutex_unlock(&raidcfg_mp);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (disk_obj_id);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (disk_obj_id == OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation_objs);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void) mutex_unlock(&raidcfg_mp);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DEVICE_NOENT);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (raidcfg_get_type(hsp_relations->disk_handle) !=
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_DISK) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation_objs);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void) mutex_unlock(&raidcfg_mp);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation_objs[0] = array_obj_id;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation_objs[1] = disk_obj_id;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = raid_obj_op_sys[OBJ_TYPE_HSP].bind_obj(&raid_tab_sys,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw hsp_relation_objs, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation_objs);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcint
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wangraidcfg_unset_hsp(raidcfg_hsp_relation_t *hsp_relations,
711890bc9379ceea66272dc8d4981812224ea86ejc char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t disk_obj_id, array_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *hsp_relation_objs;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_lock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (hsp_relations == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation_objs = malloc(2 * sizeof (raid_obj_id_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (hsp_relation_objs == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (hsp_relations->array_handle != OBJ_ATTR_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_obj_id = raid_handle_to_obj(&raid_tab_sys,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relations->array_handle);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation_objs);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (array_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_obj_id == OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation_objs);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (raidcfg_get_type(hsp_relations->array_handle) !=
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_ARRAY) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation_objs);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang } else
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_obj_id = OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_obj_id = raid_handle_to_obj(&raid_tab_sys,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relations->disk_handle);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (disk_obj_id < OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation_objs);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void) mutex_unlock(&raidcfg_mp);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (disk_obj_id);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (disk_obj_id == OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation_objs);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void) mutex_unlock(&raidcfg_mp);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DEVICE_NOENT);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (raidcfg_get_type(hsp_relations->disk_handle) !=
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_DISK) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation_objs);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void) mutex_unlock(&raidcfg_mp);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation_objs[0] = array_obj_id;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation_objs[1] = disk_obj_id;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[OBJ_TYPE_HSP].unbind_obj(&raid_tab_sys,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation_objs, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation_objs);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_unlock(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * RaidCfg lib routines
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcvoid
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_init(void)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_init(&raidcfg_mp, NULL, NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_plugin_init();
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_handle_init();
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcvoid
711890bc9379ceea66272dc8d4981812224ea86ejcraidcfg_fini(void)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc /*
711890bc9379ceea66272dc8d4981812224ea86ejc * Need to close all opened controllers before destroying object table
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_rescan(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_fini();
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_tab_destroy(&raid_tab_sys);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_plugin_init();
711890bc9379ceea66272dc8d4981812224ea86ejc (void) mutex_destroy(&raidcfg_mp);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Support routines
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcintcompare(const void *p1, const void *p2)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc int i, j;
711890bc9379ceea66272dc8d4981812224ea86ejc i = *((int *)p1);
711890bc9379ceea66272dc8d4981812224ea86ejc j = *((int *)p2);
711890bc9379ceea66272dc8d4981812224ea86ejc return (i - j);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic uint64_t
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{
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *disk_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr_t *diskseg_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc uint64_t offset, capacity;
711890bc9379ceea66272dc8d4981812224ea86ejc int i, disk_num, sub_array_num, disk_layer;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Find out the maximum available space for all disks */
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc if ((disk_objs[i] == OBJ_SEPARATOR_BEGIN) ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (disk_objs[i] == OBJ_SEPARATOR_END))
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(raid_tab, disk_objs[i],
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&disk_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, disk_objs[i],
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_DISK_SEG);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id == OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].offset = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].size = disk_attr->capacity;
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(raid_tab, obj_id, (void **)
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (&diskseg_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].offset = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].size = diskseg_attr->offset;
711890bc9379ceea66272dc8d4981812224ea86ejc offset = diskseg_attr->offset + diskseg_attr->size;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while ((obj_id = obj_get_sibling(raid_tab, obj_id)) !=
711890bc9379ceea66272dc8d4981812224ea86ejc OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(raid_tab, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&diskseg_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if ((diskseg_attr->offset - offset) >
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw arraypart_attrs[i].size) {
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].offset = offset;
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw arraypart_attrs[i].size = diskseg_attr->offset -
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw offset;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc offset = diskseg_attr->offset + diskseg_attr->size;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((disk_attr->capacity - offset) > arraypart_attrs[i].size) {
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].offset = offset;
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw arraypart_attrs[i].size = disk_attr->capacity -
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw offset;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc capacity = OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_num = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_layer = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc sub_array_num = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_objs[i] == OBJ_SEPARATOR_BEGIN) {
711890bc9379ceea66272dc8d4981812224ea86ejc ++ disk_layer;
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_objs[i] == OBJ_SEPARATOR_END) {
711890bc9379ceea66272dc8d4981812224ea86ejc -- disk_layer;
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_layer != 0)
711890bc9379ceea66272dc8d4981812224ea86ejc ++ sub_array_num;
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (capacity > arraypart_attrs[i].size)
711890bc9379ceea66272dc8d4981812224ea86ejc capacity = arraypart_attrs[i].size;
711890bc9379ceea66272dc8d4981812224ea86ejc ++disk_num;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (raid_level) {
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_0:
711890bc9379ceea66272dc8d4981812224ea86ejc capacity = capacity * disk_num;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_1:
711890bc9379ceea66272dc8d4981812224ea86ejc capacity = capacity * disk_num / 2;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_1E:
711890bc9379ceea66272dc8d4981812224ea86ejc capacity = capacity * disk_num / 2;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_5:
711890bc9379ceea66272dc8d4981812224ea86ejc capacity = capacity * (disk_num - 1);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_10:
711890bc9379ceea66272dc8d4981812224ea86ejc capacity = capacity * disk_num / 2;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_50:
711890bc9379ceea66272dc8d4981812224ea86ejc capacity = capacity * (disk_num - sub_array_num);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (capacity);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Raid handle maintenance routines
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_handle_init()
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc int i;
711890bc9379ceea66272dc8d4981812224ea86ejc void *ptr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handle_num += HANDLER_SLOTS;
711890bc9379ceea66272dc8d4981812224ea86ejc ptr = realloc(raid_handle_sys.handles,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.handle_num * sizeof (handle_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ptr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles = ptr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Clean up the new allocated handles */
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = raid_handle_sys.handle_num - HANDLER_SLOTS;
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw i < raid_handle_sys.handle_num; ++i) {
ee992693a278a8fe9135d083f8f8370fdc891465Zach Kissel bzero(&raid_handle_sys.handles[i], sizeof (handle_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[i].type = OBJ_TYPE_ALL;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[i].next = i + 1;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* For the first time of allocation, set up the system object handle */
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_handle_sys.handle_num == HANDLER_SLOTS) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[0].type = OBJ_TYPE_SYSTEM;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[0].next = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.unused = 1;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.used = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_handle_fini()
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t i;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc i = raid_handle_sys.used;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Close all opened controllers */
711890bc9379ceea66272dc8d4981812224ea86ejc while (i != 0) {
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_handle_sys.handles[i].type == OBJ_TYPE_CONTROLLER) &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (raid_handle_sys.handles[i].fd != 0) &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (raid_handle_sys.handles[i].raid_lib != NULL))
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[i].raid_lib->close_controller(
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.handles[i].controller_id, NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc i = raid_handle_sys.handles[i].next;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Clean up handle space */
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handle_num = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.unused = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.used = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc free(raid_handle_sys.handles);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_handle_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_handle_new(raid_obj_type_id_t type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_handle_sys.unused == raid_handle_sys.handle_num - 1) {
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_handle_init();
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_handle_sys.unused;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.unused = raid_handle_sys.handles[ret].next;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[ret].next = raid_handle_sys.used;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.used = ret;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[ret].type = type;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_handle_delete(raid_obj_handle_t handle)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc int i = raid_handle_sys.used, j = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (handle == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while (i != 0 && i != handle) {
711890bc9379ceea66272dc8d4981812224ea86ejc j = i;
711890bc9379ceea66272dc8d4981812224ea86ejc i = raid_handle_sys.handles[i].next;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (i == handle) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (j != 0)
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[j].next =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.handles[i].next;
711890bc9379ceea66272dc8d4981812224ea86ejc else
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.used =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.handles[i].next;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[i].type = OBJ_TYPE_ALL;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[i].next =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.unused;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.unused = i;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_handle_delete_controller_comp(uint32_t controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc int i = raid_handle_sys.used, j;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while (i != 0) {
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw j = i;
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw i = raid_handle_sys.handles[i].next;
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw if ((raid_handle_sys.handles[j].controller_id ==
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_id) &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (raid_handle_sys.handles[j].type !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_CONTROLLER))
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete(j);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_handle_to_obj(raid_obj_tab_t *raid_tab, raid_obj_handle_t handle)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc handle_attr_t *handle_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (handle == OBJ_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (OBJ_SYSTEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc handle_attr = raid_handle_sys.handles + handle;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (handle_attr->type) {
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_SYSTEM:
711890bc9379ceea66272dc8d4981812224ea86ejc return (OBJ_SYSTEM);
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_CONTROLLER:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_controller(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_array(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->controller_id, handle_attr->array_id);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_HSP:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_hsp(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->controller_id, handle_attr->disk_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->array_id);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_disk(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->controller_id, handle_attr->disk_id);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY_PART:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_arraypart(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->controller_id, handle_attr->array_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->disk_id);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK_SEG:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_diskseg(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->disk_id, handle_attr->seq_id);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_TASK:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_task(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle_attr->controller_id, handle_attr->task_id);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw case OBJ_TYPE_PROP:
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw obj_id = obj_locate_prop(raid_tab,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw handle_attr->controller_id, handle_attr->disk_id,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw handle_attr->prop_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id == OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_handle(raid_tab, obj_id, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_handle_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_to_handle(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id_backup = obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t type;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t handle;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *controller_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr_t *hsp_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *disk_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr_t *arraypart_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr_t *diskseg_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr_t *task_attr;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw property_attr_t *prop_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id == OBJ_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (OBJ_SYSTEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* If the object mapped by a handle */
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_obj_get_handle(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (handle != 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (handle);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Search for existing handles */
711890bc9379ceea66272dc8d4981812224ea86ejc for (handle = raid_handle_sys.used; handle != 0;
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw handle = raid_handle_sys.handles[handle].next)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_handle_to_obj(raid_tab, handle) == obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (handle != 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (handle);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Allocate new handle for this object */
711890bc9379ceea66272dc8d4981812224ea86ejc type = raid_obj_get_type(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_new(type);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_handle(raid_tab, obj_id, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].type = type;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (type) {
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_SYSTEM:
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_CONTROLLER:
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].controller_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_attr->controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY:
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].array_id = array_attr->array_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].controller_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_attr->controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_HSP:
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].array_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw hsp_attr->associated_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_obj_get_container(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].disk_id = disk_attr->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].controller_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_attr->controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK:
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].disk_id = disk_attr->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].controller_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_attr->controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY_PART:
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].disk_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw arraypart_attr->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_obj_get_container(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].array_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw array_attr->array_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].controller_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_attr->controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK_SEG:
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].seq_id = diskseg_attr->seq_no;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = raid_obj_get_container(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].disk_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw disk_attr->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].controller_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_attr->controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_TASK:
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].task_id = task_attr->task_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].controller_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_attr->controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc break;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw case OBJ_TYPE_PROP:
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw prop_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_handle_sys.handles[handle].prop_id =
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw prop_attr->prop_id;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw obj_id = raid_obj_get_container(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw disk_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_handle_sys.handles[handle].disk_id = disk_attr->disk_id;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw obj_id = obj_get_controller(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw controller_attr = raid_obj_get_data_ptr(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_handle_sys.handles[handle].controller_id =
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw controller_attr->controller_id;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_handle(raid_tab, obj_id_backup, handle);
711890bc9379ceea66272dc8d4981812224ea86ejc return (handle);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_lib_t *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_lib(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t handle;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_sys.used;
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_handle_sys.handles[handle].type != OBJ_TYPE_CONTROLLER ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.handles[handle].controller_id !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_sys.handles[handle].next;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (handle == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (raid_handle_sys.handles[handle].raid_lib);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_lib(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t handle;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_sys.used;
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_handle_sys.handles[handle].type != OBJ_TYPE_CONTROLLER ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.handles[handle].controller_id !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_sys.handles[handle].next;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (handle == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].raid_lib = raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_fd(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t handle;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_sys.used;
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_handle_sys.handles[handle].type != OBJ_TYPE_CONTROLLER ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.handles[handle].controller_id !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_sys.handles[handle].next;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (handle == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (raid_handle_sys.handles[handle].fd);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_fd(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id, int fd)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t handle;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_sys.used;
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_handle_sys.handles[handle].type != OBJ_TYPE_CONTROLLER ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_handle_sys.handles[handle].controller_id !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_handle_sys.handles[handle].next;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (handle == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_sys.handles[handle].fd = fd;
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Raid object maintenance routines
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_scan_comp(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_status_t status;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t type;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret, i, obj_type_cnt, comp_num;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t *comp_list;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc status = raid_obj_get_status(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (status < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (status);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (status & OBJ_STATUS_SCANCOMP)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc type = raid_obj_get_type(raid_tab, obj_id);
edabaf6ffacd63543916397cd0987024b1f1e1deMilan Jurik /* type less than OBJ_TYPE_SYSTEM means error */
edabaf6ffacd63543916397cd0987024b1f1e1deMilan Jurik if (type < OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (obj_type_cnt = OBJ_SYSTEM; obj_type_cnt < OBJ_TYPE_ALL;
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw ++obj_type_cnt) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_op_sys[type].compnum != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc comp_num = raid_obj_op_sys[type].compnum(
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw raid_tab, obj_id, obj_type_cnt);
711890bc9379ceea66272dc8d4981812224ea86ejc else
711890bc9379ceea66272dc8d4981812224ea86ejc comp_num = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_num < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (comp_num);
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_num == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc comp_list = calloc(comp_num, sizeof (raid_obj_id_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_list == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc *(comp_list + i) = raid_obj_create(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw obj_type_cnt);
711890bc9379ceea66272dc8d4981812224ea86ejc if (*(comp_list + i) < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc ret = *(comp_list + i);
711890bc9379ceea66272dc8d4981812224ea86ejc free(comp_list);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_clear_status(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw *(comp_list + i), OBJ_STATUS_CMD_CLEAN);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_add_org(raid_tab, *(comp_list + i),
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_op_sys[type].complist != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_op_sys[type].complist(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw obj_id, comp_num, comp_list, obj_type_cnt);
711890bc9379ceea66272dc8d4981812224ea86ejc free(comp_list);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_SCANCOMP);
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_rescan(raid_obj_tab_t *raid_tab)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_tab_destroy(raid_tab);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_tab_create(raid_tab, HASH_SLOTS) != SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((ret = raid_obj_create_system_obj(raid_tab)) != SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_tab_destroy(raid_tab);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_get_comp(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t obj_type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t type;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_status_t status;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((obj_type < OBJ_TYPE_SYSTEM) || (obj_type > OBJ_TYPE_ALL))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc status = raid_obj_get_status(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (status < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (status);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (!(status & OBJ_STATUS_SCANCOMP)) {
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_scan_comp(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc id = raid_obj_get_comp(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc type = raid_obj_get_type(raid_tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (type < OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (type);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (type == obj_type)
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while (id > OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc id = raid_obj_get_sibling(raid_tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc type = raid_obj_get_type(raid_tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (type < OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (type);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (type == obj_type)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc };
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_get_sibling(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t type, obj_type;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc id = obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_type = raid_obj_get_type(raid_tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_type < OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_type);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc id = raid_obj_get_sibling(raid_tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc type = raid_obj_get_type(raid_tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (type < OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (type);
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((type != obj_type) && (id != OBJ_NONE));
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id, void **data)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t type;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_status_t status;
711890bc9379ceea66272dc8d4981812224ea86ejc void *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc status = raid_obj_get_status(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (status < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (status);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc type = raid_obj_get_type(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (type < OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (type);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (!(status & OBJ_STATUS_OPENED)) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_op_sys[type].get_attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejc else
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_op_sys[type].get_attr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL && type != OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc *data = attr;
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_controller(raid_obj_tab_t *raid_tab, uint32_t controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, OBJ_SYSTEM, OBJ_TYPE_CONTROLLER);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->controller_id == controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) != OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_array(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t array_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_controller(raid_tab, controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_array_recur(raid_tab, obj_id, array_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_array_recur(raid_obj_tab_t *raid_tab,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t container_obj_id, uint32_t array_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id, ret;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, container_obj_id, OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->array_id == array_id)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_locate_array_recur(raid_tab, obj_id, array_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret != OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_hsp(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t disk_id, uint32_t array_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr_t *hsp_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_disk(raid_tab, controller_id, disk_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_HSP);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(raid_tab, obj_id, (void **)(&hsp_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (hsp_attr->associated_id == array_id)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_sibling(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc } while (obj_id > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_disk(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t disk_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_controller(raid_tab, controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_DISK);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->disk_id == disk_id)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_arraypart(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t array_id, uint32_t disk_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_array(raid_tab, controller_id, array_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_ARRAY_PART);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->disk_id == disk_id)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) >
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_diskseg(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t disk_id, uint32_t seq_no)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_disk(raid_tab, controller_id, disk_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_DISK_SEG);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->seq_no == seq_no)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_locate_task(raid_obj_tab_t *raid_tab, uint32_t controller_id,
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t task_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id, obj_id2, task_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_controller(raid_tab, controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id2 = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc while (obj_id2 != OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc task_obj_id = obj_get_comp(raid_tab, obj_id2,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_TASK);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (task_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (task_obj_id == OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id2 = obj_get_sibling(raid_tab, obj_id2);
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->task_id == task_id)
711890bc9379ceea66272dc8d4981812224ea86ejc return (task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id2 = obj_get_sibling(raid_tab, obj_id2);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc task_obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_TASK);
711890bc9379ceea66272dc8d4981812224ea86ejc if (task_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (task_obj_id == OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->task_id == task_id)
711890bc9379ceea66272dc8d4981812224ea86ejc return (task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_locate_controller(raid_tab, controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_DISK);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc do {
711890bc9379ceea66272dc8d4981812224ea86ejc task_obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_TASK);
711890bc9379ceea66272dc8d4981812224ea86ejc if (task_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (task_obj_id == OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->task_id == task_id)
711890bc9379ceea66272dc8d4981812224ea86ejc return (task_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc } while ((obj_id = obj_get_sibling(raid_tab, obj_id)) > OBJ_NONE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw}
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcywstatic raid_obj_id_t
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcywobj_locate_prop(raid_obj_tab_t *raid_tab, uint32_t controller_id,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw uint32_t disk_id, uint32_t prop_id)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw{
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_obj_id_t obj_id;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw property_attr_t *prop_attr;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw obj_id = obj_locate_disk(raid_tab, controller_id, disk_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (obj_id < OBJ_NONE)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw obj_id = obj_get_comp(raid_tab, obj_id, OBJ_TYPE_PROP);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (obj_id <= OBJ_NONE)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw do {
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) obj_get_attr(raid_tab, obj_id, (void **)(&prop_attr));
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (prop_attr->prop_id == prop_id)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw break;
711890bc9379ceea66272dc8d4981812224ea86ejc
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw obj_id = obj_get_sibling(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (obj_id < OBJ_NONE)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw } while (obj_id > OBJ_NONE);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcobj_get_controller(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t id = obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_obj_get_type(raid_tab, id) != OBJ_TYPE_CONTROLLER) {
711890bc9379ceea66272dc8d4981812224ea86ejc id = raid_obj_get_container(raid_tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((id == OBJ_SYSTEM) || (id < OBJ_NONE))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Raid object operation routines
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_sys_compnum(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc DIR *dir;
711890bc9379ceea66272dc8d4981812224ea86ejc struct dirent *dp;
711890bc9379ceea66272dc8d4981812224ea86ejc int num = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_SYSTEM))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_type != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((dir = opendir(CFGDIR)) == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_NOT_FOUND);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while ((dp = readdir(dir)) != NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc char path[MAX_PATH_LEN];
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (strcmp(dp->d_name, ".") == 0 ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw strcmp(dp->d_name, "..") == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (sscanf(dp->d_name, "c%u", &controller_id) != 1)
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_id_to_path(controller_id, path) == SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc ++ num;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) closedir(dir);
711890bc9379ceea66272dc8d4981812224ea86ejc return (num);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
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{
711890bc9379ceea66272dc8d4981812224ea86ejc DIR *dir;
711890bc9379ceea66272dc8d4981812224ea86ejc struct dirent *dp;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t *tmplist;
711890bc9379ceea66272dc8d4981812224ea86ejc char path[MAX_PATH_LEN];
711890bc9379ceea66272dc8d4981812224ea86ejc int i = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_SYSTEM)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((num <= 0) || (comp_list == NULL))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_type != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((dir = opendir(CFGDIR)) == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_NOT_FOUND);
711890bc9379ceea66272dc8d4981812224ea86ejc tmplist = calloc(num, sizeof (uint32_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (tmplist == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc while ((dp = readdir(dir)) != NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (strcmp(dp->d_name, ".") == 0 ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw strcmp(dp->d_name, "..") == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (sscanf(dp->d_name, "c%u", &controller_id) != 1)
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_id_to_path(controller_id, path) == SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc tmplist[i] = controller_id;
711890bc9379ceea66272dc8d4981812224ea86ejc ++ i;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc qsort((void *)tmplist, num, sizeof (uint32_t), intcompare);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num; i++) {
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw *(comp_list + i));
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(tmplist);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr->controller_id = tmplist[i];
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc free(tmplist);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) closedir(dir);
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_controller_compnum(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((comp_type != OBJ_TYPE_ARRAY) && (comp_type != OBJ_TYPE_DISK))
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (ctl_attrp == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->compnum(ctl_attrp->controller_id, 0,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_CONTROLLER, comp_type);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
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{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret, i, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t *ids;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((comp_type != OBJ_TYPE_ARRAY) && (comp_type != OBJ_TYPE_DISK))
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((comp_num <= 0) || (comp_list == NULL))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++i)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, *(comp_list + i)) !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (ctl_attrp == NULL)|| (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ids = malloc(comp_num * sizeof (uint32_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ids == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->complist(ctl_attrp->controller_id, 0,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_CONTROLLER, comp_type, comp_num, ids);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc qsort((void *)ids, comp_num, sizeof (uint32_t), intcompare);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++ i) {
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *disk_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc void *attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr_buf = raid_obj_get_data_ptr(raid_tab, *(comp_list + i));
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr_buf == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (comp_type) {
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY:
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->array_id = *(ids + i);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK:
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr = attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr->disk_id = *(ids + i);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_controller_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /*
711890bc9379ceea66272dc8d4981812224ea86ejc * For a controller, even it's not opened, we can still
711890bc9379ceea66272dc8d4981812224ea86ejc * get the driver name
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (fd == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->get_attr(attr->controller_id, OBJ_ATTR_NONE,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_ATTR_NONE, OBJ_TYPE_CONTROLLER, attr);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
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{
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_CONTROLLER)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (sub_cmd) {
711890bc9379ceea66272dc8d4981812224ea86ejc case ACT_CONTROLLER_OPEN:
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if already opened */
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (fd > 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if plugin is already attached */
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_find_lib(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_NOT_FOUND);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->open_controller(attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret == SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_lib(raid_tab, obj_id, raid_lib);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_fd(raid_tab, obj_id, 1);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ACT_CONTROLLER_CLOSE:
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (fd <= 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->close_controller(attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret == SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_fd(raid_tab, obj_id, 0);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_lib(raid_tab, obj_id, NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_handle_delete_controller_comp(attr->controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case ACT_CONTROLLER_FLASH_FW:
711890bc9379ceea66272dc8d4981812224ea86ejc {
711890bc9379ceea66272dc8d4981812224ea86ejc char *filebuf;
711890bc9379ceea66272dc8d4981812224ea86ejc int image_fd;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t size;
711890bc9379ceea66272dc8d4981812224ea86ejc struct stat statbuf;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (prop_list == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Open firmware image file */
711890bc9379ceea66272dc8d4981812224ea86ejc image_fd = open((const char *)prop_list,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw O_RDONLY | O_NDELAY);
711890bc9379ceea66272dc8d4981812224ea86ejc if (image_fd == -1)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_FAILED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (fstat(image_fd, &statbuf) != 0) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) close(image_fd);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_FAILED);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc filebuf = malloc(statbuf.st_size);
711890bc9379ceea66272dc8d4981812224ea86ejc if (filebuf == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) close(image_fd);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc size = read(image_fd, filebuf, statbuf.st_size);
711890bc9379ceea66272dc8d4981812224ea86ejc if (size != statbuf.st_size) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) close(image_fd);
711890bc9379ceea66272dc8d4981812224ea86ejc free(filebuf);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_FAILED);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (fd <= 0) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) close(image_fd);
711890bc9379ceea66272dc8d4981812224ea86ejc free(filebuf);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) close(image_fd);
711890bc9379ceea66272dc8d4981812224ea86ejc free(filebuf);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib->flash_fw == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) close(image_fd);
711890bc9379ceea66272dc8d4981812224ea86ejc free(filebuf);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_NO_IMPL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->flash_fw(attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw filebuf, size, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_compnum(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_type != OBJ_TYPE_ARRAY_PART &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type != OBJ_TYPE_ARRAY &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type != OBJ_TYPE_TASK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->compnum(ctl_attrp->controller_id, attr->array_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_ARRAY, comp_type);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
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{
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret, i, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t *ids;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_type != OBJ_TYPE_ARRAY_PART &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type != OBJ_TYPE_ARRAY &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type != OBJ_TYPE_TASK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_num <= 0 || comp_list == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++i)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, *(comp_list + i)) !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ids = malloc(comp_num * sizeof (uint32_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ids == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->complist(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->array_id, OBJ_TYPE_ARRAY, comp_type, comp_num, ids);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++ i) {
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr_t *arraypart_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr_t *task_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc void *attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr_buf = raid_obj_get_data_ptr(raid_tab, *(comp_list + i));
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr_buf == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (comp_type) {
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY:
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->array_id = *(ids + i);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY_PART:
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr = attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr->disk_id = *(ids + i);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_TASK:
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr = attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr->task_id = *(ids + i);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->get_attr(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->array_id, 0, OBJ_TYPE_ARRAY, attr);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
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{
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (sub_cmd) {
711890bc9379ceea66272dc8d4981812224ea86ejc case SET_CACHE_WR_PLY:
711890bc9379ceea66272dc8d4981812224ea86ejc if (*value != CACHE_WR_OFF &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw *value != CACHE_WR_ON)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case SET_CACHE_RD_PLY:
711890bc9379ceea66272dc8d4981812224ea86ejc if (*value != CACHE_RD_OFF &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw *value != CACHE_RD_ON)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw case SET_ACTIVATION_PLY:
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (*value != ARRAY_ACT_ACTIVATE)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_OP_ILLEGAL);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(raid_tab, obj_id, (void **)(&attr));
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib->set_attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_NO_IMPL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->set_attr(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->array_id, sub_cmd, value, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_disk_compnum(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_DISK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_type != OBJ_TYPE_DISK_SEG &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type != OBJ_TYPE_HSP &&
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw comp_type != OBJ_TYPE_TASK &&
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw comp_type != OBJ_TYPE_PROP)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(raid_tab, obj_id, (void **)(&attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if ((ret != SUCCESS) || (attr == NULL)) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->state == DISK_STATE_FAILED) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->compnum(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->disk_id, OBJ_TYPE_DISK, comp_type);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
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{
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret, i, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t *ids;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_DISK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_type != OBJ_TYPE_DISK_SEG &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type != OBJ_TYPE_HSP &&
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw comp_type != OBJ_TYPE_TASK &&
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw comp_type != OBJ_TYPE_PROP)
711890bc9379ceea66272dc8d4981812224ea86ejc return (0);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (comp_num <= 0 || comp_list == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++i)
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, *(comp_list + i)) !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw comp_type)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(raid_tab, obj_id, (void **)(&attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if ((ret != SUCCESS) || (attr == NULL)) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->state == DISK_STATE_FAILED) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ids = malloc(comp_num * sizeof (uint32_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ids == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->complist(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->disk_id, OBJ_TYPE_DISK, comp_type, comp_num, ids);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < comp_num; ++ i) {
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr_t *diskseg_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr_t *hsp_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr_t *task_attr;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw property_attr_t *prop_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc void *attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr_buf = raid_obj_get_data_ptr(raid_tab, *(comp_list + i));
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr_buf == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (comp_type) {
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK_SEG:
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr = attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr->seq_no = *(ids + i);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_HSP:
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr = attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr->associated_id = *(ids + i);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_TASK:
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr = attr_buf;
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr->task_id = *(ids + i);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw case OBJ_TYPE_PROP:
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw prop_attr = attr_buf;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw prop_attr->prop_id = *(ids + i);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc free(ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_disk_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_DISK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->get_attr(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->disk_id, 0, OBJ_TYPE_DISK, attr);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_hsp_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_HSP)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr->associated_id == (uint32_t)OBJ_ATTR_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc attr->type = HSP_TYPE_GLOBAL;
711890bc9379ceea66272dc8d4981812224ea86ejc else
711890bc9379ceea66272dc8d4981812224ea86ejc attr->type = HSP_TYPE_LOCAL;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_arraypart_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id, array_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_ARRAY_PART)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc array_obj_id = raid_obj_get_container(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = raid_obj_get_data_ptr(raid_tab, array_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->get_attr(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw array_attr->array_id, attr->disk_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_ARRAY_PART, attr);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_diskseg_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *disk_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id, disk_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_DISK_SEG)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc disk_obj_id = raid_obj_get_container(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr = raid_obj_get_data_ptr(raid_tab, disk_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->get_attr(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw disk_attr->disk_id, attr->seq_no, OBJ_TYPE_DISK_SEG, attr);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_task_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc task_attr_t *attr;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *ctl_attrp;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret = SUCCESS, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_TASK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc attr = raid_obj_get_data_ptr(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ctl_attrp == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->get_attr(ctl_attrp->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw attr->task_id, OBJ_ATTR_NONE, OBJ_TYPE_TASK, attr);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcywstatic int
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcywobj_prop_get_attr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw{
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw property_attr_t *attr, *attr_new;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw disk_attr_t *disk_attr;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw controller_attr_t *ctl_attrp;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_lib_t *raid_lib;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw int ret = SUCCESS, fd;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_obj_id_t controller_obj_id, disk_obj_id;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (raid_obj_get_type(raid_tab, obj_id) != OBJ_TYPE_PROP)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_DEVICE_TYPE);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (raid_obj_get_status(raid_tab, obj_id) & OBJ_STATUS_OPENED)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (SUCCESS);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw attr = raid_obj_get_data_ptr(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (attr == NULL)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_DEVICE_INVALID);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw disk_obj_id = raid_obj_get_container(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (disk_obj_id < OBJ_NONE)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_DEVICE_INVALID);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw disk_attr = raid_obj_get_data_ptr(raid_tab, disk_obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (disk_attr == NULL)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_DEVICE_INVALID);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw controller_obj_id = obj_get_controller(raid_tab, obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (controller_obj_id < OBJ_NONE)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_DEVICE_INVALID);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw ctl_attrp = raid_obj_get_data_ptr(raid_tab, controller_obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (ctl_attrp == NULL) {
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_DEVICE_INVALID);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw }
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw fd = raid_obj_get_fd(raid_tab, controller_obj_id);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if ((raid_lib == NULL) || (fd == 0))
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_DRIVER_CLOSED);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw /* Get the property size at first */
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw attr->prop_size = 0;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw ret = raid_lib->get_attr(ctl_attrp->controller_id,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw disk_attr->disk_id, OBJ_ATTR_NONE, OBJ_TYPE_PROP, attr);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (ret < SUCCESS)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ret);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw /* Allocate memory for property and fill the buffer */
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw attr_new = realloc(attr, sizeof (property_attr_t) + attr->prop_size);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (attr_new == NULL)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ERR_NOMEM);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) raid_obj_set_data_ptr(raid_tab, obj_id, attr_new);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw ret = raid_lib->get_attr(ctl_attrp->controller_id,
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw disk_attr->disk_id, OBJ_ATTR_NONE, OBJ_TYPE_PROP, attr_new);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw if (ret < SUCCESS)
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ret);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw (void) raid_obj_set_status(raid_tab, obj_id, OBJ_STATUS_OPENED);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw return (ret);
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw}
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
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{
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *controller_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr, array_attr2;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *disk_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr_t *arraypart_attrs;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id, controller_obj_id = OBJ_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc int i, j, ret, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc int disk_cnt = 0, disk_set_num = 0, set_num = 0, layer_cnt = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc uint64_t min_disk_capacity = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr = raid_obj_get_data_ptr(raid_tab, array_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_attr == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check the disk layout expression */
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_list[0] != OBJ_SEPARATOR_BEGIN ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw disk_list[num_of_comp - 1] != OBJ_SEPARATOR_END)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num_of_comp; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_list[i] == OBJ_SEPARATOR_BEGIN) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_cnt != 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc ++layer_cnt;
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_list[i] == OBJ_SEPARATOR_END) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_set_num == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc disk_set_num = disk_cnt;
711890bc9379ceea66272dc8d4981812224ea86ejc else if (disk_set_num != disk_cnt && disk_cnt != 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc disk_cnt = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc ++set_num;
711890bc9379ceea66272dc8d4981812224ea86ejc --layer_cnt;
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc switch (array_attr->raid_level) {
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_0:
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_1:
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_1E:
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_5:
711890bc9379ceea66272dc8d4981812224ea86ejc if (layer_cnt != 1)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_10:
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_50:
711890bc9379ceea66272dc8d4981812224ea86ejc if (layer_cnt != 2)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ++disk_cnt;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (layer_cnt != 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (array_attr->raid_level) {
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_0:
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_set_num < 2 || set_num != 1)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_1:
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_set_num != 2 || set_num != 1)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_1E:
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_5:
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_set_num < 3 || set_num != 1)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_10:
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_set_num != 2 || set_num < 2)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_50:
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_set_num < 3 || set_num < 2)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LAYOUT);
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs = calloc(num_of_comp, sizeof (arraypart_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (arraypart_attrs == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num_of_comp; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc /* Keep seperators */
711890bc9379ceea66272dc8d4981812224ea86ejc if (*(disk_list + i) == OBJ_SEPARATOR_BEGIN) {
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].disk_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (uint32_t)OBJ_SEPARATOR_BEGIN;
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (*(disk_list + i) == OBJ_SEPARATOR_END) {
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].disk_id =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (uint32_t)OBJ_SEPARATOR_END;
711890bc9379ceea66272dc8d4981812224ea86ejc continue;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc disk_cnt++;
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if it's a disk */
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_get_type(raid_tab, *(disk_list + i)) !=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_DISK)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if it's duplicated with other disks */
711890bc9379ceea66272dc8d4981812224ea86ejc for (j = 0; j < i; ++j)
711890bc9379ceea66272dc8d4981812224ea86ejc if (*(disk_list + j) == *(disk_list + i)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_DUP);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check disk status */
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(raid_tab, *(disk_list + i),
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&disk_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret != SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_attr->state != DISK_STATE_GOOD) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DISK_STATE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* All disks must belong to the same controller */
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_controller(raid_tab, *(disk_list + i));
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id == OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(raid_tab, controller_obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc } else if (obj_id != controller_obj_id) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_ACROSS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if the disk contains too many segments */
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, *(disk_list + i),
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_DISK_SEG);
711890bc9379ceea66272dc8d4981812224ea86ejc j = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc while (obj_id > OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc ++j;
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_sibling(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc if (j > controller_attr->max_seg_per_disk) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DISK_SEG_AMOUNT);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if controller is a hostraid controller */
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_attr->capability & RAID_CAP_DISK_TRANS) {
711890bc9379ceea66272dc8d4981812224ea86ejc /*
711890bc9379ceea66272dc8d4981812224ea86ejc * For hostraid, the first disk should
711890bc9379ceea66272dc8d4981812224ea86ejc * be with of minimum capacity
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejc if (min_disk_capacity == 0) {
711890bc9379ceea66272dc8d4981812224ea86ejc min_disk_capacity = disk_attr->capacity;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Can not specify capacity for hostraid */
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_attr->capacity != 0) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc } else if (min_disk_capacity > disk_attr->capacity) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DISK_SPACE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Disk should not be used for hostraid */
711890bc9379ceea66272dc8d4981812224ea86ejc obj_id = obj_get_comp(raid_tab, *(disk_list + i),
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_DISK_SEG);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj_id < OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc } else if (obj_id > OBJ_NONE) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DISK_NOT_EMPTY);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].disk_id = disk_attr->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].offset = OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].size = OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if array amount exceeds limit */
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_attr->max_array_num <=
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw obj_controller_compnum(raid_tab, controller_obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_TYPE_ARRAY))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_AMOUNT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if the controller can support the array RAID level */
711890bc9379ceea66272dc8d4981812224ea86ejc switch (array_attr->raid_level) {
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_0:
711890bc9379ceea66272dc8d4981812224ea86ejc if (!(controller_attr->capability & RAID_CAP_RAID0)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_1:
711890bc9379ceea66272dc8d4981812224ea86ejc if (!(controller_attr->capability & RAID_CAP_RAID1)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_1E:
711890bc9379ceea66272dc8d4981812224ea86ejc if (!(controller_attr->capability & RAID_CAP_RAID1E)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_5:
711890bc9379ceea66272dc8d4981812224ea86ejc if (!(controller_attr->capability & RAID_CAP_RAID5)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_10:
711890bc9379ceea66272dc8d4981812224ea86ejc if (!(controller_attr->capability & RAID_CAP_RAID10)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case RAID_LEVEL_50:
711890bc9379ceea66272dc8d4981812224ea86ejc if (!(controller_attr->capability & RAID_CAP_RAID50)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if plug in can calculate the maximum size */
711890bc9379ceea66272dc8d4981812224ea86ejc (void) memcpy(&array_attr2, array_attr, sizeof (array_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr2.capacity = OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->array_create(controller_attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw &array_attr2, num_of_comp, arraypart_attrs, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* If plugin/driver will not calculate space */
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret == ERR_OP_NO_IMPL) {
711890bc9379ceea66272dc8d4981812224ea86ejc /* Calculate the maximum capacity */
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr2.capacity = raid_space_noalign(raid_tab,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw array_attr2.raid_level, num_of_comp, disk_list,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /*
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 */
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_attr->capability & RAID_CAP_SMART_ALLOC)
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < num_of_comp; ++i) {
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].offset =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attrs[i].size =
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw OBJ_ATTR_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* There's no enough space for specified capacity */
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_attr->capacity > array_attr2.capacity) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_SIZE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* capacity == 0, allocate maximum space */
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_attr->capacity == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->capacity = array_attr2.capacity;
711890bc9379ceea66272dc8d4981812224ea86ejc } else if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc } else if (array_attr2.capacity < array_attr->capacity) {
711890bc9379ceea66272dc8d4981812224ea86ejc /* Return the maximum size */
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr->capacity = array_attr2.capacity;
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_SIZE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (array_attr->capacity < ARRAYPART_MIN_SIZE * disk_cnt) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_ARRAY_SIZE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->array_create(controller_attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw array_attr, num_of_comp, arraypart_attrs, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc free(arraypart_attrs);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret != SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
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);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcobj_array_delete(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t controller_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *controller_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
72e1c0551e3c92bca8ab60d3f38afd96f35cc88cjc int ret, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc uint32_t *disk_ids = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc controller_obj_id = obj_get_controller(raid_tab, array_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (controller_obj_id <= OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(raid_tab, controller_obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc ret = obj_get_attr(raid_tab, array_obj_id, (void **)(&array_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->array_delete(controller_attr->controller_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw array_attr->array_id, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_ids)
711890bc9379ceea66272dc8d4981812224ea86ejc free(disk_ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (disk_ids)
711890bc9379ceea66272dc8d4981812224ea86ejc free(disk_ids);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wangobj_hsp_bind(raid_obj_tab_t *raid_tab, raid_obj_id_t *obj_ids,
711890bc9379ceea66272dc8d4981812224ea86ejc char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id, controller_obj_id = OBJ_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t array_obj_id, disk_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_relation_t *hsp_relation;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *controller_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr_t *arraypart_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *disk_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc diskseg_attr_t *diskseg_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr_t *hsp_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang int ret, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation = malloc(sizeof (hsp_relation_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (hsp_relation == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_obj_id = *(obj_ids);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_obj_id = *(obj_ids + 1);
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (raid_obj_get_type(raid_tab, disk_obj_id) != OBJ_TYPE_DISK ||
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (array_obj_id != OBJ_ATTR_NONE &&
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang raid_obj_get_type(raid_tab, array_obj_id) !=
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_ARRAY)) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DEVICE_TYPE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* Get controller attributes */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (controller_obj_id == OBJ_NONE)
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang controller_obj_id = obj_get_controller(raid_tab,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_obj_id);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang else if (controller_obj_id != obj_get_controller(raid_tab,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_obj_id)) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DRIVER_ACROSS);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, controller_obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* Get disk attributes */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, disk_obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&disk_attr));
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (disk_attr->state == DISK_STATE_FAILED) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DISK_STATE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* If it's not a hsp disk, check if there's occupied space */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (obj_get_comp(raid_tab, disk_obj_id, OBJ_TYPE_HSP) ==
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang obj_id = obj_get_comp(raid_tab, disk_obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_DISK_SEG);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang while (obj_id != OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&diskseg_attr));
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (!(diskseg_attr->state &
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang DISKSEG_STATE_RESERVED)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DISK_NOT_EMPTY);
711890bc9379ceea66272dc8d4981812224ea86ejc }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang obj_id = obj_get_sibling(raid_tab, obj_id);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_obj_id != OBJ_ATTR_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* If local hsp is supported */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (!(controller_attr->capability & RAID_CAP_L_HSP)) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_OP_ILLEGAL);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (raid_obj_get_type(raid_tab, array_obj_id) !=
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_ARRAY) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DEVICE_TYPE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* Get array attributes */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, array_obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&array_attr));
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* RAID 0 array can not use hsp */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_attr->raid_level == RAID_LEVEL_0) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_ARRAY_LEVEL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* If It's belong to another controller */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (controller_obj_id != obj_get_controller(raid_tab,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_obj_id)) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DRIVER_ACROSS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* Get an array part attributes */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if ((array_attr->raid_level == RAID_LEVEL_10) ||
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (array_attr->raid_level == RAID_LEVEL_50))
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang obj_id = obj_get_comp(raid_tab, array_obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_ARRAY);
711890bc9379ceea66272dc8d4981812224ea86ejc else
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang obj_id = array_obj_id;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang obj_id = obj_get_comp(raid_tab, obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_ARRAY_PART);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&arraypart_attr));
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* Check if disk space is enough for array */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (arraypart_attr->size > disk_attr->capacity) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DISK_SPACE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (controller_attr->capability & RAID_CAP_ARRAY_ALIGN)
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if ((arraypart_attr->size +
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang arraypart_attr->offset) >
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_attr->capacity) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DISK_SPACE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang } else if (!(controller_attr->capability & RAID_CAP_G_HSP)) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* if global hsp is supported */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /*
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang * If the array is already associated with the
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang * local hsp, or it's a global hsp, ignore it
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang obj_id = obj_get_comp(raid_tab, disk_obj_id, OBJ_TYPE_HSP);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (obj_id > OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (obj_get_attr(raid_tab, obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)&hsp_attr) >= SUCCESS) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (((hsp_attr->type == HSP_TYPE_GLOBAL) &&
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (array_obj_id != OBJ_ATTR_NONE)) ||
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ((hsp_attr->type == HSP_TYPE_LOCAL) &&
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (array_obj_id == OBJ_ATTR_NONE))) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_OP_ILLEGAL);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_obj_id != OBJ_ATTR_NONE)
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation->array_id = array_attr->array_id;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang else
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation->array_id = (uint32_t)OBJ_ATTR_NONE;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation->disk_id = disk_attr->disk_id;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib->hsp_bind == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_NO_IMPL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->hsp_bind(controller_attr->controller_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wangobj_hsp_unbind(raid_obj_tab_t *raid_tab, raid_obj_id_t *obj_ids,
711890bc9379ceea66272dc8d4981812224ea86ejc char **plugin_err_str)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t obj_id, controller_obj_id = OBJ_NONE;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t array_obj_id, disk_obj_id;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_relation_t *hsp_relation;
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *controller_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc array_attr_t *array_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc disk_attr_t *disk_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc hsp_attr_t *hsp_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang int ret, fd;
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation = malloc(sizeof (hsp_relation_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (hsp_relation == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_obj_id = *(obj_ids);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_obj_id = *(obj_ids + 1);
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (raid_obj_get_type(raid_tab, disk_obj_id) != OBJ_TYPE_DISK) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DEVICE_TYPE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* Get controller attributes */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (controller_obj_id == OBJ_NONE)
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang controller_obj_id = obj_get_controller(raid_tab,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_obj_id);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang else if (controller_obj_id != obj_get_controller(raid_tab,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang disk_obj_id)) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DRIVER_ACROSS);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, controller_obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* Get disk attributes */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, disk_obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&disk_attr));
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (disk_attr->state == DISK_STATE_FAILED) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DISK_STATE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* If it's not a hsp disk */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang obj_id = obj_get_comp(raid_tab, disk_obj_id, OBJ_TYPE_HSP);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (obj_id == OBJ_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DISK_STATE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, obj_id, (void **)(&hsp_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_obj_id != OBJ_ATTR_NONE) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (raid_obj_get_type(raid_tab, array_obj_id) !=
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang OBJ_TYPE_ARRAY) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* Get array attributes */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang ret = obj_get_attr(raid_tab, array_obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&array_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* If It's belong to another controller */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (controller_obj_id != obj_get_controller(raid_tab,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_obj_id)) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_DRIVER_ACROSS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* If want to remove an array from a global hsp */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (hsp_attr->type == HSP_TYPE_GLOBAL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang do {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void) obj_get_attr(raid_tab, obj_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (void **)(&hsp_attr));
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (hsp_attr->associated_id ==
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang array_attr->array_id ||
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_attr->type == HSP_TYPE_GLOBAL)
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang break;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang obj_id = obj_get_sibling(raid_tab, obj_id);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang } while (obj_id > OBJ_NONE);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang } else if (hsp_attr->type != HSP_TYPE_GLOBAL) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /* if global hsp is supported */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang /*
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang * If array is associated with a local hsp, or remove a
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang * global hsp disk
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang */
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if ((obj_id && (array_obj_id != OBJ_ATTR_NONE)) ||
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (array_obj_id == OBJ_ATTR_NONE)) {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang if (array_obj_id != OBJ_ATTR_NONE)
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation->array_id = array_attr->array_id;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang else
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation->array_id =
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang (uint32_t)OBJ_ATTR_NONE;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation->disk_id = disk_attr->disk_id;
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang } else {
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang free(hsp_relation);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang return (ERR_OP_ILLEGAL);
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_obj_get_lib(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc fd = raid_obj_get_fd(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if ((raid_lib == NULL) || (fd == 0))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_CLOSED);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib->hsp_unbind == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_NO_IMPL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_lib->hsp_unbind(controller_attr->controller_id,
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang hsp_relation, plugin_err_str);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc free(hsp_relation);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ret);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Object maintennance routines
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_create_system_obj(raid_obj_tab_t *raid_tab)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *raid_obj;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj = calloc(1, sizeof (raid_obj_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj->obj_id = OBJ_SYSTEM;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj->obj_type_id = OBJ_TYPE_SYSTEM;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj->data = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_tab_insert(raid_tab, raid_obj->obj_id, raid_obj);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret == ERR_DEVICE_DUP) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(raid_obj);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_UNCLEAN);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_id_new(raid_obj_tab_t *raid_tab)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc ++ raid_tab->obj_id_cnt;
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_tab->obj_id_cnt <= 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_OVERFLOW);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (raid_tab->obj_id_cnt);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_attr_new(raid_obj_type_id_t obj_type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc void *obj_attr = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc switch (obj_type) {
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_CONTROLLER:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_attr = calloc(1, sizeof (controller_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_attr = calloc(1, sizeof (array_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_attr = calloc(1, sizeof (disk_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_HSP:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_attr = calloc(1, sizeof (hsp_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_ARRAY_PART:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_attr = calloc(1, sizeof (arraypart_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_DISK_SEG:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_attr = calloc(1, sizeof (diskseg_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc case OBJ_TYPE_TASK:
711890bc9379ceea66272dc8d4981812224ea86ejc obj_attr = calloc(1, sizeof (task_attr_t));
711890bc9379ceea66272dc8d4981812224ea86ejc break;
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw case OBJ_TYPE_PROP:
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw obj_attr = calloc(1, sizeof (property_attr_t));
b449fa8aa1f53939091aeb3a5af8a8f3ba9d33dcyw break;
711890bc9379ceea66272dc8d4981812224ea86ejc default:
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj_attr);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_create(raid_obj_tab_t *raid_tab, raid_obj_type_id_t obj_type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *raid_obj;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc void *data_ptr;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj = calloc(1, sizeof (raid_obj_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj->obj_id = raid_obj_id_new(raid_tab);
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj->obj_id < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_OVERFLOW);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = raid_obj_tab_insert(raid_tab, raid_obj->obj_id, raid_obj);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret == ERR_DEVICE_DUP) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(raid_obj);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_DUP);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc data_ptr = raid_obj_attr_new(obj_type);
711890bc9379ceea66272dc8d4981812224ea86ejc if (data_ptr == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_delete(raid_tab, raid_obj->obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_data_ptr(raid_tab, raid_obj->obj_id, data_ptr);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_type(raid_tab, raid_obj->obj_id, obj_type);
711890bc9379ceea66272dc8d4981812224ea86ejc return (raid_obj->obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_delete(raid_obj_tab_t *raid_tab, raid_obj_id_t raid_obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_remove(raid_tab, raid_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj != NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(obj->data);
711890bc9379ceea66272dc8d4981812224ea86ejc free(obj);
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_add_org(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t container_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t tmp, tmp1;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc tmp = raid_obj_get_comp(raid_tab, container_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (tmp < OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (tmp == OBJ_NONE) {
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 return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while ((tmp1 = raid_obj_get_sibling(raid_tab, tmp)) != OBJ_NONE)
711890bc9379ceea66272dc8d4981812224ea86ejc tmp = tmp1;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_obj_set_sibling(raid_tab, tmp, obj_id) < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc (void) raid_obj_set_container(raid_tab, obj_id, container_id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_type_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_type(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((obj->obj_type_id < OBJ_TYPE_SYSTEM) ||
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (obj->obj_type_id >= OBJ_TYPE_ALL))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_INVALID);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj->obj_type_id);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_type(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t type)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((type < OBJ_TYPE_SYSTEM) || (type >= OBJ_TYPE_ALL))
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_TYPE);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj->obj_type_id = type;
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_status_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_status(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj->status);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_status(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_status_t status)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj->status = obj->status | status;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_clear_status(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_status_t status)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj->status = obj->status & ~status;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_container(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj->container);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_container(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t container_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj->container = container_id;
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_comp(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj->component);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_comp(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t comp)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj->component = comp;
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_id_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_sibling(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj->sibling);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_sibling(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_id_t sibling)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj->sibling = sibling;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_data_ptr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj->data);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_data_ptr(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc void *data)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj->data = data;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_obj_handle_t
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_get_handle(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj->handle);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_set_handle(raid_obj_tab_t *raid_tab, raid_obj_id_t obj_id,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t handle)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_obj_tab_find(raid_tab, obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_NOENT);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc obj->handle = handle;
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Object list maintennance routines
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_list_create(raid_list_t *list, size_t offset)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc list->head = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc list->tail = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc list->offset = offset;
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_list_head(raid_list_t *list)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc return (list->head);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_list_next(raid_list_t *list, void *obj)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_el_t *el = LIST_OBJ_TO_EL(list, obj);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (el->next);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_list_insert_tail(raid_list_t *list, void *obj)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_el_t *el = LIST_OBJ_TO_EL(list, obj), *el1;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc el->prev = list->tail;
711890bc9379ceea66272dc8d4981812224ea86ejc list->tail = obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc el->next = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (list->head == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc list->head = obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (el->prev != NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc el1 = LIST_OBJ_TO_EL(list, el->prev);
711890bc9379ceea66272dc8d4981812224ea86ejc el1->next = obj;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_list_remove(raid_list_t *list, void *obj)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_el_t *el = LIST_OBJ_TO_EL(list, obj), *el1;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (list->head == obj)
711890bc9379ceea66272dc8d4981812224ea86ejc list->head = el->next;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (list->tail == obj)
711890bc9379ceea66272dc8d4981812224ea86ejc list->tail = el->prev;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (el->next != NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc el1 = LIST_OBJ_TO_EL(list, el->next);
711890bc9379ceea66272dc8d4981812224ea86ejc el1->prev = el->prev;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (el->prev != NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc el1 = LIST_OBJ_TO_EL(list, el->prev);
711890bc9379ceea66272dc8d4981812224ea86ejc el1->next = el->next;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc el->prev = el->next = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_list_remove_head(raid_list_t *list)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc void *obj = list->head;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_remove(list, obj);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_list_find(raid_list_t *list, raid_obj_id_t obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (obj = raid_list_head(list); obj != NULL;
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw obj = raid_list_next(list, obj))
711890bc9379ceea66272dc8d4981812224ea86ejc if (obj->obj_id == obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc break;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_tab_create(raid_obj_tab_t *tab, size_t hash_slots)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc unsigned i;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (hash_slots == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_OP_ILLEGAL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc tab->slots = hash_slots;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((tab->table = calloc(hash_slots, sizeof (raid_list_t))) == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_NOMEM);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < hash_slots; i++)
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_create(&tab->table[i], offsetof(raid_obj_t, el));
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_tab_destroy(raid_obj_tab_t *tab)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc unsigned i;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc for (i = 0; i < tab->slots; i++) {
711890bc9379ceea66272dc8d4981812224ea86ejc struct raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while ((obj = raid_list_remove_head(&tab->table[i])) != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc free(obj);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_destroy(&tab->table[i]);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (tab->table)
711890bc9379ceea66272dc8d4981812224ea86ejc free(tab->table);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc tab->table = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc tab->slots = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc tab->obj_id_cnt = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_tab_insert(raid_obj_tab_t *tab, raid_obj_id_t id, void *obj)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_t *list;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc list = OBJ_TAB_SLOT(tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_list_find(list, id) != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DEVICE_DUP);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_insert_tail(list, obj);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_tab_remove(raid_obj_tab_t *tab, raid_obj_id_t id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_t *list;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc list = OBJ_TAB_SLOT(tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((obj = raid_list_find(list, id)) != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_remove(list, obj);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_obj_tab_find(raid_obj_tab_t *tab, raid_obj_id_t id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_list_t *list;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_t *obj;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc list = OBJ_TAB_SLOT(tab, id);
711890bc9379ceea66272dc8d4981812224ea86ejc obj = raid_list_find(list, id);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (obj);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_list_destroy(raid_list_t *list)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc list->head = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc list->tail = NULL;
711890bc9379ceea66272dc8d4981812224ea86ejc list->offset = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc/*
711890bc9379ceea66272dc8d4981812224ea86ejc * Plug-in maintennance routines
711890bc9379ceea66272dc8d4981812224ea86ejc */
711890bc9379ceea66272dc8d4981812224ea86ejcstatic int
711890bc9379ceea66272dc8d4981812224ea86ejccontroller_id_to_path(uint32_t controller_id, char *path)
711890bc9379ceea66272dc8d4981812224ea86ejc{
317fb4ac3931ab67c3f66b6fd0e0f7f8a1727bc9Yu-Bo Ryan Wang int fd;
711890bc9379ceea66272dc8d4981812224ea86ejc char buf[MAX_PATH_LEN] = {0}, buf1[MAX_PATH_LEN] = {0}, *colon;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) snprintf(buf, MAX_PATH_LEN, "%s/c%d", CFGDIR, controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (readlink(buf, buf1, sizeof (buf1)) < 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_NOT_FOUND);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if (buf1[0] != '/')
711890bc9379ceea66272dc8d4981812224ea86ejc (void) snprintf(buf, sizeof (buf), "%s/", CFGDIR);
711890bc9379ceea66272dc8d4981812224ea86ejc else
711890bc9379ceea66272dc8d4981812224ea86ejc buf[0] = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc (void) strlcat(buf, buf1, MAX_PATH_LEN);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc colon = strrchr(buf, ':');
711890bc9379ceea66272dc8d4981812224ea86ejc if (colon == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_NOT_FOUND);
711890bc9379ceea66272dc8d4981812224ea86ejc else
711890bc9379ceea66272dc8d4981812224ea86ejc *colon = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) snprintf(path, MAX_PATH_LEN, "%s:devctl", buf);
711890bc9379ceea66272dc8d4981812224ea86ejc
317fb4ac3931ab67c3f66b6fd0e0f7f8a1727bc9Yu-Bo Ryan Wang fd = open(path, O_RDONLY | O_NDELAY);
317fb4ac3931ab67c3f66b6fd0e0f7f8a1727bc9Yu-Bo Ryan Wang
317fb4ac3931ab67c3f66b6fd0e0f7f8a1727bc9Yu-Bo Ryan Wang if (fd < 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (ERR_DRIVER_NOT_FOUND);
711890bc9379ceea66272dc8d4981812224ea86ejc
317fb4ac3931ab67c3f66b6fd0e0f7f8a1727bc9Yu-Bo Ryan Wang (void) close(fd);
317fb4ac3931ab67c3f66b6fd0e0f7f8a1727bc9Yu-Bo Ryan Wang
711890bc9379ceea66272dc8d4981812224ea86ejc return (SUCCESS);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic char *
711890bc9379ceea66272dc8d4981812224ea86ejccontroller_id_to_driver_name(uint32_t controller_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc char buf[MAX_PATH_LEN];
711890bc9379ceea66272dc8d4981812224ea86ejc di_node_t di_node;
711890bc9379ceea66272dc8d4981812224ea86ejc char *name, *tmp;
711890bc9379ceea66272dc8d4981812224ea86ejc int ret;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc ret = controller_id_to_path(controller_id, buf);
711890bc9379ceea66272dc8d4981812224ea86ejc if (ret < SUCCESS)
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc tmp = strrchr(buf, ':');
711890bc9379ceea66272dc8d4981812224ea86ejc if (tmp != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc *tmp = 0;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc tmp = strstr(buf, "pci");
711890bc9379ceea66272dc8d4981812224ea86ejc if (tmp == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc di_node = di_init(tmp, DINFOPROP);
711890bc9379ceea66272dc8d4981812224ea86ejc if (di_node == DI_NODE_NIL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc name = di_driver_name(di_node);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (name);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic void
711890bc9379ceea66272dc8d4981812224ea86ejcraid_plugin_init()
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib = raid_lib_sys;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_lib) {
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_sys = raid_lib->next;
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(raid_lib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(raid_lib);
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_lib_sys;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_lib_t *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_plugin_load(char *driver_name)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc char buf[MAX_PATH_LEN] = {0};
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *supplib;
711890bc9379ceea66272dc8d4981812224ea86ejc void *sym;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc supplib = calloc(1, sizeof (raid_lib_t));
711890bc9379ceea66272dc8d4981812224ea86ejc if (supplib == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) snprintf(buf, MAX_PATH_LEN, "%s/%s.so.1",
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw SUPP_PLUGIN_DIR, driver_name);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->lib_handle = dlopen(buf, RTLD_LAZY);
711890bc9379ceea66272dc8d4981812224ea86ejc if (supplib->lib_handle == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->name = driver_name;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_version")) == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->version = RDCFG_PLUGIN_V1;
711890bc9379ceea66272dc8d4981812224ea86ejc else {
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->version = *((uint32_t *)sym);
711890bc9379ceea66272dc8d4981812224ea86ejc if (supplib->version != RDCFG_PLUGIN_V1) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(supplib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_open_controller")) ==
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(supplib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc } else
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->open_controller = (int(*)(uint32_t, char **))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_close_controller")) ==
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(supplib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc } else
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->close_controller = (int (*)(uint32_t, char **))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_compnum")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(supplib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc } else
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->compnum = (int (*)(uint32_t, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t, raid_obj_type_id_t))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_complist")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(supplib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc } else
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->complist = (int (*)(uint32_t, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t, raid_obj_type_id_t, int, void *))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_get_attr")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(supplib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc } else
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->get_attr = (int (*)(uint32_t, uint32_t, uint32_t,
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_type_id_t, void*))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_array_create")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(supplib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc } else
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->array_create = (int (*)(uint32_t, array_attr_t *, int,
711890bc9379ceea66272dc8d4981812224ea86ejc arraypart_attr_t *, char **))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc if ((sym = dlsym(supplib->lib_handle, "rdcfg_array_delete")) == NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc (void) dlclose(supplib->lib_handle);
711890bc9379ceea66272dc8d4981812224ea86ejc free(supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc } else
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->array_delete =
711890bc9379ceea66272dc8d4981812224ea86ejc (int (*)(uint32_t, uint32_t, char **))sym;
711890bc9379ceea66272dc8d4981812224ea86ejc
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang supplib->hsp_bind = (int (*)(uint32_t, hsp_relation_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc char **))dlsym(supplib->lib_handle, "rdcfg_hsp_bind");
5c9d25d25ae7531d61aca4904f76e3dae2f457bfYu-Bo Ryan Wang supplib->hsp_unbind = (int (*)(uint32_t, hsp_relation_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc char **))dlsym(supplib->lib_handle, "rdcfg_hsp_unbind");
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->set_attr = (int (*)(uint32_t, uint32_t, uint32_t, uint32_t *,
711890bc9379ceea66272dc8d4981812224ea86ejc char **))dlsym(supplib->lib_handle, "rdcfg_set_attr");
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->flash_fw = (int (*)(uint32_t, char *, uint32_t, char **))
711890bc9379ceea66272dc8d4981812224ea86ejc dlsym(supplib->lib_handle, "rdcfg_flash_fw");
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc supplib->next = raid_lib_sys;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_sys = supplib;
711890bc9379ceea66272dc8d4981812224ea86ejc return (supplib);
711890bc9379ceea66272dc8d4981812224ea86ejc}
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejcstatic raid_lib_t *
711890bc9379ceea66272dc8d4981812224ea86ejcraid_find_lib(raid_obj_tab_t *raid_tab, raid_obj_id_t controller_obj_id)
711890bc9379ceea66272dc8d4981812224ea86ejc{
711890bc9379ceea66272dc8d4981812224ea86ejc controller_attr_t *controller_attr;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib_t *raid_lib;
711890bc9379ceea66272dc8d4981812224ea86ejc char *driver_name;
711890bc9379ceea66272dc8d4981812224ea86ejc raid_obj_handle_t handle;
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if it's mapped to handle structure */
711890bc9379ceea66272dc8d4981812224ea86ejc handle = raid_obj_to_handle(raid_tab, controller_obj_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_handle_sys.handles[handle].raid_lib != NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (raid_handle_sys.handles[handle].raid_lib);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc (void) obj_get_attr(raid_tab, controller_obj_id,
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw (void **)(&controller_attr));
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Check if the plugin module is already loaded */
711890bc9379ceea66272dc8d4981812224ea86ejc driver_name = controller_id_to_driver_name(
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw controller_attr->controller_id);
711890bc9379ceea66272dc8d4981812224ea86ejc if (driver_name == NULL)
711890bc9379ceea66272dc8d4981812224ea86ejc return (NULL);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_lib_sys;
711890bc9379ceea66272dc8d4981812224ea86ejc while (raid_lib != NULL) {
711890bc9379ceea66272dc8d4981812224ea86ejc if (raid_lib->name != NULL &&
700682b83aee7f7b038d7f1d7f262ff4bff575d5yw strcmp(driver_name, raid_lib->name) == 0)
711890bc9379ceea66272dc8d4981812224ea86ejc return (raid_lib);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_lib->next;
711890bc9379ceea66272dc8d4981812224ea86ejc }
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc /* Loading the plugin module */
711890bc9379ceea66272dc8d4981812224ea86ejc raid_lib = raid_plugin_load(driver_name);
711890bc9379ceea66272dc8d4981812224ea86ejc
711890bc9379ceea66272dc8d4981812224ea86ejc return (raid_lib);
711890bc9379ceea66272dc8d4981812224ea86ejc}