summaryrefslogtreecommitdiff
path: root/usr/src/lib
diff options
context:
space:
mode:
authoryw161884 <none@none>2007-12-03 21:10:45 -0800
committeryw161884 <none@none>2007-12-03 21:10:45 -0800
commite7dcc4f88a44295346fce0b9eb3d10eb1c442c0f (patch)
treef597afab9854d8604a5e3f023b4539cdadf70d3a /usr/src/lib
parentfebcc4a52c3ed7fe3a106da2c2ba52c56afd5111 (diff)
downloadillumos-joyent-e7dcc4f88a44295346fce0b9eb3d10eb1c442c0f.tar.gz
PSARC 2007/667 RaidCfg disk_id adjustment
6579042 raidctl cannot support disks with large target number
Diffstat (limited to 'usr/src/lib')
-rw-r--r--usr/src/lib/libraidcfg/common/raidcfg.c33
-rw-r--r--usr/src/lib/libraidcfg/common/raidcfg_spi.h9
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