Hello community,
here is the log from the commit of package iprutils
checked in at Mon Sep 29 17:43:25 CEST 2008.
--------
--- iprutils/iprutils.changes 2008-08-29 12:55:30.000000000 +0200
+++ /mounts/work_src_done/STABLE/iprutils/iprutils.changes 2008-09-29 15:19:44.000000000 +0200
@@ -1,0 +2,6 @@
+Mon Sep 29 15:12:30 CEST 2008 - olh@suse.de
+
+- update iprutils to version 2.2.11 (bnc#417522 - FATE#304156 - LTC47076)
+ Add support for the active-active functionality.
+
+-------------------------------------------------------------------
Old:
----
iprutils-2.2.10-src.tar.bz2
iprutils.iprlib.patch
iprutils.uninitialized.patch
New:
----
iprutils-2.2.11-src.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ iprutils.spec ++++++
--- /var/tmp/diff_new_pack.h32319/_old 2008-09-29 17:41:39.000000000 +0200
+++ /var/tmp/diff_new_pack.h32319/_new 2008-09-29 17:41:39.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package iprutils (Version 2.2.10)
+# spec file for package iprutils (Version 2.2.11)
#
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
@@ -21,8 +21,8 @@
Name: iprutils
BuildRequires: ncurses-devel pciutils-devel sysfsutils
Summary: Utilities for the IBM Power Linux RAID Adapters
-Version: 2.2.10
-Release: 3
+Version: 2.2.11
+Release: 1
License: Other uncritical OpenSource License
Url: http://sourceforge.net/projects/iprdd/
Group: Hardware/Other
@@ -33,8 +33,6 @@
Patch0: iprconfig.usr-sbin.patch
Patch1: iprutils.install-man.patch
Patch2: iprutils.runlevel.patch
-Patch3: iprutils.uninitialized.patch
-Patch4: iprutils.iprlib.patch
%description
Provides a suite of utilities to manage and configure SCSI devices
@@ -44,15 +42,13 @@
Authors:
--------
- Brian King @ IBM
+ Wayne Boyer
%prep
%setup -q -n iprutils
%patch0 -p1
%patch1 -p1
%patch2 -p1
-%patch3 -p1
-%patch4 -p1
%build
make %{?jobs:-j%jobs} CFLAGS="$RPM_OPT_FLAGS -I/usr/include/ncurses \$(IPR_DEFINES)"
@@ -92,6 +88,9 @@
%attr(755,root,root) /etc/init.d/*
%changelog
+* Mon Sep 29 2008 olh@suse.de
+- update iprutils to version 2.2.11 (bnc#417522 - FATE#304156 - LTC47076)
+ Add support for the active-active functionality.
* Fri Aug 29 2008 olh@suse.de
- fix an uninitialized but unused variable
- move defines in iprlib.h out of bigendian section
++++++ iprutils-2.2.10-src.tar.bz2 -> iprutils-2.2.11-src.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/iprutils/iprconfig.8 new/iprutils/iprconfig.8
--- old/iprutils/iprconfig.8 2008-07-21 05:24:39.000000000 +0200
+++ new/iprutils/iprconfig.8 2008-09-26 22:33:06.000000000 +0200
@@ -1,4 +1,4 @@
-.\" (C) Copyright 2000, 2004
+.\" (C) Copyright 2000, 2008
.\" International Business Machines Corporation and others.
.\" All Rights Reserved. This program and the accompanying
.\" materials are made available under the terms of the
@@ -60,17 +60,32 @@
or are formatted for JBOD function and are in the Format Required state
will be available for this function.
.PP
-.B Create a hot spare
-is used to designate a device as a dedicated hot spare.
-.PP
-.B Delete a hot spare
-is used to unconfigure a previously configured hot spare.
+.B Work with hot spares
+is used to create a hot spare which designates a device as a dedicated hot
+spare. It is also used to delete a hot spare which unconfigures a previously
+configured hot spare.
+.\".B Create a hot spare
+.\"is used to designate a device as a dedicated hot spare.
+.\".PP
+.\".B Delete a hot spare
+.\"is used to unconfigure a previously configured hot spare.
+.PP
+.B Work with asymmetric access
+is used to select which path of a disk array will be the primary path in a dual
+controller environment. Asymmetric Access must be enabled on the adapter first.
+Not all adapters support asymmetric access and adapters that do provide support
+may require updated microcode.
.PP
.B Force RAID Consistency Check
is used to force a consistency check on a RAID array. All ipr adapters
continually perform background consistency checking when idle. This
option can be used to force a consistency check to be performed.
.PP
+.B Migrate disk array protection
+is used to change the RAID protection level for an array to another supported
+level. In some cases, this will require adding more disks to the array. In
+other cases, disks will be freed.
+.PP
.B 3. Work with disk unit recovery
is used to perform the following disk unit recovery actions:
.PP
@@ -123,9 +138,10 @@
is used to change configurable disk attributes, such as queue depth.
.PP
.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.
+is used to change configurable adapter attributes, such as dual adapter
+settings. Refer to the following command line options: primary, secondary,
+query-ha-mode, set-ha-mode, set-ioa-asymmetric-access and
+set-array-asymmetric-access for more information regarding these settings.
.PP
.B 8. Download microcode
is used to download microcode to ipr adapters and attached SCSI disks.
@@ -391,6 +407,23 @@
required, the maximum number of devices allowed and the multiple of the number
of devices required for a migration that requires more devices.
.TP
+.B query-ioas-asymmetric-access
+.br
+Show the IOAs that support asymmetric access.
+.TP
+.B query-arrays-asymmetric-access
+.br
+Show the disk arrays that are candidates for setting their asymmetric access
+mode to Optimized or Non-Optimized.
+.TP
+.B query-ioa-asymmetric-access-mode [IOA]
+.br
+Show the current asymmetric access mode for the given IOA.
+.TP
+.B query-array-asymmetric-access-mode [array]
+.br
+Show the current asymmetric access mode for the given disk array.
+.TP
.B raid-create [-r raid_level] [-s stripe_size_in_kb] [devices...]
Create a RAID array. RAID level can be any supported RAID level for the given
adapter, such as 0, 10, 5, 6. Currently supported stripe sizes in kb
@@ -641,6 +674,16 @@
command for more information regarding these settings. Example:
.br
.B iprconfig -c set-ha-mode sg5 Normal
+.TP
+.B set-array-asymmetric-access-mode [array] [Optimized | Non-Optimized]
+Used to set the asymmetric access mode of the disk array. Example:
+.br
+.B iprconfig -c set-array-asymmetric-access-mode sda Optimized
+.TP
+.B set-ioa-asymmetric-access-mode [IOA] [Enabled | Disabled]
+Used to set the asymmetric access mode of the IOA. Example:
+.br
+.B iprconfig -c set-ioa-asymmetric-access-mode sg5 Enabled
.RE
.TP
.B \-\-version
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/iprutils/iprconfig.c new/iprutils/iprconfig.c
--- old/iprutils/iprconfig.c 2008-08-13 00:53:22.000000000 +0200
+++ new/iprutils/iprconfig.c 2008-09-26 22:33:09.000000000 +0200
@@ -2014,6 +2014,14 @@
}
}
+ if (dev->ioa->asymmetric_access) {
+ body = add_line_to_body(body,"", NULL);
+ if (dev->ioa->asymmetric_access_enabled)
+ body = add_line_to_body(body,_("Current Asymmetric Access State"), _("Enabled"));
+ else
+ body = add_line_to_body(body,_("Current Asymmetric Access State"), _("Disabled"));
+ }
+
return body;
}
@@ -2417,6 +2425,38 @@
#define IPR_RMV_HOT_SPARE 1
/**
+* hot_spare_screen - Display choices for working with hot spares.
+* @i_con: i_container struct
+*
+* Returns:
+* 0 if success / non-zero on failure
+**/
+int hot_spare_screen(i_container *i_con)
+{
+ int rc;
+ struct screen_output *s_out;
+ int loop;
+
+ free_raid_cmds();
+
+ for (loop = 0; loop < n_hot_spare_screen.num_opts; loop++) {
+ n_hot_spare_screen.body =
+ ipr_list_opts(n_hot_spare_screen.body,
+ n_hot_spare_screen.options[loop].key,
+ n_hot_spare_screen.options[loop].list_str);
+ }
+
+ n_hot_spare_screen.body = ipr_end_list(n_hot_spare_screen.body);
+
+ s_out = screen_driver(&n_hot_spare_screen,0,NULL);
+ free(n_hot_spare_screen.body);
+ n_hot_spare_screen.body = NULL;
+ rc = s_out->rc;
+ free(s_out);
+ return rc;
+}
+
+/**
* raid_screen -
* @i_con: i_container struct
*
@@ -4356,7 +4396,6 @@
struct screen_output *s_out;
int toggle = 1;
int header_lines;
- i_container *i_con;
body_init_status(buffer, n_confirm_raid_migrate.header, &header_lines);
@@ -4374,7 +4413,7 @@
do {
n_confirm_raid_migrate.body = buffer[toggle&1];
- s_out = screen_driver(&n_confirm_raid_migrate, header_lines, i_con);
+ s_out = screen_driver(&n_confirm_raid_migrate, header_lines, NULL);
rc = s_out->rc;
free(s_out);
toggle++;
@@ -5008,6 +5047,45 @@
}
/**
+ * asym_access - GUI routine for setting array asymmetric access.
+ * @i_con: i_container struct
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+int asym_access(i_container *i_con)
+{
+ int rc;
+ int found = 0;
+ char *buffer[2];
+ struct screen_output *s_out;
+ int header_lines;
+
+ processing();
+
+ /* make sure the i_con list is empty */
+ i_con = free_i_con(i_con);
+
+ rc = RC_SUCCESS;
+
+ body_init_status(buffer, n_asym_access.header, &header_lines);
+
+ if (!found) {
+ n_asym_access_fail.body = body_init(n_asym_access_fail.header, NULL);
+ s_out = screen_driver(&n_asym_access_fail, 0, i_con);
+
+ free(n_asym_access_fail.body);
+ n_asym_access_fail.body = NULL;
+
+ rc = s_out->rc | CANCEL_FLAG;
+ free(s_out);
+ } else
+ rc = 1; //process_asym_access(buffer, header_lines);
+
+ return rc;
+}
+
+/**
* raid_include -
* @i_con: i_container struct
*
@@ -9806,6 +9884,7 @@
int option;
int preferred_primary;
int gscsi_only_ha;
+ int active_active;
};
/**
@@ -9833,16 +9912,19 @@
same line as the field in which the menu is opened for*/
start_row += 2; /* for title */ /* FIXME */
- if (ioa_config_attr->option == 1 || ioa_config_attr->option == 2) {
- num_menu_items = 2;
+ if (ioa_config_attr->option == 1 || ioa_config_attr->option == 2
+ || ioa_config_attr->option == 3) {
+ num_menu_items = 3;
menu_item = malloc(sizeof(ITEM **) * (num_menu_items + 1));
userptr = malloc(sizeof(int) * num_menu_items);
menu_index = 0;
if (ioa_config_attr->option == 1)
menu_item[menu_index] = new_item("None","");
- else
+ else if (ioa_config_attr->option == 2)
menu_item[menu_index] = new_item("RAID","");
+ else
+ menu_item[menu_index] = new_item("Disabled","");
userptr[menu_index] = 0;
set_item_userptr(menu_item[menu_index],
@@ -9852,8 +9934,10 @@
if (ioa_config_attr->option == 1)
menu_item[menu_index] = new_item("Primary","");
- else
+ else if (ioa_config_attr->option == 2)
menu_item[menu_index] = new_item("JBOD","");
+ else
+ menu_item[menu_index] = new_item("Enabled","");
userptr[menu_index] = 1;
set_item_userptr(menu_item[menu_index],
@@ -9865,8 +9949,10 @@
if (rc == RC_SUCCESS) {
if (ioa_config_attr->option == 1)
ioa_config_attr->preferred_primary = *retptr;
- else
+ else if (ioa_config_attr->option == 2)
ioa_config_attr->gscsi_only_ha = *retptr;
+ else
+ ioa_config_attr->active_active = *retptr;
}
i = 0;
@@ -9928,7 +10014,7 @@
i_con_head_saved = i_con_head; /* FIXME */
i_con_head = i_con = NULL;
- body = body_init(n_change_disk_config.header, &header_lines);
+ body = body_init(n_change_ioa_config.header, &header_lines);
sprintf(buffer, "Adapter: %s/%d %s %s\n", dev->ioa->pci_address,
dev->ioa->host_num, dev->scsi_dev_data->vendor_id,
dev->scsi_dev_data->product_id);
@@ -9956,6 +10042,16 @@
sprintf(pref_str, "Normal");
i_con = add_i_con(i_con, pref_str, &ioa_config_attr[index++]);
}
+ if (dev->ioa->asymmetric_access) {
+ body = add_line_to_body(body,_("Active/Active Mode"), "%13");
+ ioa_config_attr[index].option = 3;
+ ioa_config_attr[index].active_active = ioa_attr.active_active;
+ if (ioa_attr.active_active)
+ sprintf(pref_str, "Enabled");
+ else
+ sprintf(pref_str, "Disabled");
+ i_con = add_i_con(i_con, pref_str, &ioa_config_attr[index++]);
+ }
n_change_ioa_config.body = body;
while (1) {
@@ -9983,6 +10079,12 @@
else
sprintf(temp_i_con->field_data, "Normal");
ioa_attr.gscsi_only_ha = config_attr->gscsi_only_ha;
+ } else if (config_attr->option == 3) {
+ if (config_attr->active_active)
+ sprintf(temp_i_con->field_data, "Enabled");
+ else
+ sprintf(temp_i_con->field_data, "Disabled");
+ ioa_attr.active_active = config_attr->active_active;
}
found++;
break;
@@ -11112,6 +11214,10 @@
sprintf(buf, "Degraded");
else if (res_state.degraded_oper || res_state.service_req)
sprintf(buf, "Degraded");
+ else if ((dev->ioa->asymmetric_access &&
+ dev->array_rcd->current_asym_access_state == IPR_ACTIVE_OPTIMIZED)
+ || (!dev->ioa->is_secondary && !dev->ioa->asymmetric_access))
+ sprintf(buf, "Optimized");
else
sprintf(buf, "Active");
} else if (format_req)
@@ -14276,6 +14382,128 @@
}
/**
+ * query_ioas_asym_access - Show the ioas that support asymmetric access.
+ * @args: argument vector
+ * @num_args: number of arguments
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+static int query_ioas_asym_access(char **args, int num_args)
+{
+ int hdr = 0;
+ struct ipr_ioa *ioa;
+
+ for_each_ioa(ioa) {
+ if (!ioa->asymmetric_access);
+ continue;
+ if (!hdr) {
+ hdr = 1;
+ printf("%s\n%s\n", status_hdr[3], status_sep[3]);
+ }
+ printf_device(&ioa->ioa, 1);
+ }
+ return 0;
+}
+
+/**
+ * query_arrays_asym_access - Show the arrays that support asymmetric access.
+ * @args: argument vector
+ * @num_args: number of arguments
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+static int query_arrays_asym_access(char **args, int num_args)
+{
+ int hdr = 0;
+ struct ipr_ioa *ioa;
+ struct ipr_dev *vset;
+
+ for_each_ioa(ioa) {
+ if (!ioa->asymmetric_access || !ioa->asymmetric_access_enabled)
+ continue;
+ for_each_vset(ioa, vset) {
+ if (!vset->array_rcd->asym_access_cand)
+ continue;
+ if (!hdr) {
+ hdr = 1;
+ printf("%s\n%s\n", status_hdr[3], status_sep[3]);
+ }
+ printf_device(vset, 1);
+ }
+ }
+ return 0;
+}
+
+/**
+ * query_ioa_asym_access_mode - Show the current asymmetric access state for
+ * the given IOA.
+ * @args: argument vector
+ * @num_args: number of arguments
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+static int query_ioa_asym_access_mode(char **args, int num_args)
+{
+ struct ipr_dev *dev;
+
+ dev = find_dev(args[0]);
+ if (!dev) {
+ fprintf(stderr, "Cannot find %s\n", args[0]);
+ return -EINVAL;
+ }
+ if (dev != &dev->ioa->ioa) {
+ fprintf(stderr, "%s is not an IOA.\n", args[0]);
+ return -EINVAL;
+ }
+
+ if (dev->ioa->asymmetric_access_enabled)
+ printf("Enabled\n");
+ else if (dev->ioa->asymmetric_access)
+ printf("Disabled\n");
+ else
+ printf("Unsupported\n");
+
+ return 0;
+}
+
+/**
+ * query_array_asym_access_mode - Show the current asymmetric access state for
+ * the given array.
+ * @args: argument vector
+ * @num_args: number of arguments
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+static int query_array_asym_access_mode(char **args, int num_args)
+{
+ struct ipr_dev *vset;
+
+ vset = find_dev(args[0]);
+ if (!vset) {
+ fprintf(stderr, "Cannot find %s\n", args[0]);
+ return -EINVAL;
+ }
+
+ if (!ipr_is_volume_set(vset)) {
+ fprintf(stderr, "%s is not an array.\n", vset->gen_name);
+ return -EINVAL;
+ }
+
+ if (!vset->array_rcd->asym_access_cand)
+ printf("Unsupported\n");
+ else if (vset->array_rcd->current_asym_access_state == IPR_ACTIVE_OPTIMIZED)
+ printf("Optimized\n");
+ else
+ printf("Not Optimized\n");
+
+ return 0;
+}
+
+/**
* query_format_for_jbod -
* @args: argument vector
* @num_args: number of arguments
@@ -14765,6 +14993,133 @@
return 0;
}
+/**
+ * check_and_set_active_active - Do some sanity checks and then set the
+ * active/active state to the requested mode.
+ * @dev_name: specified IOA
+ * @mode: mode to set - enable or disable
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+static int check_and_set_active_active(char *dev_name, int mode)
+{
+ struct ipr_dev *dev;
+
+ dev = find_dev(dev_name);
+ if (!dev) {
+ fprintf(stderr, "Cannot find %s\n", dev_name);
+ return -EINVAL;
+ }
+ if (dev != &dev->ioa->ioa) {
+ fprintf(stderr, "%s is not an IOA.\n", dev_name);
+ return -EINVAL;
+ }
+
+ /* Check that asymmetric access is supported by the adapter. */
+ if (!dev->ioa->asymmetric_access) {
+ ioa_err(dev->ioa, "IOA does not support asymmetric access.\n");
+ return -EINVAL;
+ }
+
+ /* Check the state of asymmetric access. */
+ if (dev->ioa->asymmetric_access_enabled == mode) {
+ ioa_dbg(dev->ioa, "Asymmetric access is already %s.\n",
+ mode == 0 ? "disabled" : "enabled");
+ return 0;
+ }
+
+ return set_active_active_mode(dev->ioa, mode);
+}
+
+/**
+ * set_ioa_asymmetric_access - Change the asymmetric access mode for an IOA.
+ * Enabling occurs by sending a change multi adapter
+ * assignment command from ipr_set_ioa_attr().
+ * Disabling occurs by sending a mode select
+ * page 24 in ipr_set_active_active_mode().
+ * @args: argument vector
+ * @num_args: number of arguments
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+static int set_ioa_asymmetric_access(char **args, int num_args)
+{
+ if (!strncasecmp(args[1], "Enable", 4))
+ return check_and_set_active_active(args[0], 1);
+ else if (!strncasecmp(args[1], "Disable", 4))
+ return check_and_set_active_active(args[0], 0);
+ return -EINVAL;
+}
+
+/**
+ * set_array_asymmetric_access - Set the desired asymmetric access state of the
+ * array to "Optimized" or "Non-Optimized".
+ *
+ * @args: argument vector
+ * @num_args: number of arguments
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+static int set_array_asymmetric_access(char **args, int num_args)
+{
+ int state;
+ struct ipr_dev *vset = NULL;
+ struct ipr_ioa *ioa = NULL;
+
+ vset = find_dev(args[0]);
+ if (!vset) {
+ fprintf(stderr, "Cannot find %s\n", args[0]);
+ return -EINVAL;
+ }
+
+ if (!ipr_is_volume_set(vset)) {
+ scsi_err(vset, "Given device is not an array.");
+ return -EINVAL;
+ }
+
+ /* Check that asymmetric access is supported by the adapter. */
+ if (!vset->ioa->asymmetric_access) {
+ ioa_err(vset->ioa, "Asymmetric access is not supported.");
+ return -EINVAL;
+ }
+
+ /* Check that asymmetric access is enabled on the adapter. */
+ if (!vset->ioa->asymmetric_access_enabled) {
+ ioa_err(vset->ioa, "Asymmetric access is not enabled.");
+ return -EINVAL;
+ }
+
+ /* Optimized or Non-optimized? */
+ if (!strncasecmp(args[1], "Optimized", 3))
+ state = IPR_ACTIVE_OPTIMIZED;
+ else if (!strncasecmp(args[1], "Non-Optimized", 3))
+ state = IPR_ACTIVE_NON_OPTIMIZED;
+ else {
+ scsi_err(vset, "Unrecognized state given for asymmetric access.");
+ return -EINVAL;
+ }
+
+ if (vset->array_rcd->saved_asym_access_state == state) {
+ scsi_dbg(vset, "Array is already set to requested state.");
+ return 0;
+ }
+
+ if (vset->array_rcd->asym_access_cand)
+ vset->array_rcd->issue_cmd = 1;
+ else {
+ scsi_err(vset, "%s is not a candidate for "
+ "asymmetric access.", vset->gen_name);
+ return -EINVAL;
+ }
+
+ vset->array_rcd->saved_asym_access_state = state;
+
+ return ipr_set_array_asym_access(vset, ioa->qac_data);
+}
+
static const struct {
char *cmd;
int min_args;
@@ -14799,6 +15154,10 @@
{ "query-raid-levels-raid-migrate", 1, 0, 1, query_raid_levels_raid_migrate, "sda" },
{ "query-stripe-sizes-raid-migrate", 2, 0, 2, query_stripe_sizes_raid_migrate, "sg5 10" },
{ "query-devices-min-max-raid-migrate", 2, 0, 2, query_devices_min_max_raid_migrate, "sg5 10" },
+ { "query-ioas-asymmetric-access", 0, 0, 0, query_ioas_asym_access, "" },
+ { "query-arrays-asymmetric-access", 0, 0, 0, query_arrays_asym_access, "" },
+ { "query-ioa-asymmetric-access-mode", 1, 0, 1, query_ioa_asym_access_mode, "sg5" },
+ { "query-array-asymmetric-access-mode", 1, 0, 1, query_array_asym_access_mode, "sda" },
{ "query-recovery-format", 0, 0, 0, query_recovery_format, "" },
{ "query-raid-rebuild", 0, 0, 0, query_raid_rebuild, "" },
{ "query-format-for-raid", 0, 0, 0, query_format_for_raid, "" },
@@ -14827,6 +15186,8 @@
{ "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]" },
+ { "set-ioa-asymmetric-access", 2, 0, 2, set_ioa_asymmetric_access, "sg5 [Enabled | Disabled]" },
+ { "set-array-asymmetric-access", 2, 0, 2, set_array_asymmetric_access, "sda [Optimized | Non-Optimized]" },
{ "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" },
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/iprutils/iprconfig.h new/iprutils/iprconfig.h
--- old/iprutils/iprconfig.h 2008-08-12 01:40:06.000000000 +0200
+++ new/iprutils/iprconfig.h 2008-09-26 22:33:13.000000000 +0200
@@ -100,6 +100,7 @@
int reclaim_result(i_container * i_con);
int af_include(i_container * i_con);
int af_remove(i_container * i_con);
+int hot_spare_screen(i_container *i_con);
int add_hot_spare(i_container * i_con);
int remove_hot_spare(i_container * i_con);
int hot_spare(i_container * i_con, int action);
@@ -109,6 +110,7 @@
int hot_spare_complete(int action);
int raid_migrate(i_container * i_con);
+int asym_access(i_container *i_con);
int raid_rebuild(i_container * i_con);
int confirm_raid_rebuild(i_container * i_con);
@@ -262,12 +264,52 @@
{raid_include, "4", __("Add a device to a disk array")},
{af_include, "5", __("Format device for RAID function")},
{af_remove, "6", __("Format device for JBOD function (512)")},
- {add_hot_spare, "7", __("Create a hot spare")},
- {remove_hot_spare, "8", __("Delete a hot spare")},
+ {hot_spare_screen, "7", __("Work with hot spares")},
+ {asym_access, "8", __("Work with asymmetric access")},
{raid_resync, "9", __("Force RAID Consistency Check")},
{raid_migrate, "0", __("Migrate disk array protection")},
};
+struct screen_opts hot_spare_opt[] = {
+ {add_hot_spare, "1", __("Create a hot spare")},
+ {remove_hot_spare, "2", __("Delete a hot spare")},
+};
+
+
+s_node n_asym_access = {
+ .rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
+ .f_flags = (EXIT_FLAG | CANCEL_FLAG | TOGGLE_FLAG | FWD_FLAG ),
+ .num_opts = NUM_OPTS(null_opt),
+ .options = &null_opt[0],
+ .title = __("Array Asymmetric Access"),
+ .header = {
+ __("Select the disk array path.\n\n"),
+ __("Type choice, press Enter.\n"),
+ __(" 1=change asymmetric access for a disk array\n\n"),
+ "" }
+};
+
+s_node n_asym_access_fail = {
+ .f_flags = (ENTER_FLAG | EXIT_FLAG | CANCEL_FLAG),
+ .title = __("Setting Array Asymmetric Access Failed"),
+ .header = {
+ __("There are no arrays eligible for the selected operation "
+ "due to one or more of the following reasons:\n\n"),
+ __("o There are no disk arrays in the system.\n"),
+ __("o An IOA is in a condition that makes the disks attached to "
+ "it read/write protected. Examine the kernel messages log "
+ "for any errors that are logged for the IO subsystem "
+ "and follow the appropriate procedure for the reference "
+ "code to correct the problem, if necessary.\n"),
+ __("o Not all disks attached to an advanced function IOA have "
+ "reported to the system. Retry the operation.\n"),
+ __("o None of the disk arrays in the system are capable of "
+ "changing asymmetric access attributes.\n"),
+ __("o An IOA needs updated microcode in order to support "
+ "active/active configurations.\n"),
+ "" }
+};
+
s_node n_raid_migrate_complete = {
.title = __("Migrate Disk Array Status"),
.body = __("You selected to migrate a disk array")
@@ -311,7 +353,7 @@
"for any errors that are logged for the IO subsystem "
"and follow the appropriate procedure for the reference "
"code to correct the problem, if necessary.\n"),
- __("o Not all disks attached to an advanced function IOA have"
+ __("o Not all disks attached to an advanced function IOA have "
"reported to the system. Retry the operation.\n"),
__("o There are not enough unused AF disks for the migration.\n"),
"" }
@@ -329,6 +371,14 @@
"" }
};
+s_node n_hot_spare_screen = {
+ .rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
+ .f_flags = (EXIT_FLAG | CANCEL_FLAG),
+ .num_opts = NUM_OPTS(hot_spare_opt),
+ .options = &hot_spare_opt[0],
+ .title = __("Work with Hot Spares")
+};
+
s_node n_raid_screen = {
.rc_flags = (EXIT_FLAG | CANCEL_FLAG | REFRESH_FLAG),
.f_flags = (EXIT_FLAG | CANCEL_FLAG),
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/iprutils/iprlib.c new/iprutils/iprlib.c
--- old/iprutils/iprlib.c 2008-08-14 02:29:20.000000000 +0200
+++ new/iprutils/iprlib.c 2008-09-26 22:54:17.000000000 +0200
@@ -10,7 +10,7 @@
*/
/*
- * $Header: /cvsroot/iprdd/iprutils/iprlib.c,v 1.117 2008/04/09 19:34:51 tsenglin Exp $
+ * $Header: /cvsroot/iprdd/iprutils/iprlib.c,v 1.120 2008/09/26 20:54:17 wboyer Exp $
*/
#ifndef iprlib_h
@@ -3625,7 +3625,48 @@
}
/**
- * get_write_buffer_dev -
+ * ipr_set_array_asym_access -
+ * @dev: ipr_dev struct
+ * @qac: ipr_array_query_data struct
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+int ipr_set_array_asym_access(struct ipr_dev *dev, struct ipr_array_query_data *qac)
+{
+ char *name = dev->gen_name;
+ struct sense_data_t sense_data;
+ u8 cdb[IPR_CCB_CDB_LEN];
+ int fd, rc;
+
+ if (strlen(name) == 0)
+ return -ENOENT;
+
+ fd = open(name, O_RDWR);
+ if (fd <= 1) {
+ if (!strcmp(tool_name, "iprconfig") || ipr_debug)
+ syslog(LOG_ERR, "Could not open %s. %m\n", name);
+ return errno;
+ }
+
+ memset(cdb, 0, IPR_CCB_CDB_LEN);
+
+ cdb[0] = IPR_SET_ARRAY_ASYMMETRIC_ACCESS;
+ cdb[7] = (sizeof(*qac) >> 8) & 0xff;
+ cdb[8] = sizeof(*qac) & 0xff;
+
+ rc = sg_ioctl(fd, cdb, qac, sizeof(*qac), SG_DXFER_TO_DEV,
+ &sense_data, IPR_ARRAY_CMD_TIMEOUT);
+
+ if (rc != 0 && sense_data.sense_key != ILLEGAL_REQUEST)
+ ioa_cmd_err(dev->ioa, &sense_data, "Set Array Asymmetric Access", rc);
+
+ close(fd);
+ return rc;
+}
+
+/**
+ * get_write_buffer_dev - FIXME - probably need to remove this routine.
* @dev: ipr dev struct
*
* Returns:
@@ -4460,14 +4501,16 @@
}
/**
- * ipr_set_preferred_primary - set the preferred primary state
+ * ipr_change_multi_adapter_assignment - set the preferred primary state and/or
+ * the asymmetric access state
* @ioa: ipr ioa struct
* @preferred_primary: set preferred primary flag
*
* Returns:
* 0 if success / non-zero on failure
**/
-int ipr_set_preferred_primary(struct ipr_ioa *ioa, int preferred_primary)
+int ipr_change_multi_adapter_assignment(struct ipr_ioa *ioa, int preferred_primary,
+ int asym_access)
{
int fd, rc;
u8 cdb[IPR_CCB_CDB_LEN];
@@ -4488,6 +4531,8 @@
cdb[0] = IPR_MAINTENANCE_OUT;
cdb[1] = IPR_CHANGE_MULTI_ADAPTER_ASSIGNMENT;
+ if (asym_access)
+ cdb[2] = IPR_PRESERVE_ASYMMETRIC_STATE;
if (preferred_primary)
cdb[3] = IPR_IOA_STATE_PRIMARY;
else
@@ -4519,7 +4564,7 @@
char temp[100];
sprintf(temp, "%d", preferred_primary);
- if (ipr_set_preferred_primary(ioa, preferred_primary))
+ if (ipr_change_multi_adapter_assignment(ioa, preferred_primary, IPR_PRESERVE_ASYMMETRIC_STATE))
return -EIO;
return 0;
@@ -4550,6 +4595,70 @@
}
/**
+ * ipr_set_active_active_mode -
+ * @ioa: ipr ioa struct
+ * @mode: enable or disable
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+int ipr_set_active_active_mode(struct ipr_ioa *ioa)
+{
+ int len, rc;
+ struct ipr_mode_pages mode_pages;
+ struct ipr_mode_page24 *page24;
+
+ memset(&mode_pages, 0, sizeof(mode_pages));
+ rc = ipr_mode_sense(&ioa->ioa, 0x24, &mode_pages);
+ if (!rc) {
+ page24 = (struct ipr_mode_page24 *) (((u8 *)&mode_pages) +
+ mode_pages.hdr.block_desc_len +
+ sizeof(mode_pages.hdr));
+ len = mode_pages.hdr.length +1;
+ mode_pages.hdr.length = 0;
+ page24->dual_adapter_af = ENABLE_DUAL_IOA_ACTIVE_ACTIVE;
+ return ipr_mode_select(&ioa->ioa, &mode_pages, len);
+ }
+
+ return rc;
+}
+
+/**
+ * set_active_active_mode -
+ * @ioa: ipr ioa struct
+ * @mode: enable or disable
+ *
+ * Returns:
+ * 0 if success / non-zero on failure
+ **/
+int set_active_active_mode(struct ipr_ioa *ioa, int mode)
+{
+ struct ipr_ioa_attr attr;
+ int rc;
+
+ /* Get the current ioa attributes. */
+ rc = ipr_get_ioa_attr(ioa, &attr);
+
+ if (rc)
+ return rc;
+
+ /* Get the saved ioa attributes from the config file. */
+ rc = ipr_modify_ioa_attr(ioa, &attr);
+
+ if (rc)
+ return rc;
+
+ if (attr.active_active == mode) {
+ /* We should never get here. */
+ ioa_dbg(ioa, "Requested and current asymmetric access mode are the same.\n");
+ return 0;
+ }
+
+ attr.active_active = mode;
+ return ipr_set_ioa_attr(ioa, &attr, 1);
+}
+
+/**
* get_scsi_dev_data - get scsi device data
* @scsi_dev_ref: scsi_dev_data struct
*
@@ -4920,7 +5029,7 @@
}
/**
- * get_ioa_cap - get the capability information for the ioa
+ * get_ioa_cap - get the capability information for the ioa (inquiry page D0)
* @ioa: ipr ioa struct
*
* Returns:
@@ -4939,35 +5048,48 @@
rc = ipr_inquiry(&ioa->ioa, 0, &page0_inq, sizeof(page0_inq));
- if (!rc) {
- for (j = 0; j < page0_inq.page_length; j++) {
- if (page0_inq.supported_page_codes[j] != 0xD0)
- continue;
- rc = ipr_inquiry(&ioa->ioa, 0xD0, &ioa_cap, sizeof(ioa_cap));
+ if (rc) {
+ ioa->ioa_dead = 1;
+ return;
+ }
+
+ for (j = 0; j < page0_inq.page_length; j++) {
+ if (page0_inq.supported_page_codes[j] != 0xD0)
+ continue;
+ rc = ipr_inquiry(&ioa->ioa, 0xD0, &ioa_cap, sizeof(ioa_cap));
+ if (rc)
+ break;
+
+ ioa->af_block_size = get_af_block_size(&ioa_cap);
+ if (ioa_cap.is_aux_cache)
+ 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;
+
+ if (ioa_cap.dual_ioa_raid || ioa_cap.dual_ioa_asymmetric_access) {
+ memset(&mode_pages, 0, sizeof(mode_pages));
+ rc = ipr_mode_sense(&ioa->ioa, 0x24, &mode_pages);
if (rc)
break;
- if (ioa_cap.dual_ioa_raid) {
- memset(&mode_pages, 0, sizeof(mode_pages));
- rc = ipr_mode_sense(&ioa->ioa, 0x24, &mode_pages);
- if (!rc) {
- page24 = (struct ipr_mode_page24 *) (((u8 *)&mode_pages) +
- mode_pages.hdr.block_desc_len +
- sizeof(mode_pages.hdr));
- if (page24->enable_dual_ioa_af)
- ioa->dual_raid_support = 1;
+ page24 = (struct ipr_mode_page24 *) (((u8 *)&mode_pages) +
+ mode_pages.hdr.block_desc_len +
+ sizeof(mode_pages.hdr));
+
+ if (ioa_cap.dual_ioa_raid && page24->dual_adapter_af == ENABLE_DUAL_IOA_AF)
+ ioa->dual_raid_support = 1;
+
+ if (ioa_cap.dual_ioa_asymmetric_access) {
+ ioa->asymmetric_access = 1;
+ if (page24->dual_adapter_af == ENABLE_DUAL_IOA_ACTIVE_ACTIVE) {
+ ioa->dual_raid_support = 1;
+ ioa->asymmetric_access_enabled = 1;
}
}
- ioa->af_block_size = get_af_block_size(&ioa_cap);
- if (ioa_cap.is_aux_cache)
- 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;
+ }
}
/**
@@ -5401,7 +5523,7 @@
}
/**
- * ipr_save_attr - Start array protection for an array
+ * ipr_save_attr -
* @ioa: ipr ioa struct
* @category:
* @field:
@@ -5475,7 +5597,6 @@
syslog(LOG_ERR, "Could not save %s.\n", fname);
fclose(fd);
fclose(temp_fd);
-
}
/**
@@ -5888,6 +6009,7 @@
attr->preferred_primary = 0;
attr->gscsi_only_ha = ioa->in_gscsi_only_ha;
+ attr->active_active = ioa->asymmetric_access_enabled;
if (!ioa->dual_raid_support)
return 0;
@@ -5944,6 +6066,11 @@
rc = ipr_get_saved_ioa_attr(ioa, IPR_GSCSI_HA_ONLY, temp);
if (rc == RC_SUCCESS)
sscanf(temp, "%d", &attr->gscsi_only_ha);
+
+ rc = ipr_get_saved_ioa_attr(ioa, IPR_DUAL_ADAPTER_ACTIVE_ACTIVE, temp);
+ if (rc == RC_SUCCESS)
+ sscanf(temp, "%d", &attr->active_active);
+
return 0;
}
@@ -6017,11 +6144,12 @@
if (ipr_get_ioa_attr(ioa, &old_attr))
return -EIO;
- if (attr->preferred_primary != old_attr.preferred_primary) {
- sprintf(temp, "%d", attr->preferred_primary);
- if (ipr_set_preferred_primary(ioa, attr->preferred_primary))
+ /* FIXME - preferred_primary and active_active may change at the same
+ * time. This code may need to change.
+ */
+ if (attr->preferred_primary != old_attr.preferred_primary)
+ if (ipr_change_multi_adapter_assignment(ioa, attr->preferred_primary, IPR_PRESERVE_ASYMMETRIC_STATE))
return -EIO;
- }
if (attr->gscsi_only_ha != old_attr.gscsi_only_ha) {
sprintf(temp, "%d", attr->gscsi_only_ha);
@@ -6033,8 +6161,24 @@
ipr_reset_adapter(ioa);
}
- get_dual_ioa_state(ioa);
- get_subsys_config(ioa);
+ if (attr->active_active != old_attr.active_active && ioa->asymmetric_access) {
+ sprintf(temp, "%d", attr->active_active);
+
+ /* If setting active/active, use mode page 24.
+ * If clearing, use Change Multi Adapter Assignment. */
+ if (attr->active_active) {
+ if (ipr_set_active_active_mode(ioa))
+ return -EIO;
+ } else if (ipr_change_multi_adapter_assignment(ioa,
+ attr->preferred_primary,
+ attr->active_active))
+ return -EIO;
+ if (save)
+ ipr_save_ioa_attr(ioa, IPR_DUAL_ADAPTER_ACTIVE_ACTIVE, temp, 1);
+ }
+
+ get_dual_ioa_state(ioa); /* for preferred_primary */
+ get_subsys_config(ioa); /* for gscsi_only_ha */
return 0;
}
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/iprutils/iprlib.h new/iprutils/iprlib.h
--- old/iprutils/iprlib.h 2008-07-21 05:55:54.000000000 +0200
+++ new/iprutils/iprlib.h 2008-09-26 22:54:17.000000000 +0200
@@ -12,7 +12,7 @@
*/
/*
- * $Header: /cvsroot/iprdd/iprutils/iprlib.h,v 1.100 2008/04/09 19:34:17 tsenglin Exp $
+ * $Header: /cvsroot/iprdd/iprutils/iprlib.h,v 1.103 2008/09/26 20:54:17 wboyer Exp $
*/
#include
@@ -161,6 +161,7 @@
#define IPR_REMOVE_ARRAY_DEVICE 0xF5
#define IPR_REBUILD_DEVICE_DATA 0xF6
#define IPR_RECLAIM_CACHE_STORE 0xF8
+#define IPR_SET_ARRAY_ASYMMETRIC_ACCESS 0xFA
#define IPR_RECLAIM_ACTION 0x68
#define IPR_RECLAIM_PERFORM 0x00
#define IPR_RECLAIM_RESET_BATTERY_ERROR 0x08
@@ -180,6 +181,12 @@
#define IPR_TYPE_ADAPTER 0x1f
#define IPR_TYPE_EMPTY_SLOT 0xff
+#define IPR_ACTIVE_OPTIMIZED 0x0
+#define IPR_ACTIVE_NON_OPTIMIZED 0x1
+#define IPR_ACTIVE_STANDYBY 0x2
+#define IPR_CLEAR_ASYMMETRIC_STATE 0x0
+#define IPR_PRESERVE_ASYMMETRIC_STATE 0x1
+
#define IPR_IS_DASD_DEVICE(std_inq_data) \
((((std_inq_data).peri_dev_type) == TYPE_DISK) && !((std_inq_data).removeable_medium))
@@ -214,8 +221,7 @@
extern struct sysfs_dev *head_zdev;
extern struct sysfs_dev *tail_zdev;
-struct sysfs_dev
-{
+struct sysfs_dev {
char sysfs_device_name[16];
struct sysfs_dev *next, *prev;
};
@@ -637,19 +643,19 @@
struct ipr_array_cap_entry {
u8 prot_level;
#define IPR_DEFAULT_RAID_LVL "5"
+
#if defined (__BIG_ENDIAN_BITFIELD)
u8 include_allowed:1;
u8 reserved:5;
u8 format_overlay_type:2;
-
-#define IPR_FORMAT_ADD_DEVICES 1
-#define IPR_FORMAT_REMOVE_DEVICES 2
-
#elif defined (__LITTLE_ENDIAN_BITFIELD)
u8 format_overlay_type:2;
u8 reserved:5;
u8 include_allowed:1;
#endif
+#define IPR_FORMAT_ADD_DEVICES 1
+#define IPR_FORMAT_REMOVE_DEVICES 2
+
u16 reserved2;
u8 reserved3;
u8 max_num_array_devices;
@@ -680,7 +686,14 @@
u8 issue_cmd:1;
#endif
- u8 reserved2;
+ //u8 reserved2;
+#if defined (__BIG_ENDIAN_BITFIELD)
+ u8 saved_asym_access_state:4;
+ u8 current_asym_access_state:4;
+#elif defined (__LITTLE_ENDIAN_BITFIELD)
+ u8 current_asym_access_state:4;
+ u8 saved_asym_access_state:4;
+#endif
#if defined (__BIG_ENDIAN_BITFIELD)
u8 established:1;
@@ -694,7 +707,8 @@
u8 stop_cand:1;
u8 resync_cand:1;
u8 migrate_cand:1;
- u8 reserved4:4;
+ u8 asym_access_cand:1;
+ u8 reserved4:3;
#elif defined (__LITTLE_ENDIAN_BITFIELD)
u8 reserved3:3;
u8 no_config_entry:1;
@@ -703,7 +717,8 @@
u8 exposed:1;
u8 established:1;
- u8 reserved4:4;
+ u8 reserved4:3;
+ u8 asym_access_cand:1;
u8 migrate_cand:1;
u8 resync_cand:1;
u8 stop_cand:1;
@@ -973,6 +988,7 @@
#define IPR_CATEGORY_IOA "Adapter"
#define IPR_GSCSI_HA_ONLY "JBOD_ONLY_HA"
+#define IPR_DUAL_ADAPTER_ACTIVE_ACTIVE "DUAL_ADAPTER_ACTIVE_ACTIVE"
#define IPR_CATEGORY_BUS "Bus"
#define IPR_QAS_CAPABILITY "QAS_CAPABILITY"
@@ -1023,7 +1039,7 @@
struct ipr_path_entry {
u8 state;
#define IPR_PATH_FUNCTIONAL 0
-#define IPR_PATH_NOT_FUNCTIONAL 1
+#define IPR_PATH_NOT_FUNCTIONAL 1
u8 local_bus_num;
u8 remote_bus_num;
u8 reserved;
@@ -1040,10 +1056,11 @@
u32 length;
u8 link_state;
#define IPR_IOA_LINK_STATE_NOT_OPER 0
-#define IPR_IOA_LINK_STATE_OPER 1
+#define IPR_IOA_LINK_STATE_OPER 1
u8 cur_state;
+#define IPR_IOA_STATE_NO_CHANGE 0
#define IPR_IOA_STATE_PRIMARY 2
-#define IPR_IOA_STATE_SECONDARY 3
+#define IPR_IOA_STATE_SECONDARY 3
#define IPR_IOA_STATE_NO_PREFERENCE 4
u8 fmt;
u8 multi_adapter_type;
@@ -1107,6 +1124,7 @@
struct ipr_ioa_attr {
int preferred_primary;
int gscsi_only_ha;
+ int active_active;
};
#define IPR_DEV_MAX_PATHS 2
@@ -1152,7 +1170,6 @@
u32 num_raid_cmds;
u32 msl;
u16 num_devices;
- u8 rw_protected:1; /* FIXME */
u8 ioa_dead:1;
u8 nr_ioa_microcode:1;
u8 scsi_id_changeable:1;
@@ -1163,6 +1180,8 @@
u8 protect_last_bus:1;
u8 gscsi_only_ha:1;
u8 in_gscsi_only_ha:1;
+ u8 asymmetric_access:1;
+ u8 asymmetric_access_enabled:1;
enum ipr_tcq_mode tcq_mode;
u16 pci_vendor;
u16 pci_device;
@@ -1311,12 +1330,16 @@
struct ipr_mode_page24 {
struct ipr_mode_page_hdr hdr;
#if defined (__BIG_ENDIAN_BITFIELD)
- u8 enable_dual_ioa_af:1;
+ u8 dual_adapter_af:2;
u8 reserved:7;
#elif defined (__LITTLE_ENDIAN_BITFIELD)
u8 reserved:7;
- u8 enable_dual_ioa_af:1;
+ u8 dual_adapter_af:2;
#endif
+
+#define DISABLE_DUAL_IOA_AF 0x00
+#define ENABLE_DUAL_IOA_AF 0x02
+#define ENABLE_DUAL_IOA_ACTIVE_ACTIVE 0x03
};
struct ipr_config_term_hdr {
@@ -1488,7 +1511,8 @@
#if defined (__BIG_ENDIAN_BITFIELD)
u8 dual_ioa_raid:1;
u8 dual_ioa_wcache:1;
- u8 reserved:6;
+ u8 dual_ioa_asymmetric_access:1;
+ u8 reserved:5;
u8 can_attach_to_aux_cache:1;
u8 is_aux_cache:1;
@@ -1498,7 +1522,8 @@
u8 reserved4[2];
#elif defined (__LITTLE_ENDIAN_BITFIELD)
- u8 reserved:6;
+ u8 reserved:5;
+ u8 dual_ioa_asymmetric_access:1;
u8 dual_ioa_wcache:1;
u8 dual_ioa_raid:1;
@@ -1989,7 +2014,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 ipr_change_multi_adapter_assignment(struct ipr_ioa *, int, int);
int set_ha_mode(struct ipr_ioa *, int);
int set_preferred_primary(struct ipr_ioa *, int);
void check_current_config(bool);
@@ -2017,6 +2042,7 @@
int ipr_start_array_protection(struct ipr_ioa *, int, int);
int ipr_migrate_array_protection(struct ipr_ioa *,
struct ipr_array_query_data *, int, int, int);
+int ipr_set_array_asym_access(struct ipr_dev *, struct ipr_array_query_data *);
int ipr_add_hot_spare(struct ipr_ioa *);
int ipr_rebuild_device_data(struct ipr_ioa *);
int ipr_resync_array(struct ipr_ioa *);
@@ -2051,7 +2077,10 @@
int ipr_get_dev_attr(struct ipr_dev *, struct ipr_disk_attr *);
int ipr_modify_dev_attr(struct ipr_dev *, struct ipr_disk_attr *);
int ipr_set_ioa_attr(struct ipr_ioa *, struct ipr_ioa_attr *, int);
+int ipr_modify_ioa_attr(struct ipr_ioa *, struct ipr_ioa_attr *);
int ipr_set_dev_attr(struct ipr_dev *, struct ipr_disk_attr *, int);
+int set_active_active_mode(struct ipr_ioa *, int);
+
int ipr_query_dasd_timeouts(struct ipr_dev *, struct ipr_query_dasd_timeouts *);
int get_ioa_firmware_image_list(struct ipr_ioa *, struct ipr_fw_images **);
int get_dasd_firmware_image_list(struct ipr_dev *, struct ipr_fw_images **);
@@ -2286,4 +2315,5 @@
} \
} \
} while (0)
-#endif
+
+#endif /* iprlib_h */
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/iprutils/spec/iprutils.spec new/iprutils/spec/iprutils.spec
--- old/iprutils/spec/iprutils.spec 2008-08-14 01:37:37.000000000 +0200
+++ new/iprutils/spec/iprutils.spec 2008-09-26 22:33:43.000000000 +0200
@@ -1,6 +1,6 @@
Summary: Utilities for the IBM Power Linux RAID adapters
Name: iprutils
-Version: 2.2.10
+Version: 2.2.11
Release: 1
License: CPL
Group: System Environment/Base
@@ -81,9 +81,19 @@
%{_sysconfdir}/ha.d/resource.d/iprha
%changelog
+* Fri Sep 26 2008 Wayne Boyer 2.2.11
+- Release 2.2.11
+- Add support for the active-active functionality.
+* Wed Aug 20 2008 Wayne Boyer
+- Fixed a compilation failure on small endian systems.
* Wed Aug 13 2008 Wayne Boyer 2.2.10
- Release 2.2.10
- Add support for the array migration functionality.
+* Wed May 14 2008 Tseng-Hui Lin
+- Under heavy traffic, download microcode to a disk through /dev/sgX
+ may get -ENOMEM SG_IO ioctl. Change to use /dev/sdX. Fall back
+ to /dev/sgX if: (1) /dev/sdX does not exist or (2) max_sectors_kb
+ is not set large enough for microcode download.
* Thu Apr 09 2008 Tseng-Hui Lin 2.2.9
- Release 2.2.9
- Do not save preferred primary attribute to fix an infinite failover
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/iprutils/version.mk new/iprutils/version.mk
--- old/iprutils/version.mk 2008-08-14 01:29:22.000000000 +0200
+++ new/iprutils/version.mk 2008-09-26 22:33:30.000000000 +0200
@@ -6,9 +6,9 @@
IPR_MAJOR_RELEASE=2
IPR_MINOR_RELEASE=2
-IPR_FIX_LEVEL=10
+IPR_FIX_LEVEL=11
IPR_RELEASE=1
-IPR_FIX_DATE=(August 13, 2008)
+IPR_FIX_DATE=(September 26, 2008)
IPR_VERSION_STR=$(IPR_MAJOR_RELEASE).$(IPR_MINOR_RELEASE).$(IPR_FIX_LEVEL) $(IPR_FIX_DATE)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org