b0ec4a42c8
Modify 0021-RHBZ-548874-add-find-multipaths.patch Modify 0022-RHBZ-557845-RHEL5-style-partitions.patch Add 0025-RHBZ-508827-update-multipathd-manpage.patch through 0101-RHBZ-631009-disable-udev-disk-rules-on-reload.patch * sync with current state of RHEL6. Next release should include a updated source tarball with most of these fixes rolled in. Add 0102-RHBZ-690828-systemd-unit-file.patch * Add Jóhann B. Guðmundsson's unit file for systemd. * Add sub-package sysvinit for SysV init script. Resolves: bz #690828
618 lines
16 KiB
Diff
618 lines
16 KiB
Diff
---
|
|
libmultipath/hwtable.c | 4
|
|
libmultipath/prio.h | 2
|
|
libmultipath/prioritizers/Makefile | 2
|
|
libmultipath/prioritizers/netapp.c | 243 ------------------------------------
|
|
libmultipath/prioritizers/netapp.h | 7 -
|
|
libmultipath/prioritizers/ontap.c | 245 +++++++++++++++++++++++++++++++++++++
|
|
libmultipath/prioritizers/ontap.h | 7 +
|
|
multipath.conf.defaults | 4
|
|
multipath/multipath.conf.5 | 2
|
|
9 files changed, 259 insertions(+), 257 deletions(-)
|
|
|
|
Index: multipath-tools/libmultipath/hwtable.c
|
|
===================================================================
|
|
--- multipath-tools.orig/libmultipath/hwtable.c
|
|
+++ multipath-tools/libmultipath/hwtable.c
|
|
@@ -769,7 +769,7 @@ static struct hwentry default_hw[] = {
|
|
.no_path_retry = NO_PATH_RETRY_UNDEF,
|
|
.minio = 128,
|
|
.checker_name = DIRECTIO,
|
|
- .prio_name = PRIO_NETAPP,
|
|
+ .prio_name = PRIO_ONTAP,
|
|
},
|
|
/*
|
|
* IBM NSeries (NETAPP) controller family
|
|
@@ -790,7 +790,7 @@ static struct hwentry default_hw[] = {
|
|
.no_path_retry = NO_PATH_RETRY_UNDEF,
|
|
.minio = 128,
|
|
.checker_name = DIRECTIO,
|
|
- .prio_name = PRIO_NETAPP,
|
|
+ .prio_name = PRIO_ONTAP,
|
|
},
|
|
/*
|
|
* Pillar Data controller family
|
|
Index: multipath-tools/libmultipath/prio.h
|
|
===================================================================
|
|
--- multipath-tools.orig/libmultipath/prio.h
|
|
+++ multipath-tools/libmultipath/prio.h
|
|
@@ -21,7 +21,7 @@
|
|
#define PRIO_EMC "emc"
|
|
#define PRIO_HDS "hds"
|
|
#define PRIO_HP_SW "hp_sw"
|
|
-#define PRIO_NETAPP "netapp"
|
|
+#define PRIO_ONTAP "ontap"
|
|
#define PRIO_RANDOM "random"
|
|
#define PRIO_RDAC "rdac"
|
|
#define PRIO_WEIGHTED "weighted"
|
|
Index: multipath-tools/libmultipath/prioritizers/Makefile
|
|
===================================================================
|
|
--- multipath-tools.orig/libmultipath/prioritizers/Makefile
|
|
+++ multipath-tools/libmultipath/prioritizers/Makefile
|
|
@@ -12,7 +12,7 @@ LIBS = \
|
|
libpriordac.so \
|
|
libprioalua.so \
|
|
libpriotpg_pref.so \
|
|
- libprionetapp.so \
|
|
+ libprioontap.so \
|
|
libpriohds.so \
|
|
libprioweighted.so \
|
|
|
|
Index: multipath-tools/libmultipath/prioritizers/netapp.c
|
|
===================================================================
|
|
--- multipath-tools.orig/libmultipath/prioritizers/netapp.c
|
|
+++ /dev/null
|
|
@@ -1,243 +0,0 @@
|
|
-/*
|
|
- * Copyright 2005 Network Appliance, Inc., All Rights Reserved
|
|
- * Author: David Wysochanski available at davidw@netapp.com
|
|
- *
|
|
- * This program is free software; you can redistribute it and/or modify
|
|
- * it under the terms of the GNU General Public License version 2 as
|
|
- * published by the Free Software Foundation.
|
|
- *
|
|
- * This program is distributed in the hope that it will be useful, but
|
|
- * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
- * General Public License v2 for more details.
|
|
- */
|
|
-
|
|
-#include <stdio.h>
|
|
-#include <stdlib.h>
|
|
-#include <string.h>
|
|
-#include <sys/ioctl.h>
|
|
-#include <errno.h>
|
|
-#include <assert.h>
|
|
-
|
|
-#include <sg_include.h>
|
|
-#include <debug.h>
|
|
-#include <prio.h>
|
|
-
|
|
-#define INQUIRY_CMD 0x12
|
|
-#define INQUIRY_CMDLEN 6
|
|
-#define DEFAULT_PRIOVAL 10
|
|
-#define RESULTS_MAX 256
|
|
-#define SG_TIMEOUT 30000
|
|
-
|
|
-#define pp_netapp_log(prio, fmt, args...) \
|
|
- condlog(prio, "%s: netapp prio: " fmt, dev, ##args)
|
|
-
|
|
-static void dump_cdb(unsigned char *cdb, int size)
|
|
-{
|
|
- int i;
|
|
- char buf[10*5+1];
|
|
- char * p = &buf[0];
|
|
-
|
|
- condlog(0, "- SCSI CDB: ");
|
|
- for (i=0; i<size; i++) {
|
|
- p += snprintf(p, 10*(size-i), "0x%02x ", cdb[i]);
|
|
- }
|
|
- condlog(0, "%s", buf);
|
|
-}
|
|
-
|
|
-static void process_sg_error(struct sg_io_hdr *io_hdr)
|
|
-{
|
|
- int i;
|
|
- char buf[128*5+1];
|
|
- char * p = &buf[0];
|
|
-
|
|
- condlog(0, "- masked_status=0x%02x, host_status=0x%02x, "
|
|
- "driver_status=0x%02x", io_hdr->masked_status,
|
|
- io_hdr->host_status, io_hdr->driver_status);
|
|
- if (io_hdr->sb_len_wr > 0) {
|
|
- condlog(0, "- SCSI sense data: ");
|
|
- for (i=0; i<io_hdr->sb_len_wr; i++) {
|
|
- p += snprintf(p, 128*(io_hdr->sb_len_wr-i), "0x%02x ",
|
|
- io_hdr->sbp[i]);
|
|
- }
|
|
- condlog(0, "%s", buf);
|
|
- }
|
|
-}
|
|
-
|
|
-/*
|
|
- * Returns:
|
|
- * -1: error, errno set
|
|
- * 0: success
|
|
- */
|
|
-static int send_gva(const char *dev, int fd, unsigned char pg,
|
|
- unsigned char *results, int *results_size)
|
|
-{
|
|
- unsigned char sb[128];
|
|
- unsigned char cdb[10] = {0xc0, 0, 0x1, 0xa, 0x98, 0xa,
|
|
- pg, sizeof(sb), 0, 0};
|
|
- struct sg_io_hdr io_hdr;
|
|
- int ret = -1;
|
|
-
|
|
- memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
|
|
- io_hdr.interface_id = 'S';
|
|
- io_hdr.cmd_len = sizeof (cdb);
|
|
- io_hdr.mx_sb_len = sizeof (sb);
|
|
- io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
|
|
- io_hdr.dxfer_len = *results_size;
|
|
- io_hdr.dxferp = results;
|
|
- io_hdr.cmdp = cdb;
|
|
- io_hdr.sbp = sb;
|
|
- io_hdr.timeout = SG_TIMEOUT;
|
|
- io_hdr.pack_id = 0;
|
|
- if (ioctl(fd, SG_IO, &io_hdr) < 0) {
|
|
- pp_netapp_log(0, "SG_IO ioctl failed, errno=%d", errno);
|
|
- dump_cdb(cdb, sizeof(cdb));
|
|
- goto out;
|
|
- }
|
|
- if (io_hdr.info & SG_INFO_OK_MASK) {
|
|
- pp_netapp_log(0, "SCSI error");
|
|
- dump_cdb(cdb, sizeof(cdb));
|
|
- process_sg_error(&io_hdr);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- if (results[4] != 0x0a || results[5] != 0x98 ||
|
|
- results[6] != 0x0a ||results[7] != 0x01) {
|
|
- dump_cdb(cdb, sizeof(cdb));
|
|
- pp_netapp_log(0, "GVA return wrong format ");
|
|
- pp_netapp_log(0, "results[4-7] = 0x%02x 0x%02x 0x%02x 0x%02x",
|
|
- results[4], results[5], results[6], results[7]);
|
|
- goto out;
|
|
- }
|
|
- ret = 0;
|
|
- out:
|
|
- return(ret);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Retuns:
|
|
- * -1: Unable to obtain proxy info
|
|
- * 0: Device _not_ proxy path
|
|
- * 1: Device _is_ proxy path
|
|
- */
|
|
-static int get_proxy(const char *dev, int fd)
|
|
-{
|
|
- unsigned char results[256];
|
|
- unsigned char sb[128];
|
|
- unsigned char cdb[INQUIRY_CMDLEN] = {INQUIRY_CMD, 1, 0xc1, 0,
|
|
- sizeof(sb), 0};
|
|
- struct sg_io_hdr io_hdr;
|
|
- int ret = -1;
|
|
-
|
|
- memset(&results, 0, sizeof (results));
|
|
- memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
|
|
- io_hdr.interface_id = 'S';
|
|
- io_hdr.cmd_len = sizeof (cdb);
|
|
- io_hdr.mx_sb_len = sizeof (sb);
|
|
- io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
|
|
- io_hdr.dxfer_len = sizeof (results);
|
|
- io_hdr.dxferp = results;
|
|
- io_hdr.cmdp = cdb;
|
|
- io_hdr.sbp = sb;
|
|
- io_hdr.timeout = SG_TIMEOUT;
|
|
- io_hdr.pack_id = 0;
|
|
- if (ioctl(fd, SG_IO, &io_hdr) < 0) {
|
|
- pp_netapp_log(0, "ioctl sending inquiry command failed, "
|
|
- "errno=%d", errno);
|
|
- dump_cdb(cdb, sizeof(cdb));
|
|
- goto out;
|
|
- }
|
|
- if (io_hdr.info & SG_INFO_OK_MASK) {
|
|
- pp_netapp_log(0, "SCSI error");
|
|
- dump_cdb(cdb, sizeof(cdb));
|
|
- process_sg_error(&io_hdr);
|
|
- goto out;
|
|
- }
|
|
-
|
|
- if (results[1] != 0xc1 || results[8] != 0x0a ||
|
|
- results[9] != 0x98 || results[10] != 0x0a ||
|
|
- results[11] != 0x0 || results[12] != 0xc1 ||
|
|
- results[13] != 0x0) {
|
|
- pp_netapp_log(0,"proxy info page in unknown format - ");
|
|
- pp_netapp_log(0,"results[8-13]=0x%02x 0x%02x 0x%02x 0x%02x "
|
|
- "0x%02x 0x%02x",
|
|
- results[8], results[9], results[10],
|
|
- results[11], results[12], results[13]);
|
|
- dump_cdb(cdb, sizeof(cdb));
|
|
- goto out;
|
|
- }
|
|
- ret = (results[19] & 0x02) >> 1;
|
|
-
|
|
- out:
|
|
- return(ret);
|
|
-}
|
|
-
|
|
-/*
|
|
- * Returns priority of device based on device info.
|
|
- *
|
|
- * 4: FCP non-proxy, FCP proxy unknown, or unable to determine protocol
|
|
- * 3: iSCSI HBA
|
|
- * 2: iSCSI software
|
|
- * 1: FCP proxy
|
|
- */
|
|
-static int netapp_prio(const char *dev, int fd)
|
|
-{
|
|
- unsigned char results[RESULTS_MAX];
|
|
- int results_size=RESULTS_MAX;
|
|
- int rc;
|
|
- int is_proxy;
|
|
- int is_iscsi_software;
|
|
- int is_iscsi_hardware;
|
|
- int tot_len;
|
|
-
|
|
- is_iscsi_software = is_iscsi_hardware = is_proxy = 0;
|
|
-
|
|
- memset(&results, 0, sizeof (results));
|
|
- rc = send_gva(dev, fd, 0x41, results, &results_size);
|
|
- if (rc == 0) {
|
|
- tot_len = results[0] << 24 | results[1] << 16 |
|
|
- results[2] << 8 | results[3];
|
|
- if (tot_len <= 8) {
|
|
- goto try_fcp_proxy;
|
|
- }
|
|
- if (results[8] != 0x41) {
|
|
- pp_netapp_log(0, "GVA page 0x41 error - "
|
|
- "results[8] = 0x%x", results[8]);
|
|
- goto try_fcp_proxy;
|
|
- }
|
|
- if ((strncmp((char *)&results[12], "ism_sw", 6) == 0) ||
|
|
- (strncmp((char *)&results[12], "iswt", 4) == 0)) {
|
|
- is_iscsi_software = 1;
|
|
- goto prio_select;
|
|
- }
|
|
- else if (strncmp((char *)&results[12], "ism_sn", 6) == 0) {
|
|
- is_iscsi_hardware = 1;
|
|
- goto prio_select;
|
|
- }
|
|
- }
|
|
-
|
|
- try_fcp_proxy:
|
|
- rc = get_proxy(dev, fd);
|
|
- if (rc >= 0) {
|
|
- is_proxy = rc;
|
|
- }
|
|
-
|
|
- prio_select:
|
|
- if (is_iscsi_hardware) {
|
|
- return 3;
|
|
- } else if (is_iscsi_software) {
|
|
- return 2;
|
|
- } else {
|
|
- if (is_proxy) {
|
|
- return 1;
|
|
- } else {
|
|
- /* Either non-proxy, or couldn't get proxy info */
|
|
- return 4;
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
-int getprio (struct path * pp)
|
|
-{
|
|
- return netapp_prio(pp->dev, pp->fd);
|
|
-}
|
|
Index: multipath-tools/libmultipath/prioritizers/netapp.h
|
|
===================================================================
|
|
--- multipath-tools.orig/libmultipath/prioritizers/netapp.h
|
|
+++ /dev/null
|
|
@@ -1,7 +0,0 @@
|
|
-#ifndef _NETAPP_H
|
|
-#define _NETAPP_H
|
|
-
|
|
-#define PRIO_NETAPP "netapp"
|
|
-int prio_netapp(struct path * pp);
|
|
-
|
|
-#endif
|
|
Index: multipath-tools/libmultipath/prioritizers/ontap.c
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ multipath-tools/libmultipath/prioritizers/ontap.c
|
|
@@ -0,0 +1,245 @@
|
|
+/*
|
|
+ * Copyright 2005 Network Appliance, Inc., All Rights Reserved
|
|
+ * Author: David Wysochanski available at davidw@netapp.com
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or modify
|
|
+ * it under the terms of the GNU General Public License version 2 as
|
|
+ * published by the Free Software Foundation.
|
|
+ *
|
|
+ * This program is distributed in the hope that it will be useful, but
|
|
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
+ * General Public License v2 for more details.
|
|
+ */
|
|
+
|
|
+#include <stdio.h>
|
|
+#include <stdlib.h>
|
|
+#include <string.h>
|
|
+#include <sys/ioctl.h>
|
|
+#include <errno.h>
|
|
+#include <assert.h>
|
|
+
|
|
+#include <sg_include.h>
|
|
+#include <debug.h>
|
|
+#include <prio.h>
|
|
+
|
|
+#define INQUIRY_CMD 0x12
|
|
+#define INQUIRY_CMDLEN 6
|
|
+#define DEFAULT_PRIOVAL 10
|
|
+#define RESULTS_MAX 256
|
|
+#define SG_TIMEOUT 60000
|
|
+
|
|
+#define pp_ontap_log(prio, fmt, args...) \
|
|
+ condlog(prio, "%s: ontap prio: " fmt, dev, ##args)
|
|
+
|
|
+static void dump_cdb(unsigned char *cdb, int size)
|
|
+{
|
|
+ int i;
|
|
+ char buf[10*5+1];
|
|
+ char * p = &buf[0];
|
|
+
|
|
+ condlog(0, "- SCSI CDB: ");
|
|
+ for (i=0; i<size; i++) {
|
|
+ p += snprintf(p, 10*(size-i), "0x%02x ", cdb[i]);
|
|
+ }
|
|
+ condlog(0, "%s", buf);
|
|
+}
|
|
+
|
|
+static void process_sg_error(struct sg_io_hdr *io_hdr)
|
|
+{
|
|
+ int i;
|
|
+ char buf[128*5+1];
|
|
+ char * p = &buf[0];
|
|
+
|
|
+ condlog(0, "- masked_status=0x%02x, host_status=0x%02x, "
|
|
+ "driver_status=0x%02x", io_hdr->masked_status,
|
|
+ io_hdr->host_status, io_hdr->driver_status);
|
|
+ if (io_hdr->sb_len_wr > 0) {
|
|
+ condlog(0, "- SCSI sense data: ");
|
|
+ for (i=0; i<io_hdr->sb_len_wr; i++) {
|
|
+ p += snprintf(p, 128*(io_hdr->sb_len_wr-i), "0x%02x ",
|
|
+ io_hdr->sbp[i]);
|
|
+ }
|
|
+ condlog(0, "%s", buf);
|
|
+ }
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Returns:
|
|
+ * -1: error, errno set
|
|
+ * 0: success
|
|
+ */
|
|
+static int send_gva(const char *dev, int fd, unsigned char pg,
|
|
+ unsigned char *results, int *results_size)
|
|
+{
|
|
+ unsigned char sb[128];
|
|
+ unsigned char cdb[10] = {0xc0, 0, 0x1, 0xa, 0x98, 0xa,
|
|
+ pg, sizeof(sb), 0, 0};
|
|
+ struct sg_io_hdr io_hdr;
|
|
+ int ret = -1;
|
|
+
|
|
+ memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
|
|
+ io_hdr.interface_id = 'S';
|
|
+ io_hdr.cmd_len = sizeof (cdb);
|
|
+ io_hdr.mx_sb_len = sizeof (sb);
|
|
+ io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
|
|
+ io_hdr.dxfer_len = *results_size;
|
|
+ io_hdr.dxferp = results;
|
|
+ io_hdr.cmdp = cdb;
|
|
+ io_hdr.sbp = sb;
|
|
+ io_hdr.timeout = SG_TIMEOUT;
|
|
+ io_hdr.pack_id = 0;
|
|
+ if (ioctl(fd, SG_IO, &io_hdr) < 0) {
|
|
+ pp_ontap_log(0, "SG_IO ioctl failed, errno=%d", errno);
|
|
+ dump_cdb(cdb, sizeof(cdb));
|
|
+ goto out;
|
|
+ }
|
|
+ if (io_hdr.info & SG_INFO_OK_MASK) {
|
|
+ pp_ontap_log(0, "SCSI error");
|
|
+ dump_cdb(cdb, sizeof(cdb));
|
|
+ process_sg_error(&io_hdr);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ if (results[4] != 0x0a || results[5] != 0x98 ||
|
|
+ results[6] != 0x0a ||results[7] != 0x01) {
|
|
+ dump_cdb(cdb, sizeof(cdb));
|
|
+ pp_ontap_log(0, "GVA return wrong format ");
|
|
+ pp_ontap_log(0, "results[4-7] = 0x%02x 0x%02x 0x%02x 0x%02x",
|
|
+ results[4], results[5], results[6], results[7]);
|
|
+ goto out;
|
|
+ }
|
|
+ ret = 0;
|
|
+ out:
|
|
+ return(ret);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Retuns:
|
|
+ * -1: Unable to obtain proxy info
|
|
+ * 0: Device _not_ proxy path
|
|
+ * 1: Device _is_ proxy path
|
|
+ */
|
|
+static int get_proxy(const char *dev, int fd)
|
|
+{
|
|
+ unsigned char results[256];
|
|
+ unsigned char sb[128];
|
|
+ unsigned char cdb[INQUIRY_CMDLEN] = {INQUIRY_CMD, 1, 0xc1, 0,
|
|
+ sizeof(sb), 0};
|
|
+ struct sg_io_hdr io_hdr;
|
|
+ int ret = -1;
|
|
+
|
|
+ memset(&results, 0, sizeof (results));
|
|
+ memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
|
|
+ io_hdr.interface_id = 'S';
|
|
+ io_hdr.cmd_len = sizeof (cdb);
|
|
+ io_hdr.mx_sb_len = sizeof (sb);
|
|
+ io_hdr.dxfer_direction = SG_DXFER_FROM_DEV;
|
|
+ io_hdr.dxfer_len = sizeof (results);
|
|
+ io_hdr.dxferp = results;
|
|
+ io_hdr.cmdp = cdb;
|
|
+ io_hdr.sbp = sb;
|
|
+ io_hdr.timeout = SG_TIMEOUT;
|
|
+ io_hdr.pack_id = 0;
|
|
+ if (ioctl(fd, SG_IO, &io_hdr) < 0) {
|
|
+ pp_ontap_log(0, "ioctl sending inquiry command failed, "
|
|
+ "errno=%d", errno);
|
|
+ dump_cdb(cdb, sizeof(cdb));
|
|
+ goto out;
|
|
+ }
|
|
+ if (io_hdr.info & SG_INFO_OK_MASK) {
|
|
+ pp_ontap_log(0, "SCSI error");
|
|
+ dump_cdb(cdb, sizeof(cdb));
|
|
+ process_sg_error(&io_hdr);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ if (results[1] != 0xc1 || results[8] != 0x0a ||
|
|
+ results[9] != 0x98 || results[10] != 0x0a ||
|
|
+ results[11] != 0x0 || results[12] != 0xc1 ||
|
|
+ results[13] != 0x0) {
|
|
+ pp_ontap_log(0,"proxy info page in unknown format - ");
|
|
+ pp_ontap_log(0,"results[8-13]=0x%02x 0x%02x 0x%02x 0x%02x "
|
|
+ "0x%02x 0x%02x",
|
|
+ results[8], results[9], results[10],
|
|
+ results[11], results[12], results[13]);
|
|
+ dump_cdb(cdb, sizeof(cdb));
|
|
+ goto out;
|
|
+ }
|
|
+ ret = (results[19] & 0x02) >> 1;
|
|
+
|
|
+ out:
|
|
+ return(ret);
|
|
+}
|
|
+
|
|
+/*
|
|
+ * Returns priority of device based on device info.
|
|
+ *
|
|
+ * 4: FCP non-proxy, FCP proxy unknown, or unable to determine protocol
|
|
+ * 3: iSCSI HBA
|
|
+ * 2: iSCSI software
|
|
+ * 1: FCP proxy
|
|
+ */
|
|
+static int ontap_prio(const char *dev, int fd)
|
|
+{
|
|
+ unsigned char results[RESULTS_MAX];
|
|
+ int results_size=RESULTS_MAX;
|
|
+ int rc;
|
|
+ int is_proxy;
|
|
+ int is_iscsi_software;
|
|
+ int is_iscsi_hardware;
|
|
+ int tot_len;
|
|
+
|
|
+ is_iscsi_software = is_iscsi_hardware = is_proxy = 0;
|
|
+
|
|
+ memset(&results, 0, sizeof (results));
|
|
+ rc = send_gva(dev, fd, 0x41, results, &results_size);
|
|
+ if (rc >= 0) {
|
|
+ tot_len = results[0] << 24 | results[1] << 16 |
|
|
+ results[2] << 8 | results[3];
|
|
+ if (tot_len <= 8) {
|
|
+ goto try_fcp_proxy;
|
|
+ }
|
|
+ if (results[8] != 0x41) {
|
|
+ pp_ontap_log(0, "GVA page 0x41 error - "
|
|
+ "results[8] = 0x%x", results[8]);
|
|
+ goto try_fcp_proxy;
|
|
+ }
|
|
+ if ((strncmp((char *)&results[12], "ism_sw", 6) == 0) ||
|
|
+ (strncmp((char *)&results[12], "iswt", 4) == 0)) {
|
|
+ is_iscsi_software = 1;
|
|
+ goto prio_select;
|
|
+ }
|
|
+ else if (strncmp((char *)&results[12], "ism_sn", 6) == 0) {
|
|
+ is_iscsi_hardware = 1;
|
|
+ goto prio_select;
|
|
+ }
|
|
+ } else {
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ try_fcp_proxy:
|
|
+ rc = get_proxy(dev, fd);
|
|
+ if (rc >= 0) {
|
|
+ is_proxy = rc;
|
|
+ }
|
|
+
|
|
+ prio_select:
|
|
+ if (is_iscsi_hardware) {
|
|
+ return 3;
|
|
+ } else if (is_iscsi_software) {
|
|
+ return 2;
|
|
+ } else {
|
|
+ if (is_proxy) {
|
|
+ return 1;
|
|
+ } else {
|
|
+ /* Either non-proxy, or couldn't get proxy info */
|
|
+ return 4;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+int getprio (struct path * pp)
|
|
+{
|
|
+ return ontap_prio(pp->dev, pp->fd);
|
|
+}
|
|
Index: multipath-tools/libmultipath/prioritizers/ontap.h
|
|
===================================================================
|
|
--- /dev/null
|
|
+++ multipath-tools/libmultipath/prioritizers/ontap.h
|
|
@@ -0,0 +1,7 @@
|
|
+#ifndef _ONTAP_H
|
|
+#define _ONTAP_H
|
|
+
|
|
+#define PRIO_ONTAP "ontap"
|
|
+int prio_ontap(struct path * pp);
|
|
+
|
|
+#endif
|
|
Index: multipath-tools/multipath.conf.defaults
|
|
===================================================================
|
|
--- multipath-tools.orig/multipath.conf.defaults
|
|
+++ multipath-tools/multipath.conf.defaults
|
|
@@ -444,7 +444,7 @@
|
|
# rr_weight uniform
|
|
# rr_min_io 128
|
|
# path_checker directio
|
|
-# prio netapp
|
|
+# prio ontap
|
|
# }
|
|
# device {
|
|
# vendor "IBM"
|
|
@@ -458,7 +458,7 @@
|
|
# rr_weight uniform
|
|
# rr_min_io 128
|
|
# path_checker directio
|
|
-# prio netapp
|
|
+# prio ontap
|
|
# }
|
|
# device {
|
|
# vendor "Pillar"
|
|
Index: multipath-tools/multipath/multipath.conf.5
|
|
===================================================================
|
|
--- multipath-tools.orig/multipath/multipath.conf.5
|
|
+++ multipath-tools/multipath/multipath.conf.5
|
|
@@ -149,7 +149,7 @@ Generate the path priority for EMC array
|
|
.B mpath_prio_alua /dev/%n
|
|
Generate the path priority based on the SCSI-3 ALUA settings.
|
|
.TP
|
|
-.B mpath_prio_netapp /dev/%n
|
|
+.B mpath_prio_ontap /dev/%n
|
|
Generate the path priority for NetApp arrays.
|
|
.TP
|
|
.B mpath_prio_rdac /dev/%n
|