[Iprdd-commit] iprutils iprconfig.8, 1.18, 1.19 iprconfig.c, 1.132, 1.133 iprlib.c, 1.115, 1.116 ip
Brought to you by:
brking
|
From: Brian K. <br...@us...> - 2007-09-04 21:05:13
|
Update of /cvsroot/iprdd/iprutils In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv15698 Modified Files: iprconfig.8 iprconfig.c iprlib.c iprlib.h version.mk Log Message: Add support for settings dual adapter HA mode Index: version.mk =================================================================== RCS file: /cvsroot/iprdd/iprutils/version.mk,v retrieving revision 1.64 retrieving revision 1.65 diff -u -d -r1.64 -r1.65 --- version.mk 21 Aug 2007 18:56:01 -0000 1.64 +++ version.mk 4 Sep 2007 21:05:12 -0000 1.65 @@ -8,7 +8,7 @@ IPR_MINOR_RELEASE=2 IPR_FIX_LEVEL=7 IPR_RELEASE=1 -IPR_FIX_DATE=(June 21, 2007) +IPR_FIX_DATE=(August 31, 2007) IPR_VERSION_STR=$(IPR_MAJOR_RELEASE).$(IPR_MINOR_RELEASE).$(IPR_FIX_LEVEL) $(IPR_FIX_DATE) Index: iprlib.c =================================================================== RCS file: /cvsroot/iprdd/iprutils/iprlib.c,v retrieving revision 1.115 retrieving revision 1.116 diff -u -d -r1.115 -r1.116 --- iprlib.c 1 May 2007 21:56:18 -0000 1.115 +++ iprlib.c 4 Sep 2007 21:05:10 -0000 1.116 @@ -3366,6 +3366,42 @@ sense_data, timeout_in_sec, 0); }; +int ipr_set_ha_mode(struct ipr_ioa *ioa, int gscsi_only_ha) +{ + int rc, len; + struct sense_data_t sense_data; + struct ipr_config_term_hdr *hdr; + struct ipr_subsys_config_term *term; + struct ipr_mode_pages pages; + struct ipr_mode_page25 *page; + + memset(&sense_data, 0, sizeof(sense_data)); + rc = mode_sense(&ioa->ioa, 0x25, &pages, &sense_data); + + if (!rc) { + page = (struct ipr_mode_page25 *)(pages.data + pages.hdr.block_desc_len); + + for_each_page25_term(hdr, page) { + if (hdr->term_id != IPR_SUBSYS_CONFIG_TERM_ID) + continue; + + term = (struct ipr_subsys_config_term *)hdr; + if (gscsi_only_ha) + term->config = IPR_GSCSI_ONLY_HA_SUBSYS; + else + term->config = IPR_AFDASD_SUBSYS; + + len = pages.hdr.length + 1; + pages.hdr.length = 0; + + return ipr_mode_select(&ioa->ioa, &pages, len); + } + + } + + return rc; +} + int ipr_set_preferred_primary(struct ipr_ioa *ioa, int preferred_primary) { int fd, rc; @@ -3417,6 +3453,22 @@ return 0; } +int set_ha_mode(struct ipr_ioa *ioa, int gscsi_only) +{ + char temp[100]; + int reset_needed = (gscsi_only != ioa->in_gscsi_only_ha); + + sprintf(temp, "%d", gscsi_only); + if (ipr_set_ha_mode(ioa, gscsi_only)) + return -EIO; + ipr_save_ioa_attr(ioa, IPR_GSCSI_HA_ONLY, temp, 1); + + if (reset_needed) + ipr_reset_adapter(ioa); + + return 0; +} + int get_scsi_dev_data(struct scsi_dev_data **scsi_dev_ref) { int num_devs = 0; @@ -3652,6 +3704,39 @@ sprintf(buf, "Unknown (%d)", state); } +static void get_subsys_config(struct ipr_ioa *ioa) +{ + int rc; + struct ipr_mode_pages pages; + struct ipr_mode_page25 *page; + struct ipr_config_term_hdr *hdr; + struct ipr_subsys_config_term *term; + struct sense_data_t sense_data; + + ioa->in_gscsi_only_ha = 0; + + if (!ioa->gscsi_only_ha) + return; + + memset(&sense_data, 0, sizeof(sense_data)); + rc = mode_sense(&ioa->ioa, 0x25, &pages, &sense_data); + + if (!rc) { + page = (struct ipr_mode_page25 *)(pages.data + pages.hdr.block_desc_len); + + for_each_page25_term(hdr, page) { + if (hdr->term_id != IPR_SUBSYS_CONFIG_TERM_ID) + continue; + + term = (struct ipr_subsys_config_term *)hdr; + if (term->config == IPR_GSCSI_ONLY_HA_SUBSYS) + ioa->in_gscsi_only_ha = 1; + return; + } + } + +} + static void get_dual_ioa_state(struct ipr_ioa *ioa) { int rc; @@ -3726,6 +3811,8 @@ ioa->is_aux_cache = 1; if (ioa_cap.can_attach_to_aux_cache && ioa_cap.is_dual_wide) ioa->protect_last_bus = 1; + if (ioa_cap.gscsi_only_ha) + ioa->gscsi_only_ha = 1; } } else ioa->ioa_dead = 1; @@ -3870,6 +3957,7 @@ get_ioa_cap(ioa); get_dual_ioa_state(ioa); + get_subsys_config(ioa); /* Get Query Array Config Data */ rc = ipr_query_array_config(ioa, allow_rebuild_refresh, 0, 0, qac_data); @@ -4423,6 +4511,7 @@ struct ipr_dual_ioa_entry *ioa_entry; attr->preferred_primary = 0; + attr->gscsi_only_ha = ioa->in_gscsi_only_ha; if (!ioa->dual_raid_support) return 0; @@ -4463,6 +4552,9 @@ rc = ipr_get_saved_ioa_attr(ioa, IPR_DA_PREFERRED_PRIMARY, temp); if (rc == RC_SUCCESS) sscanf(temp, "%d", &attr->preferred_primary); + rc = ipr_get_saved_ioa_attr(ioa, IPR_GSCSI_HA_ONLY, temp); + if (rc == RC_SUCCESS) + sscanf(temp, "%d", &attr->gscsi_only_ha); return 0; } @@ -4526,7 +4618,18 @@ ipr_save_ioa_attr(ioa, IPR_DA_PREFERRED_PRIMARY, temp, 1); } + if (attr->gscsi_only_ha != old_attr.gscsi_only_ha) { + sprintf(temp, "%d", attr->gscsi_only_ha); + + if (ipr_set_ha_mode(ioa, attr->gscsi_only_ha)) + return -EIO; + if (save) + ipr_save_ioa_attr(ioa, IPR_GSCSI_HA_ONLY, temp, 1); + ipr_reset_adapter(ioa); + } + get_dual_ioa_state(ioa); + get_subsys_config(ioa); return 0; } @@ -5921,11 +6024,17 @@ static void init_ioa_dev(struct ipr_dev *dev) { struct ipr_scsi_buses buses; + struct ipr_ioa_attr attr; if (!dev->ioa) return; if (polling_mode && !dev->ioa->should_init) return; + if (ipr_get_ioa_attr(dev->ioa, &attr)) + return; + ipr_modify_ioa_attr(dev->ioa, &attr); + if (ipr_set_ioa_attr(dev->ioa, &attr, 1)) + return; if (ipr_get_bus_attr(dev->ioa, &buses)) return; ipr_modify_bus_attr(dev->ioa, &buses); Index: iprlib.h =================================================================== RCS file: /cvsroot/iprdd/iprutils/iprlib.h,v retrieving revision 1.98 retrieving revision 1.99 diff -u -d -r1.98 -r1.99 --- iprlib.h 1 May 2007 21:56:18 -0000 1.98 +++ iprlib.h 4 Sep 2007 21:05:11 -0000 1.99 @@ -958,6 +958,7 @@ #define IPR_CATEGORY_IOA "Adapter" #define IPR_DA_PREFERRED_PRIMARY "PREFERRED_PRIMARY" +#define IPR_GSCSI_HA_ONLY "JBOD_ONLY_HA" #define IPR_CATEGORY_BUS "Bus" #define IPR_QAS_CAPABILITY "QAS_CAPABILITY" @@ -1091,6 +1092,7 @@ struct ipr_ioa_attr { int preferred_primary; + int gscsi_only_ha; }; #define IPR_DEV_MAX_PATHS 2 @@ -1145,6 +1147,8 @@ u8 should_init:1; u8 is_aux_cache:1; u8 protect_last_bus:1; + u8 gscsi_only_ha:1; + u8 in_gscsi_only_ha:1; enum ipr_tcq_mode tcq_mode; u16 pci_vendor; u16 pci_device; @@ -1301,6 +1305,32 @@ #endif }; +struct ipr_config_term_hdr { + u8 term_id; + u8 len; +}; + +struct ipr_subsys_config_term { + struct ipr_config_term_hdr hdr; +#define IPR_SUBSYS_CONFIG_TERM_ID 0x02 + u8 config; +#define IPR_AFDASD_SUBSYS 0x00 +#define IPR_GSCSI_ONLY_HA_SUBSYS 0x01 + u8 reserved; +}; + +struct ipr_mode_page25 { + struct ipr_mode_page_hdr hdr; + u8 reserved[2]; + struct ipr_config_term_hdr term; + u8 data[256]; +}; + +#define for_each_page25_term(hdr, page) \ +for (hdr = &(page)->term; \ + (char *)hdr < ((char *)(page) + (page)->hdr.page_length + sizeof((page)->hdr)); \ + hdr = (struct ipr_config_term_hdr *)((char *)hdr + (hdr)->len + sizeof(*hdr))) + struct ipr_mode_page_28_header { struct ipr_mode_page_hdr header; u8 num_dev_entries; @@ -1439,7 +1469,8 @@ u8 reserved1; u8 page_length; u8 ascii_len; - u8 reserved2[3]; + u8 reserved2; + u8 sis_version[2]; #if defined (__BIG_ENDIAN_BITFIELD) u8 dual_ioa_raid:1; u8 dual_ioa_wcache:1; @@ -1448,7 +1479,8 @@ u8 can_attach_to_aux_cache:1; u8 is_aux_cache:1; u8 is_dual_wide:1; - u8 reserved3:5; + u8 gscsi_only_ha:1; + u8 reserved3:4; u8 reserved4[2]; #elif defined (__LITTLE_ENDIAN_BITFIELD) @@ -1456,7 +1488,8 @@ u8 dual_ioa_wcache:1; u8 dual_ioa_raid:1; - u8 reserved3:5; + u8 reserved3:4; + u8 gscsi_only_ha:1; u8 is_dual_wide:1; u8 is_aux_cache:1; u8 can_attach_to_aux_cache:1; @@ -1943,6 +1976,7 @@ int sg_ioctl(int, u8 *, void *, u32, u32, struct sense_data_t *, u32); int sg_ioctl_noretry(int, u8 *, void *, u32, u32, struct sense_data_t *, u32); int ipr_set_preferred_primary(struct ipr_ioa *, int); +int set_ha_mode(struct ipr_ioa *, int); int set_preferred_primary(struct ipr_ioa *, int); void check_current_config(bool); int num_device_opens(int, int, int, int); Index: iprconfig.8 =================================================================== RCS file: /cvsroot/iprdd/iprutils/iprconfig.8,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- iprconfig.8 26 Apr 2007 19:55:10 -0000 1.18 +++ iprconfig.8 4 Sep 2007 21:05:10 -0000 1.19 @@ -122,10 +122,15 @@ .B 6. Work with disk configuration is used to change configurable disk attributes, such as queue depth. .PP -.B 7. Download microcode +.B 7. Work with adapter configuration +is used to change configurable adapter attributes, such as dual adapter settings. +Refer to the following command line options: primary, secondary, query-ha-mode, +and set-ha-mode for more information regarding these settings. +.PP +.B 8. Download microcode is used to download microcode to ipr adapters and attached SCSI disks. .PP -.B 8. Analyze Log +.B 9. Analyze Log is an option available to analyze /var/log/messages* files. By default it will use vi as the editor to open the concatenated error log files. This can be changed by using option 6 on the @@ -574,7 +579,34 @@ .B preferred primary adapter. Example: .br -.B iprconfig -c set-all-secondary +.B iprconfig -c set-all-secondary +.TP +.B query-ha-mode [IOA] +.br +When an adapter is configured in a highly available dual adapter configuration, +it may be able to be configured in one of two ways. The default mode is +.B Normal. +This mode is used for all SCSI adapters and many SAS adapters. +Some SAS adapters also support a +.B JBOD +dual adapter configuration. This mode is to be used when the dual adapter +configuration is to consist of JBOD disks rather than RAID arrays. If the adapter +is +.B NOT +going to be used in a dual adapter configuration, this mode +.B MUST +be set to +.B Normal. +Example: +.br +.B iprconfig -c query-ha-mode sg5 +.TP +.B set-ha-mode [IOA] [Normal | RAID] +Used to set the high-availability mode of the adapter. Refer to the +.B query-ha-mode +command for more information regarding these settings. Example: +.br +.B iprconfig -c set-ha-mode sg5 Normal .RE .TP .B \-\-version Index: iprconfig.c =================================================================== RCS file: /cvsroot/iprdd/iprutils/iprconfig.c,v retrieving revision 1.132 retrieving revision 1.133 diff -u -d -r1.132 -r1.133 --- iprconfig.c 26 Apr 2007 13:32:30 -0000 1.132 +++ iprconfig.c 4 Sep 2007 21:05:10 -0000 1.133 @@ -7763,7 +7763,7 @@ for_each_ioa(ioa) { if (ioa->ioa.scsi_dev_data == NULL) continue; - if (!ioa->dual_raid_support) + if (!ioa->dual_raid_support && !ioa->gscsi_only_ha) continue; print_dev(k, &ioa->ioa, buffer, "%1", k); @@ -7800,6 +7800,7 @@ struct ioa_config_attr { int option; int preferred_primary; + int gscsi_only_ha; }; int ioa_config_menu(struct ioa_config_attr *ioa_config_attr, @@ -7818,20 +7819,28 @@ same line as the field in which the menu is opened for*/ start_row += 2; /* for title */ /* FIXME */ - if (ioa_config_attr->option == 1) { + if (ioa_config_attr->option == 1 || ioa_config_attr->option == 2) { num_menu_items = 2; menu_item = malloc(sizeof(ITEM **) * (num_menu_items + 1)); userptr = malloc(sizeof(int) * num_menu_items); menu_index = 0; - menu_item[menu_index] = new_item("None",""); + if (ioa_config_attr->option == 1) + menu_item[menu_index] = new_item("None",""); + else + menu_item[menu_index] = new_item("RAID",""); + userptr[menu_index] = 0; set_item_userptr(menu_item[menu_index], (char *)&userptr[menu_index]); menu_index++; - menu_item[menu_index] = new_item("Primary",""); + if (ioa_config_attr->option == 1) + menu_item[menu_index] = new_item("Primary",""); + else + menu_item[menu_index] = new_item("JBOD",""); + userptr[menu_index] = 1; set_item_userptr(menu_item[menu_index], (char *)&userptr[menu_index]); @@ -7839,8 +7848,12 @@ menu_item[menu_index] = (ITEM *)NULL; rc = display_menu(menu_item, start_row, menu_index, &retptr); - if (rc == RC_SUCCESS) - ioa_config_attr->preferred_primary = *retptr; + if (rc == RC_SUCCESS) { + if (ioa_config_attr->option == 1) + ioa_config_attr->preferred_primary = *retptr; + else + ioa_config_attr->gscsi_only_ha = *retptr; + } i = 0; while (menu_item[i] != NULL) @@ -7866,7 +7879,7 @@ struct ioa_config_attr ioa_config_attr[3]; struct ioa_config_attr *config_attr = NULL; struct ipr_ioa_attr ioa_attr; - int header_lines = 0; + int header_lines = 0, index = 0; char *body = NULL; struct screen_output *s_out; @@ -7901,14 +7914,27 @@ body = add_line_to_body(body, buffer, NULL); header_lines += 2; - body = add_line_to_body(body,_("Preferred Dual Adapter State"), "%13"); - ioa_config_attr[0].option = 1; - ioa_config_attr[0].preferred_primary = ioa_attr.preferred_primary; - if (ioa_attr.preferred_primary) - sprintf(pref_str, "Primary"); - else - sprintf(pref_str, "None"); - i_con = add_i_con(i_con, pref_str, &ioa_config_attr[0]); + if (dev->ioa->dual_raid_support) { + body = add_line_to_body(body,_("Preferred Dual Adapter State"), "%13"); + ioa_config_attr[index].option = 1; + ioa_config_attr[index].preferred_primary = ioa_attr.preferred_primary; + if (ioa_attr.preferred_primary) + sprintf(pref_str, "Primary"); + else + sprintf(pref_str, "None"); + i_con = add_i_con(i_con, pref_str, &ioa_config_attr[index++]); + } + + if (dev->ioa->gscsi_only_ha) { + body = add_line_to_body(body,_("High-Availability Mode"), "%13"); + ioa_config_attr[index].option = 2; + ioa_config_attr[index].gscsi_only_ha = ioa_attr.gscsi_only_ha; + if (ioa_attr.gscsi_only_ha) + sprintf(pref_str, "JBOD"); + else + sprintf(pref_str, "Normal"); + i_con = add_i_con(i_con, pref_str, &ioa_config_attr[index++]); + } n_change_ioa_config.body = body; while (1) { @@ -7930,6 +7956,12 @@ else sprintf(temp_i_con->field_data, "None"); ioa_attr.preferred_primary = config_attr->preferred_primary; + } else if (config_attr->option == 2) { + if (config_attr->gscsi_only_ha) + sprintf(temp_i_con->field_data, "JBOD"); + else + sprintf(temp_i_con->field_data, "Normal"); + ioa_attr.gscsi_only_ha = config_attr->gscsi_only_ha; } found++; break; @@ -11366,6 +11398,35 @@ return 0; } +static int get_ha_mode(char **args, int num_args) +{ + struct ipr_dev *dev = find_gen_dev(args[0]); + + if (!dev) + return -ENXIO; + + if (dev->ioa->in_gscsi_only_ha) + printf("JBOD\n"); + else + printf("Normal\n"); + return 0; +} + +static int __set_ha_mode(char **args, int num_args) +{ + struct ipr_dev *dev = find_gen_dev(args[0]); + + if (!dev) + return -ENXIO; + + if (!strncasecmp(args[1], "Normal", 4)) + return set_ha_mode(dev->ioa, 0); + else if (!strncasecmp(args[1], "JBOD", 4)) + return set_ha_mode(dev->ioa, 1); + + return -EINVAL; +} + static int __set_preferred_primary(char *sg_name, int preferred_primary) { struct ipr_dev *dev = find_gen_dev(sg_name); @@ -11460,6 +11521,8 @@ { "secondary", 1, 0, 1, set_secondary, "sg5" }, { "set-all-primary", 0, 0, 0, set_all_primary, "" }, { "set-all-secondary", 0, 0, 0, set_all_secondary, "" }, + { "query-ha-mode", 1, 0, 1, get_ha_mode, "sg5" }, + { "set-ha-mode", 2, 0, 2, __set_ha_mode, "sg5 [Normal | JBOD]" }, { "raid-create", 1, 1, 0, raid_create, "-r 5 -s 64 sda sdb sg6 sg7" }, { "raid-delete", 1, 0, 1, raid_delete, "sdb" }, { "raid-include", 2, 0, 17, raid_include_cmd, "sda sg6 sg7" }, |