Openfirmware block device drivers do not allow for multiple concurrent opens of the same device. It simply does not work.
Fortunately grub doesn't actually need to do this, it just happens to do so. Here is the fix for the case of module dependency handling. The other case that hits this problem is in the FS_UUID support code. I have patches later which will fix that case too, but that one is a little more involved as we have to fix some bugs in the the ieee1275 devalias iterator first (for one, it doesn't stop when the callback returns non-zero as every other iterator in grub2 does). 2009-04-12 David S. Miller <da...@davemloft.net> * kern/dl.c (grub_dl_load_file): Close file immediately when we are done using it. --- kern/dl.c | 28 +++++++++++++++++++--------- 1 files changed, 19 insertions(+), 9 deletions(-) diff --git a/kern/dl.c b/kern/dl.c index bc21403..458ad58 100644 --- a/kern/dl.c +++ b/kern/dl.c @@ -584,7 +584,7 @@ grub_dl_load_core (void *addr, grub_size_t size) grub_dl_t grub_dl_load_file (const char *filename) { - grub_file_t file; + grub_file_t file = NULL; grub_ssize_t size; void *core = 0; grub_dl_t mod = 0; @@ -596,21 +596,31 @@ grub_dl_load_file (const char *filename) size = grub_file_size (file); core = grub_malloc (size); if (! core) - goto failed; + { + grub_file_close (file); + return 0; + } if (grub_file_read (file, core, size) != (int) size) - goto failed; + { + grub_file_close (file); + grub_free (core); + return 0; + } + + /* We must close this before we try to process dependencies. + Some disk backends do not handle gracefully multiple concurrent + opens of the same device. */ + grub_file_close (file); mod = grub_dl_load_core (core, size); if (! mod) - goto failed; + { + grub_free (core); + return 0; + } mod->ref_count = 0; - - failed: - grub_file_close (file); - grub_free (core); - return mod; } -- 1.6.2.3 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel