d3c3ab
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
d3c3ab
From: Diego Domingos <diegdo@br.ibm.com>
d3c3ab
Date: Thu, 24 Mar 2022 13:14:42 -0400
d3c3ab
Subject: [PATCH] make ofdisk_retries optional
d3c3ab
d3c3ab
The feature Retry on Fail added to GRUB can cause a LPM to take
d3c3ab
longer if the SAN is slow.
d3c3ab
d3c3ab
When a LPM to external site occur, the path of the disk can change
d3c3ab
and thus the disk search function on grub can take some time since
d3c3ab
it is used as a hint. This can cause the Retry on Fail feature to
d3c3ab
try to access the disk 20x times (since this is hardcoded number)
d3c3ab
and, if the SAN is slow, the boot time can increase a lot.
d3c3ab
In some situations not acceptable.
d3c3ab
d3c3ab
The following patch enables a configuration at user space of the
d3c3ab
maximum number of retries we want for this feature.
d3c3ab
d3c3ab
The variable ofdisk_retries should be set using grub2-editenv
d3c3ab
and will be checked by retry function. If the variable is not set,
d3c3ab
so the default number of retries will be used instead.
d3c3ab
---
d3c3ab
 include/grub/ieee1275/ofdisk.h | 7 ++++++-
d3c3ab
 1 file changed, 6 insertions(+), 1 deletion(-)
d3c3ab
d3c3ab
diff --git a/include/grub/ieee1275/ofdisk.h b/include/grub/ieee1275/ofdisk.h
d3c3ab
index 7d2d540930..0074d55eee 100644
d3c3ab
--- a/include/grub/ieee1275/ofdisk.h
d3c3ab
+++ b/include/grub/ieee1275/ofdisk.h
d3c3ab
@@ -25,7 +25,12 @@ extern void grub_ofdisk_fini (void);
d3c3ab
 #define MAX_RETRIES 20
d3c3ab
 
d3c3ab
 
d3c3ab
-#define RETRY_IEEE1275_OFDISK_OPEN(device, last_ihandle) unsigned retry_i=0;for(retry_i=0; retry_i < MAX_RETRIES; retry_i++){ \
d3c3ab
+#define RETRY_IEEE1275_OFDISK_OPEN(device, last_ihandle) \
d3c3ab
+	                                        unsigned max_retries = MAX_RETRIES; \
d3c3ab
+                                                if(grub_env_get("ofdisk_retries") != NULL) \
d3c3ab
+                                                     max_retries = grub_strtoul(grub_env_get("ofdisk_retries"), 0, 10)+1; \
d3c3ab
+                                                grub_dprintf("ofdisk","MAX_RETRIES set to %u\n",max_retries); \
d3c3ab
+                                                unsigned retry_i=0;for(retry_i=0; retry_i < max_retries; retry_i++){ \
d3c3ab
 						if(!grub_ieee1275_open(device, last_ihandle)) \
d3c3ab
 						break; \
d3c3ab
 						grub_dprintf("ofdisk","Opening disk %s failed. Retrying...\n",device); }