diff options
Diffstat (limited to 'usr/src/lib')
-rw-r--r-- | usr/src/lib/libraidcfg/common/raidcfg.c | 33 | ||||
-rw-r--r-- | usr/src/lib/libraidcfg/common/raidcfg_spi.h | 9 |
2 files changed, 25 insertions, 17 deletions
diff --git a/usr/src/lib/libraidcfg/common/raidcfg.c b/usr/src/lib/libraidcfg/common/raidcfg.c index 4d85b2b499..ebd5982930 100644 --- a/usr/src/lib/libraidcfg/common/raidcfg.c +++ b/usr/src/lib/libraidcfg/common/raidcfg.c @@ -3119,6 +3119,7 @@ obj_array_create(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id, array_attr_t *array_attr, array_attr2; disk_attr_t *disk_attr; arraypart_attr_t *arraypart_attrs; + disk_tag_t *disk_tags; raid_obj_id_t obj_id, controller_obj_id = OBJ_NONE; raid_lib_t *raid_lib; int i, j, ret, fd; @@ -3426,6 +3427,11 @@ obj_array_create(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id, if (diskid_list == NULL) { return (ERR_NOMEM); } + disk_tags = (disk_tag_t *)calloc(num_of_comp, + sizeof (disk_tag_t)); + if (disk_tags == NULL) { + return (ERR_NOMEM); + } for (i = 0; i < num_of_comp; ++i) { if (*(disk_list + i) == OBJ_SEPARATOR_BEGIN) { @@ -3440,6 +3446,7 @@ obj_array_create(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id, return (ret); } diskid_list[i] = disk_attr->disk_id; + disk_tags[i] = disk_attr->tag; } } @@ -3449,20 +3456,22 @@ obj_array_create(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id, continue; } - if (TARGET(diskid_list[i]) == - ARRAY_TARGET(array_attr->array_id) && - LUN(diskid_list[i]) == - ARRAY_LUN(array_attr->array_id)) + if ((disk_tags[i].cidl.target_id == + array_attr->tag.idl.target_id) && + (disk_tags[i].cidl.lun == + array_attr->tag.idl.lun)) continue; ret = raid_dev_config(CFGA_CMD_UNCONFIGURE, controller_attr->controller_id, diskid_list[i], 0); if (ret != SUCCESS) { free(diskid_list); + free(disk_tags); return (ret); } } free(diskid_list); + free(disk_tags); } else { /* for HW raid */ ret = raid_dev_config(CFGA_CMD_CONFIGURE, @@ -3480,6 +3489,7 @@ obj_array_delete(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id, controller_attr_t *controller_attr; array_attr_t *array_attr; arraypart_attr_t *arraypart_attr; + disk_attr_t *disk_attr; raid_obj_id_t arraypart_obj_id; raid_lib_t *raid_lib; int i = 0, j = 0, ret, fd; @@ -3537,10 +3547,17 @@ obj_array_delete(raid_obj_tab_t *raid_tab, raid_obj_id_t array_obj_id, if (ret != SUCCESS) { return (ret); } - if (TARGET(arraypart_attr->disk_id) == - ARRAY_TARGET(array_attr->array_id) && - LUN(arraypart_attr->disk_id) == - ARRAY_LUN(array_attr->array_id)) { + + ret = obj_get_attr(raid_tab, arraypart_obj_id, + (void **)(&disk_attr)); + if (ret != SUCCESS) { + return (ret); + } + + if (array_attr->tag.idl.target_id == + disk_attr->tag.cidl.target_id && + array_attr->tag.idl.lun == + disk_attr->tag.cidl.target_id) { arraypart_obj_id = obj_get_sibling(raid_tab, arraypart_obj_id); continue; diff --git a/usr/src/lib/libraidcfg/common/raidcfg_spi.h b/usr/src/lib/libraidcfg/common/raidcfg_spi.h index 62c23fb42a..8b92450dd3 100644 --- a/usr/src/lib/libraidcfg/common/raidcfg_spi.h +++ b/usr/src/lib/libraidcfg/common/raidcfg_spi.h @@ -145,15 +145,6 @@ extern "C" { #define DISK_PRODUCT_LEN 16 #define DISK_REV_LEN 4 -#define DISK_ID(c, id, l) ((c) << 7 | (l) << 4 | (id)) -#define BUS(disk_id) ((disk_id) >> 7) -#define TARGET(disk_id) ((disk_id) & 0xf) -#define LUN(disk_id) (((disk_id) >> 4) & 0x7) - -#define ARRAY_ID(id, l) ((l) << 16 | (id)) -#define ARRAY_TARGET(array_id) ((array_id) & 0xffff) -#define ARRAY_LUN(array_id) ((array_id) >> 16) - #define RDCFG_PLUGIN_V1 0x10000 #define CFGDIR "/dev/cfg" #define MAX_PATH_LEN 255 |