SHA256
1
0
forked from pool/grub2

Accepting request 714588 from home:michals

- Fix iteration of FCP LUNs (bsc#1134287, bsc#1139345, LTC#177836, LTC#174229).
  * Refresh grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch

OBS-URL: https://build.opensuse.org/request/show/714588
OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=336
This commit is contained in:
Michael Chang 2019-07-11 09:24:54 +00:00 committed by Git OBS Bridge
parent 6b8bc36c6d
commit 709d1a1049
2 changed files with 117 additions and 106 deletions

View File

@ -1,6 +1,6 @@
From a7a3ad361b4a75d052e9b4389b44a9f3848f3b9f Mon Sep 17 00:00:00 2001 From 3540ebd05d545ba8f55b0f94983aeb82ad9232f3 Mon Sep 17 00:00:00 2001
From: Diego Domingos <diegodo@linux.vnet.ibm.com> From: Diego Domingos <diegodo@br.ibm.com>
Date: Fri, 10 Aug 2018 16:29:50 -0400 Date: Mon, 24 Jun 2019 10:15:56 -0400
Subject: [PATCH] ieee1275: implement FCP methods for WWPN and LUNs Subject: [PATCH] ieee1275: implement FCP methods for WWPN and LUNs
This patch enables the fcp-targets and fcp-luns methods which are This patch enables the fcp-targets and fcp-luns methods which are
@ -9,133 +9,138 @@ responsible to get WWPNs and LUNs for fibre channel devices.
Those methods are specially necessary if the boot directory and grub Those methods are specially necessary if the boot directory and grub
installation are in different FCP disks, allowing the dev_iterate() installation are in different FCP disks, allowing the dev_iterate()
to find the WWPNs and LUNs when called by searchfs.uuid tool. to find the WWPNs and LUNs when called by searchfs.uuid tool.
Signed-off-by: Diego Domingos <diegodo@linux.vnet.ibm.com>
--- ---
grub-core/disk/ieee1275/ofdisk.c | 109 ++++++++++++++++++++++++++++++++++++++- grub-core/disk/ieee1275/ofdisk.c | 117 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 108 insertions(+), 1 deletion(-) 1 file changed, 116 insertions(+), 1 deletion(-)
Index: grub-2.02/grub-core/disk/ieee1275/ofdisk.c diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
=================================================================== index 235c0fe..eb907c3 100644
--- grub-2.02.orig/grub-core/disk/ieee1275/ofdisk.c --- a/grub-core/disk/ieee1275/ofdisk.c
+++ grub-2.02/grub-core/disk/ieee1275/ofdisk.c +++ b/grub-core/disk/ieee1275/ofdisk.c
@@ -209,7 +209,118 @@ dev_iterate_real (const char *name, cons @@ -209,7 +209,122 @@ dev_iterate_real (const char *name, const char *path)
static void static void
dev_iterate (const struct grub_ieee1275_devalias *alias) dev_iterate (const struct grub_ieee1275_devalias *alias)
{ {
- if (grub_strcmp (alias->type, "vscsi") == 0) - if (grub_strcmp (alias->type, "vscsi") == 0)
+ if (grub_strcmp (alias->type, "fcp") == 0){ + if (grub_strcmp (alias->type, "fcp") == 0)
+ {
+ +
+ /* If we are dealing with fcp devices, we need + /* If we are dealing with fcp devices, we need
+ * to find the WWPNs and LUNs to iterate them */ + * to find the WWPNs and LUNs to iterate them */
+ grub_ieee1275_ihandle_t ihandle; + grub_ieee1275_ihandle_t ihandle;
+ grub_uint64_t *ptr_targets, *ptr_luns; + grub_uint64_t *ptr_targets, *ptr_luns, k, l;
+ unsigned int i, j, pos; + unsigned int i, j, pos;
+ char *buf, *bufptr; + char *buf, *bufptr;
+ +
+ struct set_fcp_targets_args + struct set_fcp_targets_args
+ { + {
+ struct grub_ieee1275_common_hdr common; + struct grub_ieee1275_common_hdr common;
+ grub_ieee1275_cell_t method; + grub_ieee1275_cell_t method;
+ grub_ieee1275_cell_t ihandle; + grub_ieee1275_cell_t ihandle;
+ grub_ieee1275_cell_t catch_result; + grub_ieee1275_cell_t catch_result;
+ grub_ieee1275_cell_t nentries; + grub_ieee1275_cell_t nentries;
+ grub_ieee1275_cell_t table; + grub_ieee1275_cell_t table;
+ } args_targets; + } args_targets;
+ +
+ struct set_fcp_luns_args + struct set_fcp_luns_args
+ { + {
+ struct grub_ieee1275_common_hdr common; + struct grub_ieee1275_common_hdr common;
+ grub_ieee1275_cell_t method; + grub_ieee1275_cell_t method;
+ grub_ieee1275_cell_t ihandle; + grub_ieee1275_cell_t ihandle;
+ grub_ieee1275_cell_t wwpn_h; + grub_ieee1275_cell_t wwpn_h;
+ grub_ieee1275_cell_t wwpn_l; + grub_ieee1275_cell_t wwpn_l;
+ grub_ieee1275_cell_t catch_result; + grub_ieee1275_cell_t catch_result;
+ grub_ieee1275_cell_t nentries; + grub_ieee1275_cell_t nentries;
+ grub_ieee1275_cell_t table; + grub_ieee1275_cell_t table;
+ } args_luns; + } args_luns;
+ +
+ if(grub_ieee1275_open (alias->path, &ihandle)) + struct args_ret
+ { + {
+ grub_dprintf("disk", "failed to open the disk while iterating FCP disk path=%s\n", alias->path); + grub_uint64_t addr;
+ return; + grub_uint64_t len;
+ } + };
+ +
+ INIT_IEEE1275_COMMON (&args_targets.common, "call-method", 2, 3); + if(grub_ieee1275_open (alias->path, &ihandle))
+ args_targets.method = (grub_ieee1275_cell_t) "fcp-targets"; + {
+ args_targets.ihandle = ihandle; + grub_dprintf("disk", "failed to open the disk while iterating FCP disk path=%s\n", alias->path);
+ args_targets.table = 0; + return;
+ args_targets.nentries = 0; + }
+ +
+ INIT_IEEE1275_COMMON (&args_luns.common, "call-method", 4, 3); + /* Setup the fcp-targets method to call via pfw*/
+ args_luns.method = (grub_ieee1275_cell_t) "fcp-luns"; + INIT_IEEE1275_COMMON (&args_targets.common, "call-method", 2, 3);
+ args_luns.ihandle = ihandle; + args_targets.method = (grub_ieee1275_cell_t) "fcp-targets";
+ args_luns.table = 0; + args_targets.ihandle = ihandle;
+ args_luns.nentries = 0;
+ +
+ if (IEEE1275_CALL_ENTRY_FN (&args_targets) == -1) + /* Setup the fcp-luns method to call via pfw */
+ { + INIT_IEEE1275_COMMON (&args_luns.common, "call-method", 4, 3);
+ grub_dprintf("disk", "failed to get the targets while iterating FCP disk path=%s\n", alias->path); + args_luns.method = (grub_ieee1275_cell_t) "fcp-luns";
+ grub_ieee1275_close(ihandle); + args_luns.ihandle = ihandle;
+ return;
+ }
+ +
+ buf = grub_malloc (grub_strlen (alias->path) + 32 + 32); + if (IEEE1275_CALL_ENTRY_FN (&args_targets) == -1)
+ {
+ grub_dprintf("disk", "failed to get the targets while iterating FCP disk path=%s\n", alias->path);
+ grub_ieee1275_close(ihandle);
+ return;
+ }
+ +
+ if (!buf) + buf = grub_malloc (grub_strlen (alias->path) + 32 + 32);
+ {
+ grub_ieee1275_close(ihandle);
+ return;
+ }
+ +
+ bufptr = grub_stpcpy (buf, alias->path); + if (!buf)
+ {
+ grub_ieee1275_close(ihandle);
+ return;
+ }
+ +
+ /* For each WWPN discovered we need to find his associated LUNS + bufptr = grub_stpcpy (buf, alias->path);
+ * calling the fcp-luns method */
+ for (i=0; i< args_targets.nentries; i++)
+ {
+ ptr_targets = *(grub_uint64_t **) (args_targets.table + 4 + 8 * i);
+ while(*ptr_targets)
+ {
+ args_luns.wwpn_l = (grub_ieee1275_cell_t) (*ptr_targets);
+ args_luns.wwpn_h = (grub_ieee1275_cell_t) (*ptr_targets >> 32);
+ pos=grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T,
+ *ptr_targets++);
+ +
+ if (IEEE1275_CALL_ENTRY_FN (&args_luns) == -1) + /* Iterate over entries returned by pfw. Each entry contains a
+ { + * pointer to wwpn table and his length. */
+ grub_dprintf("disk", "failed to get the LUNS while iterating FCP disk path=%s\n", buf); + struct args_ret *targets_table = (struct args_ret *)(args_targets.table);
+ grub_ieee1275_close (ihandle); + for (i=0; i< args_targets.nentries; i++)
+ grub_free (buf); + {
+ return; + ptr_targets = (grub_uint64_t*)(grub_uint32_t) targets_table[i].addr;
+ } + /* Iterate over all wwpns in given table */
+ for(k=0;k<targets_table[i].len;k++)
+ {
+ args_luns.wwpn_l = (grub_ieee1275_cell_t) (*ptr_targets);
+ args_luns.wwpn_h = (grub_ieee1275_cell_t) (*ptr_targets >> 32);
+ pos=grub_snprintf (bufptr, 32, "/disk@%" PRIxGRUB_UINT64_T,
+ *ptr_targets++);
+ /* Get the luns for given wwpn target */
+ if (IEEE1275_CALL_ENTRY_FN (&args_luns) == -1)
+ {
+ grub_dprintf("disk", "failed to get the LUNS while iterating FCP disk path=%s\n", buf);
+ grub_ieee1275_close (ihandle);
+ grub_free (buf);
+ return;
+ }
+ +
+ for(j=0;j<args_luns.nentries; j++) + struct args_ret *luns_table = (struct args_ret *)(args_luns.table);
+ {
+ ptr_luns = *(grub_uint64_t **) (args_luns.table + 4 + 8*j);
+ +
+ do + /* Iterate over all LUNs */
+ { + for(j=0;j<args_luns.nentries; j++)
+ if (*ptr_luns == 0) + {
+ { + ptr_luns = (grub_uint64_t*) (grub_uint32_t) luns_table[j].addr;
+ dev_iterate_real(buf,buf); + for(l=0;l<luns_table[j].len;l++)
+ ptr_luns++; + {
+ continue; + grub_snprintf (&bufptr[pos], 30, ",%" PRIxGRUB_UINT64_T,
+ } + *ptr_luns++);
+ grub_snprintf (&bufptr[pos], 30, ",%" PRIxGRUB_UINT64_T, + dev_iterate_real(buf,buf);
+ *ptr_luns++); + }
+ dev_iterate_real(buf,buf); + }
+ } while(*ptr_luns);
+ }
+ }
+ }
+ +
+ grub_ieee1275_close (ihandle); + }
+ grub_free (buf); + }
+ return; +
+ grub_ieee1275_close (ihandle);
+ grub_free (buf);
+ return;
+ +
+ } + }
+ else if (grub_strcmp (alias->type, "vscsi") == 0) + else if (grub_strcmp (alias->type, "vscsi") == 0)
{ {
static grub_ieee1275_ihandle_t ihandle; static grub_ieee1275_ihandle_t ihandle;
struct set_color_args struct set_color_args
--
2.16.4

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Mon Jun 24 17:56:12 UTC 2019 - Michal Suchanek <msuchanek@suse.de>
- Fix iteration of FCP LUNs (bsc#1134287, bsc#1139345, LTC#177836, LTC#174229).
* Refresh grub2-ieee1275-FCP-methods-for-WWPN-and-LUNs.patch
------------------------------------------------------------------- -------------------------------------------------------------------
Mon Jun 17 09:45:49 UTC 2019 - mchang@suse.com Mon Jun 17 09:45:49 UTC 2019 - mchang@suse.com