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