From d4d8c366beead631e37b9ac3723751d1165fcc4b Mon Sep 17 00:00:00 2001 From: akozumpl Date: Fri, 3 Dec 2010 13:17:26 +0000 Subject: [PATCH] Related: rhbz#442980 --- ...s-libiscsi-partial-offload-discovery.patch | 166 ++++++++++++++++++ iscsi-initiator-utils.spec | 9 +- 2 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 iscsi-initiator-utils-libiscsi-partial-offload-discovery.patch diff --git a/iscsi-initiator-utils-libiscsi-partial-offload-discovery.patch b/iscsi-initiator-utils-libiscsi-partial-offload-discovery.patch new file mode 100644 index 0000000..efbf5c2 --- /dev/null +++ b/iscsi-initiator-utils-libiscsi-partial-offload-discovery.patch @@ -0,0 +1,166 @@ +From c4331b7523afccba5176797901209a9d03afa997 Mon Sep 17 00:00:00 2001 +From: Ales Kozumplik +Date: Thu, 18 Nov 2010 17:13:36 +0100 +Subject: [PATCH] libiscsi: reimplement fw discovery so partial devices are used properly. + +Related: rhbz#442980 +--- + libiscsi/libiscsi.c | 120 ++++++++++++++++++++++++++++++-------------------- + 1 files changed, 72 insertions(+), 48 deletions(-) + +diff --git a/libiscsi/libiscsi.c b/libiscsi/libiscsi.c +index 19eae58..626e67c 100644 +--- a/libiscsi/libiscsi.c ++++ b/libiscsi/libiscsi.c +@@ -93,6 +93,16 @@ void libiscsi_cleanup(struct libiscsi_context *context) + free(context); + } + ++static void free_iface_list(struct list_head *ifaces) ++{ ++ struct iface_rec *iface, *tmp_iface; ++ ++ list_for_each_entry_safe(iface, tmp_iface, ifaces, list) { ++ list_del(&iface->list); ++ free(iface); ++ } ++} ++ + static void free_rec_list(struct list_head *rec_list) + { + struct node_rec *rec, *tmp; +@@ -188,69 +198,83 @@ leave: + int libiscsi_discover_firmware(struct libiscsi_context *context, + int *nr_found, struct libiscsi_node **found_nodes) + { +- struct boot_context fw_entry; +- struct node_rec rec; ++ struct list_head targets, ifaces, rec_list; ++ discovery_rec_t drec; + int rc = 0; + +- if (nr_found) ++ INIT_LIST_HEAD(&targets); ++ INIT_LIST_HEAD(&ifaces); ++ INIT_LIST_HEAD(&rec_list); ++ ++ if (nr_found) { + *nr_found = 0; +- if (found_nodes) ++ } ++ ++ if (found_nodes) { + *found_nodes = NULL; ++ } + +- memset(&fw_entry, 0, sizeof fw_entry); +- rc = fw_get_entry(&fw_entry); ++ rc = fw_get_targets(&targets); + if (rc) { +- strcpy(context->error_str, "Could not read fw values."); ++ log_error("%s: Could not get list of targets from firmware " ++ "(err %d).\n", __func__, rc); + return rc; + } + +- memset(&rec, 0, sizeof rec); +- idbm_node_setup_defaults(&rec); +- +- strlcpy(rec.name, fw_entry.targetname, TARGET_NAME_MAXLEN); +- rec.tpgt = 1; +- strlcpy(rec.conn[0].address, fw_entry.target_ipaddr, NI_MAXHOST); +- rec.conn[0].port = fw_entry.target_port; +- +- iface_setup_defaults(&rec.iface); +- strncpy(rec.iface.iname, fw_entry.initiatorname, +- sizeof(fw_entry.initiatorname)); +- strncpy(rec.session.auth.username, fw_entry.chap_name, +- sizeof(fw_entry.chap_name)); +- strncpy((char *)rec.session.auth.password, fw_entry.chap_password, +- sizeof(fw_entry.chap_password)); +- strncpy(rec.session.auth.username_in, fw_entry.chap_name_in, +- sizeof(fw_entry.chap_name_in)); +- strncpy((char *)rec.session.auth.password_in, +- fw_entry.chap_password_in, +- sizeof(fw_entry.chap_password_in)); +- rec.session.auth.password_length = +- strlen((char *)fw_entry.chap_password); +- rec.session.auth.password_in_length = +- strlen((char *)fw_entry.chap_password_in); +- +- CHECK(idbm_add_node(&rec, NULL, 1 /* overwrite */)) ++ CHECK(iface_create_ifaces_from_boot_contexts(&ifaces, &targets)); ++ ++ memset(&drec, 0, sizeof(drec)); ++ drec.type = DISCOVERY_TYPE_FW; ++ rc = idbm_bind_ifaces_to_nodes(discovery_fw, &drec, &ifaces, &rec_list); ++ if (rc) { ++ log_error("%s: Could not determine target nodes from firmware " ++ "(err %d).\n", __func__, rc); ++ goto leave; ++ } ++ ++ int node_count = 0; ++ struct list_head *pos; ++ list_for_each(pos, &rec_list) { ++ ++node_count; ++ } + +- if (nr_found) +- *nr_found = 1; ++ struct libiscsi_node* new_nodes; ++ /* allocate enough space for all the nodes */ ++ new_nodes = calloc(node_count, sizeof *new_nodes); ++ if (new_nodes == NULL) { ++ rc = ENOMEM; ++ log_error("%s: %s.\n", __func__, strerror(ENOMEM)); ++ goto leave; ++ } ++ ++ struct node_rec *rec; ++ struct libiscsi_node *new_node = new_nodes; ++ /* in one loop, add nodes to idbm and create libiscsi_node entries */ ++ list_for_each_entry(rec, &rec_list, list) { ++ CHECK(idbm_add_node(rec, NULL, 1 /* overwrite */)); ++ ++ strlcpy(new_node->name, rec->name, LIBISCSI_VALUE_MAXLEN); ++ new_node->tpgt = rec->tpgt; ++ strlcpy(new_node->address, rec->conn[0].address, NI_MAXHOST); ++ new_node->port = rec->conn[0].port; ++ ++ ++new_node; ++ } + ++ /* update output parameters */ ++ if (nr_found) { ++ *nr_found = node_count; ++ } + if (found_nodes) { +- *found_nodes = calloc(1, sizeof **found_nodes); +- if (*found_nodes == NULL) { +- snprintf(context->error_str, +- sizeof(context->error_str), strerror(ENOMEM)); +- rc = ENOMEM; +- goto leave; +- } +- strlcpy((*found_nodes)[0].name, rec.name, +- LIBISCSI_VALUE_MAXLEN); +- (*found_nodes)[0].tpgt = rec.tpgt; +- strlcpy((*found_nodes)[0].address, +- rec.conn[0].address, NI_MAXHOST); +- (*found_nodes)[0].port = rec.conn[0].port; ++ *found_nodes = new_nodes; + } + + leave: ++ fw_free_targets(&targets); ++ ++ free_iface_list(&ifaces); ++ free_rec_list(&rec_list); ++ + return rc; + } + +-- +1.7.3.2 + diff --git a/iscsi-initiator-utils.spec b/iscsi-initiator-utils.spec index 9c8ed8e..7f002a8 100644 --- a/iscsi-initiator-utils.spec +++ b/iscsi-initiator-utils.spec @@ -3,7 +3,7 @@ Summary: iSCSI daemon and utility programs Name: iscsi-initiator-utils Version: 6.2.0.872 -Release: 12%{?dist} +Release: 13%{?dist} Source0: http://people.redhat.com/mchristi/iscsi/rhel6.0/source/open-iscsi-2.0-872-rc4-bnx2i.tar.gz Source1: iscsid.init Source2: iscsidevs.init @@ -42,6 +42,9 @@ Patch14: iscsi-initiator-utils-log-login-failed.patch Patch15: iscsi-initiator-utils-uio-handle-different-iface_rec.patch # Remove the OFFLOAD_BOOT_SUPPORTED #ifdef. Patch16: iscsi-initiator-utils-remove-the-offload-boot-supported-ifdef.patch +# libiscsi: reimplement fw discovery so partial devices are used properly. +Patch17: iscsi-initiator-utils-libiscsi-partial-offload-discovery.patch + Group: System Environment/Daemons License: GPLv2+ @@ -86,6 +89,7 @@ developing applications that use %{name}. %patch14 -p1 -b .log-login-failed %patch15 -p1 -b .uio-different-iface %patch16 -p1 -b .offload-boot-supported +%patch17 -p1 -b .libiscsi-partial-offload %build cd utils/open-isns @@ -204,6 +208,9 @@ fi %{_includedir}/libiscsi.h %changelog +* Fri Dec 3 2010 Ales Kozumplik 6.2.0.872.13 +- 442980 libiscsi: reimplement fw discovery so partial devices are used properly. + * Tue Nov 30 2010 Ales Kozumplik 6.2.0.872.12 - 442980 partial offload boot: Remove the OFFLOAD_BOOT_SUPPORTED ifdef. This effectively makes OFFLOAD_BOOT_SUPPORTED always enabled.