raidcfg.c revision ee992693a278a8fe9135d083f8f8370fdc891465
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A#include <config_admin.h>
2N/A#include <libdevinfo.h>
2N/A#ifndef TEXT_DOMAIN
2N/Atypedef int raid_obj_id_t;
2N/Atypedef int raid_obj_status_t;
raid_obj_id_t *, char **);
} raid_obj_t;
static int raid_handle_init();
static void raid_handle_fini();
uint32_t);
uint32_t);
uint32_t, void *, char **);
raid_obj_id_t *, char **);
static void raid_plugin_init();
int handle_num;
int used;
int unused;
char *ret_val;
switch (err_code) {
case SUCCESS:
case STD_IOCTL:
case ERR_DRIVER_NOT_FOUND:
case ERR_DRIVER_OPEN:
case ERR_DRIVER_LOCK:
case ERR_DRIVER_CLOSED:
case ERR_DRIVER_ACROSS:
case ERR_ARRAY_LEVEL:
case ERR_ARRAY_SIZE:
case ERR_ARRAY_STRIPE_SIZE:
case ERR_ARRAY_CACHE_POLICY:
case ERR_ARRAY_IN_USE:
case ERR_ARRAY_TASK:
case ERR_ARRAY_CONFIG:
case ERR_ARRAY_DISKNUM:
case ERR_ARRAY_LAYOUT:
case ERR_ARRAY_AMOUNT:
case ERR_DISK_STATE:
case ERR_DISK_SPACE:
case ERR_DISK_SEG_AMOUNT:
case ERR_DISK_NOT_EMPTY:
case ERR_DISK_TASK:
case ERR_TASK_STATE:
case ERR_OP_ILLEGAL:
case ERR_OP_NO_IMPL:
case ERR_OP_FAILED:
case ERR_DEVICE_NOENT:
case ERR_DEVICE_TYPE:
case ERR_DEVICE_DUP:
case ERR_DEVICE_OVERFLOW:
case ERR_DEVICE_UNCLEAN:
case ERR_DEVICE_INVALID:
case ERR_NOMEM:
case ERR_PRIV:
return (ret_val);
int ret_val;
return (obj_id);
return (ERR_DEVICE_NOENT);
return (ret_val);
int ret_val;
return (obj_id);
return (obj_id);
return (ERR_DEVICE_NOENT);
return (ret_val);
int ret_val;
return (obj_id);
return (obj_id);
return (ERR_DEVICE_NOENT);
return (ret_val);
int ret;
return (ERR_DEVICE_NOENT);
return (ret);
return (SUCCESS);
int ret;
return (ERR_DEVICE_NOENT);
return (ret);
return (SUCCESS);
int ret_val;
return (ERR_DEVICE_NOENT);
return (ret_val);
void *data;
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_NOENT);
return (ret);
switch (type) {
case OBJ_TYPE_CONTROLLER:
case OBJ_TYPE_ARRAY:
case OBJ_TYPE_HSP:
(void **)(&ctlr_attr));
return (ret);
(void **)(&array_attr));
return (ret);
return (SUCCESS);
case OBJ_TYPE_DISK:
case OBJ_TYPE_ARRAY_PART:
(void **)(&ctlr_attr));
return (ret);
return (SUCCESS);
(void **)(&disk_attr));
return (ret);
return (SUCCESS);
case OBJ_TYPE_DISK_SEG:
case OBJ_TYPE_TASK:
case OBJ_TYPE_PROP:
return (SUCCESS);
return (SUCCESS);
return (ERR_DEVICE_TYPE);
return (ret);
int ret_val;
return (ERR_DEVICE_NOENT);
return (obj_id);
return (ret_val);
int ret_val;
return (ERR_DEVICE_NOENT);
return (obj_id);
return (ret_val);
int ret_val;
return (ERR_DEVICE_NOENT);
return (obj_id);
return (ret_val);
char **plugin_err_str)
int ret;
return (ERR_DEVICE_NOENT);
return (ERR_OP_NO_IMPL);
return (ret);
int ret;
return (ERR_DEVICE_NOENT);
return (ERR_OP_NO_IMPL);
return (ret);
char **plugin_err_str)
int i, ret;
return (ERR_NOMEM);
for (i = 0; i < num_of_comps; ++i) {
*(disk_handles + i));
return (ERR_DEVICE_TYPE);
return (obj_id);
return (ret);
return (array_handle);
int ret;
return (ERR_DEVICE_TYPE);
return (array_obj_id);
return (ERR_DEVICE_INVALID);
return (ret);
char **plugin_err_str)
int ret;
return (ERR_OP_ILLEGAL);
return (ERR_NOMEM);
return (array_obj_id);
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_TYPE);
return (disk_obj_id);
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_TYPE);
return (ret);
char **plugin_err_str)
int ret;
return (ERR_OP_ILLEGAL);
return (ERR_NOMEM);
return (array_obj_id);
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_TYPE);
return (disk_obj_id);
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_TYPE);
return (ret);
raidcfg_init(void)
(void) raid_handle_init();
raidcfg_fini(void)
i = *((int *)p1);
j = *((int *)p2);
static uint64_t
for (i = 0; i < num; ++i) {
(void **)(&disk_attr));
(&diskseg_attr));
OBJ_NONE) {
(void **)(&diskseg_attr));
disk_num = 0;
disk_layer = 0;
sub_array_num = 0;
for (i = 0; i < num; ++i) {
++ disk_layer;
-- disk_layer;
if (disk_layer != 0)
++ sub_array_num;
++disk_num;
switch (raid_level) {
case RAID_LEVEL_0:
case RAID_LEVEL_1:
case RAID_LEVEL_1E:
case RAID_LEVEL_5:
case RAID_LEVEL_10:
case RAID_LEVEL_50:
return (ERR_ARRAY_LEVEL);
return (capacity);
void *ptr;
return (ERR_NOMEM);
return (SUCCESS);
static raid_obj_handle_t
int ret;
return (ret);
return (ret);
if (handle == 0)
while (i != 0 && i != handle) {
if (i == handle) {
controller_id) &&
static raid_obj_id_t
return (OBJ_SYSTEM);
case OBJ_TYPE_SYSTEM:
return (OBJ_SYSTEM);
case OBJ_TYPE_CONTROLLER:
case OBJ_TYPE_ARRAY:
case OBJ_TYPE_HSP:
case OBJ_TYPE_DISK:
case OBJ_TYPE_ARRAY_PART:
case OBJ_TYPE_DISK_SEG:
case OBJ_TYPE_TASK:
case OBJ_TYPE_PROP:
return (ERR_DEVICE_INVALID);
return (obj_id);
return (ERR_DEVICE_NOENT);
return (obj_id);
static raid_obj_handle_t
return (OBJ_SYSTEM);
if (handle != 0)
return (handle);
if (handle != 0)
return (handle);
switch (type) {
case OBJ_TYPE_SYSTEM:
case OBJ_TYPE_CONTROLLER:
case OBJ_TYPE_ARRAY:
case OBJ_TYPE_HSP:
case OBJ_TYPE_DISK:
case OBJ_TYPE_ARRAY_PART:
case OBJ_TYPE_DISK_SEG:
case OBJ_TYPE_TASK:
case OBJ_TYPE_PROP:
return (ERR_DEVICE_INVALID);
return (handle);
static raid_lib_t *
return (NULL);
if (handle == 0)
return (NULL);
return (ERR_DEVICE_TYPE);
if (handle == 0)
return (ERR_DEVICE_NOENT);
return (SUCCESS);
return (ERR_DEVICE_TYPE);
if (handle == 0)
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_TYPE);
if (handle == 0)
return (ERR_DEVICE_NOENT);
return (SUCCESS);
return (status);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
++obj_type_cnt) {
comp_num = 0;
return (comp_num);
if (comp_num == 0)
return (ERR_NOMEM);
for (i = 0; i < comp_num; ++i) {
return (ret);
obj_id);
return (SUCCESS);
int ret;
return (ERR_NOMEM);
return (ret);
return (SUCCESS);
static raid_obj_id_t
int ret;
return (ERR_DEVICE_TYPE);
return (status);
return (ret);
return (id);
return (type);
return (id);
return (id);
return (type);
return (id);
static raid_obj_id_t
return (obj_type);
return (id);
return (type);
return (id);
void *attr;
return (status);
return (type);
return (ret);
return (ERR_DEVICE_INVALID);
return (SUCCESS);
static raid_obj_id_t
return (obj_id);
return (ERR_DEVICE_INVALID);
return (obj_id);
static raid_obj_id_t
return (obj_id);
return (obj_id);
static raid_obj_id_t
return (obj_id);
return (ERR_DEVICE_INVALID);
return (ret);
return (obj_id);
static raid_obj_id_t
return (obj_id);
return (obj_id);
return (obj_id);
return (obj_id);
static raid_obj_id_t
return (obj_id);
return (obj_id);
return (ERR_DEVICE_INVALID);
return (obj_id);
static raid_obj_id_t
return (obj_id);
return (obj_id);
return (ERR_DEVICE_INVALID);
OBJ_NONE);
return (obj_id);
static raid_obj_id_t
return (obj_id);
return (obj_id);
return (ERR_DEVICE_INVALID);
return (obj_id);
static raid_obj_id_t
return (obj_id);
return (obj_id);
return (task_obj_id);
return (ERR_DEVICE_INVALID);
return (task_obj_id);
return (task_obj_id);
return (ERR_DEVICE_INVALID);
return (task_obj_id);
return (obj_id);
return (obj_id);
return (task_obj_id);
return (ERR_DEVICE_INVALID);
return (task_obj_id);
return (obj_id);
static raid_obj_id_t
return (obj_id);
return (obj_id);
return (obj_id);
return (obj_id);
static raid_obj_id_t
return (ERR_DEVICE_INVALID);
return (id);
int num = 0;
return (ERR_DEVICE_TYPE);
return (ERR_DRIVER_NOT_FOUND);
++ num;
return (num);
return (ERR_DEVICE_TYPE);
return (ERR_OP_ILLEGAL);
return (ERR_DRIVER_NOT_FOUND);
return (ERR_NOMEM);
for (i = 0; i < num; i++) {
*(comp_list + i));
return (ERR_DEVICE_INVALID);
return (SUCCESS);
return (ERR_DEVICE_TYPE);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ERR_DEVICE_TYPE);
return (ERR_OP_ILLEGAL);
for (i = 0; i < comp_num; ++i)
return (ERR_DEVICE_TYPE);
return (ERR_DRIVER_CLOSED);
return (ERR_NOMEM);
return (ret);
for (i = 0; i < comp_num; ++ i) {
void *attr_buf;
return (ERR_DEVICE_INVALID);
switch (comp_type) {
case OBJ_TYPE_ARRAY:
case OBJ_TYPE_DISK:
return (ERR_DEVICE_INVALID);
return (SUCCESS);
return (ERR_DEVICE_TYPE);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
if (fd == 0)
return (SUCCESS);
return (SUCCESS);
return (ret);
return (ret);
return (ERR_DEVICE_TYPE);
switch (sub_cmd) {
case ACT_CONTROLLER_OPEN:
if (fd > 0)
return (SUCCESS);
return (ERR_DRIVER_NOT_FOUND);
case ACT_CONTROLLER_CLOSE:
if (fd <= 0)
return (SUCCESS);
return (SUCCESS);
case ACT_CONTROLLER_FLASH_FW:
char *filebuf;
int image_fd;
return (ERR_OP_ILLEGAL);
return (ERR_OP_FAILED);
return (ERR_OP_FAILED);
return (ERR_NOMEM);
return (ERR_OP_FAILED);
if (fd <= 0) {
return (ERR_DRIVER_CLOSED);
return (ERR_DRIVER_CLOSED);
return (ERR_OP_NO_IMPL);
return (ERR_OP_ILLEGAL);
return (ret);
return (ERR_DEVICE_TYPE);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ERR_DEVICE_TYPE);
return (ERR_OP_ILLEGAL);
for (i = 0; i < comp_num; ++i)
return (ERR_DEVICE_TYPE);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ERR_NOMEM);
return (ret);
for (i = 0; i < comp_num; ++ i) {
void *attr_buf;
return (ERR_DEVICE_INVALID);
switch (comp_type) {
case OBJ_TYPE_ARRAY:
case OBJ_TYPE_ARRAY_PART:
case OBJ_TYPE_TASK:
return (ERR_DEVICE_INVALID);
return (ret);
return (ERR_DEVICE_TYPE);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ret);
return (ERR_DEVICE_TYPE);
switch (sub_cmd) {
case SET_CACHE_WR_PLY:
return (ERR_OP_ILLEGAL);
case SET_CACHE_RD_PLY:
return (ERR_OP_ILLEGAL);
case SET_ACTIVATION_PLY:
return (ERR_OP_ILLEGAL);
return (ERR_OP_ILLEGAL);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ERR_OP_NO_IMPL);
return (ret);
return (ERR_DEVICE_TYPE);
return (ERR_DEVICE_INVALID);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ERR_DEVICE_TYPE);
return (ERR_OP_ILLEGAL);
for (i = 0; i < comp_num; ++i)
return (ERR_DEVICE_TYPE);
return (ERR_DEVICE_INVALID);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ERR_NOMEM);
return (ret);
for (i = 0; i < comp_num; ++ i) {
void *attr_buf;
return (ERR_DEVICE_INVALID);
switch (comp_type) {
case OBJ_TYPE_DISK_SEG:
case OBJ_TYPE_HSP:
case OBJ_TYPE_TASK:
case OBJ_TYPE_PROP:
return (ERR_DEVICE_INVALID);
return (ret);
return (ERR_DEVICE_TYPE);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ret);
return (ERR_DEVICE_TYPE);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
return (SUCCESS);
return (ERR_DEVICE_TYPE);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ret);
return (ERR_DEVICE_TYPE);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ret);
return (ERR_DEVICE_TYPE);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ERR_DEVICE_TYPE);
return (SUCCESS);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_INVALID);
return (ERR_DRIVER_CLOSED);
return (ret);
return (ERR_NOMEM);
return (ret);
return (ret);
return (ERR_DEVICE_INVALID);
return (ERR_ARRAY_LAYOUT);
for (i = 0; i < num_of_comp; ++i) {
if (disk_cnt != 0)
return (ERR_ARRAY_LAYOUT);
++layer_cnt;
if (disk_set_num == 0)
return (ERR_ARRAY_LAYOUT);
disk_cnt = 0;
++set_num;
--layer_cnt;
case RAID_LEVEL_0:
case RAID_LEVEL_1:
case RAID_LEVEL_1E:
case RAID_LEVEL_5:
return (ERR_ARRAY_LAYOUT);
case RAID_LEVEL_10:
case RAID_LEVEL_50:
return (ERR_ARRAY_LAYOUT);
return (ERR_ARRAY_LEVEL);
++disk_cnt;
if (layer_cnt != 0)
return (ERR_ARRAY_LAYOUT);
case RAID_LEVEL_0:
return (ERR_ARRAY_LAYOUT);
case RAID_LEVEL_1:
return (ERR_ARRAY_LAYOUT);
case RAID_LEVEL_1E:
case RAID_LEVEL_5:
return (ERR_ARRAY_LAYOUT);
case RAID_LEVEL_10:
return (ERR_ARRAY_LAYOUT);
case RAID_LEVEL_50:
return (ERR_ARRAY_LAYOUT);
return (ERR_ARRAY_LEVEL);
return (ERR_NOMEM);
for (i = 0; i < num_of_comp; ++i) {
disk_cnt++;
return (ERR_DEVICE_TYPE);
return (ERR_DEVICE_DUP);
(void **)(&disk_attr));
return (ret);
return (ERR_DISK_STATE);
return (obj_id);
(void **)(&controller_attr));
return (ERR_DRIVER_ACROSS);
return (ERR_DISK_SEG_AMOUNT);
if (min_disk_capacity == 0) {
return (ERR_OP_ILLEGAL);
return (ERR_DISK_SPACE);
return (obj_id);
return (ERR_DISK_NOT_EMPTY);
return (ERR_ARRAY_AMOUNT);
return (ERR_DRIVER_CLOSED);
case RAID_LEVEL_0:
return (ERR_ARRAY_LEVEL);
case RAID_LEVEL_1:
return (ERR_ARRAY_LEVEL);
case RAID_LEVEL_1E:
return (ERR_ARRAY_LEVEL);
case RAID_LEVEL_5:
return (ERR_ARRAY_LEVEL);
case RAID_LEVEL_10:
return (ERR_ARRAY_LEVEL);
case RAID_LEVEL_50:
return (ERR_ARRAY_LEVEL);
return (ERR_ARRAY_LEVEL);
for (i = 0; i < num_of_comp; ++i) {
return (ERR_ARRAY_SIZE);
return (ret);
return (ERR_ARRAY_SIZE);
return (ERR_ARRAY_SIZE);
return (ret);
return (ret);
char **plugin_err_str)
return (controller_obj_id);
(void **)(&controller_attr));
return (ret);
return (ret);
return (ERR_DRIVER_CLOSED);
if (disk_ids)
return (ret);
if (disk_ids)
return (ret);
char **plugin_err_str)
return (ERR_NOMEM);
OBJ_TYPE_ARRAY)) {
return (ERR_DEVICE_TYPE);
disk_obj_id)) {
return (ERR_DRIVER_ACROSS);
(void **)(&controller_attr));
(void **)(&disk_attr));
return (ERR_DISK_STATE);
OBJ_NONE) {
(void **)(&diskseg_attr));
return (ERR_DISK_NOT_EMPTY);
return (ERR_OP_ILLEGAL);
return (ERR_DEVICE_TYPE);
(void **)(&array_attr));
return (ERR_ARRAY_LEVEL);
array_obj_id)) {
return (ERR_DRIVER_ACROSS);
(void **)(&arraypart_attr));
return (ERR_DISK_SPACE);
return (ERR_DISK_SPACE);
return (ERR_OP_ILLEGAL);
return (ERR_OP_ILLEGAL);
return (ERR_DRIVER_CLOSED);
return (ERR_OP_NO_IMPL);
return (ret);
char **plugin_err_str)
return (ERR_NOMEM);
return (ERR_DEVICE_TYPE);
disk_obj_id)) {
return (ERR_DRIVER_ACROSS);
(void **)(&controller_attr));
(void **)(&disk_attr));
return (ERR_DISK_STATE);
return (ERR_DISK_STATE);
return (ERR_DEVICE_TYPE);
(void **)(&array_attr));
array_obj_id)) {
return (ERR_DRIVER_ACROSS);
return (ERR_OP_ILLEGAL);
(void **)(&hsp_attr));
return (ERR_OP_ILLEGAL);
return (ERR_OP_ILLEGAL);
return (ERR_DRIVER_CLOSED);
return (ERR_OP_NO_IMPL);
return (ret);
int ret;
return (ERR_NOMEM);
return (ERR_DEVICE_UNCLEAN);
return (SUCCESS);
static raid_obj_id_t
return (ERR_DEVICE_OVERFLOW);
switch (obj_type) {
case OBJ_TYPE_CONTROLLER:
case OBJ_TYPE_ARRAY:
case OBJ_TYPE_DISK:
case OBJ_TYPE_HSP:
case OBJ_TYPE_ARRAY_PART:
case OBJ_TYPE_DISK_SEG:
case OBJ_TYPE_TASK:
case OBJ_TYPE_PROP:
return (obj_attr);
static raid_obj_id_t
int ret;
void *data_ptr;
return (ERR_NOMEM);
return (ERR_DEVICE_OVERFLOW);
return (ERR_DEVICE_DUP);
return (ERR_NOMEM);
return (SUCCESS);
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_NOENT);
return (SUCCESS);
return (ERR_DEVICE_NOENT);
return (SUCCESS);
static raid_obj_type_id_t
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_INVALID);
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_TYPE);
return (SUCCESS);
static raid_obj_status_t
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_NOENT);
return (SUCCESS);
return (ERR_DEVICE_NOENT);
return (SUCCESS);
static raid_obj_id_t
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_NOENT);
return (SUCCESS);
static raid_obj_id_t
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_NOENT);
return (SUCCESS);
static raid_obj_id_t
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_NOENT);
return (SUCCESS);
return (NULL);
void *data)
return (ERR_DEVICE_NOENT);
return (SUCCESS);
static raid_obj_handle_t
return (ERR_DEVICE_NOENT);
return (ERR_DEVICE_NOENT);
return (SUCCESS);
return (obj);
return (obj);
if (hash_slots == 0)
return (ERR_OP_ILLEGAL);
return (ERR_NOMEM);
for (i = 0; i < hash_slots; i++)
return (SUCCESS);
return (ERR_DEVICE_DUP);
return (SUCCESS);
return (obj);
return (obj);
int fd;
return (ERR_DRIVER_NOT_FOUND);
buf[0] = 0;
return (ERR_DRIVER_NOT_FOUND);
*colon = 0;
if (fd < 0)
return (ERR_DRIVER_NOT_FOUND);
return (SUCCESS);
int ret;
return (NULL);
*tmp = 0;
return (NULL);
return (NULL);
return (name);
while (raid_lib) {
static raid_lib_t *
void *sym;
return (NULL);
return (NULL);
return (NULL);
NULL) {
return (NULL);
NULL) {
return (NULL);
return (NULL);
return (NULL);
return (NULL);
return (NULL);
return (NULL);
return (supplib);
static raid_lib_t *
char *driver_name;
(void **)(&controller_attr));
return (NULL);
return (raid_lib);
return (raid_lib);