From 7c4885f0d79593cb0f3a7981444f611d7ced54b9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@gnu.org>
Date: Fri, 28 Nov 2014 15:08:56 +0100
Subject: [PATCH] linux-modules: Correctly propagate error code from
 'init_module'.

* gnu/packages/patches/guile-linux-syscalls.patch (scm_load_linux_module):
  Leave 'errno' unchanged when ERR != 0.
* gnu/build/linux-modules.scm (load-linux-module*): Check for the errno
  value of ARGS to determine whether the module was already loaded.
---
 gnu/build/linux-modules.scm                     | 6 +-----
 gnu/packages/patches/guile-linux-syscalls.patch | 9 ++-------
 2 files changed, 3 insertions(+), 12 deletions(-)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 0fa09b2912..a3bc7d6e33 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -160,11 +160,7 @@ module name."
     (lambda args
       ;; If this module was already loaded and we're in modprobe style, ignore
       ;; the error.
-
-      ;; FIXME: Use errno once 'guile-linux-syscalls.patch' provides a useful
-      ;; errno here.
-      (unless (and recursive?
-                   (module-loaded? (string-drop-right (basename file) 3)))
+      (unless (and recursive? (= EEXIST (system-error-errno args)))
         (apply throw args)))))
 
 ;;; linux-modules.scm ends here
diff --git a/gnu/packages/patches/guile-linux-syscalls.patch b/gnu/packages/patches/guile-linux-syscalls.patch
index 1fb24bde27..57c7f2589d 100644
--- a/gnu/packages/patches/guile-linux-syscalls.patch
+++ b/gnu/packages/patches/guile-linux-syscalls.patch
@@ -7,7 +7,7 @@ diff --git a/libguile/posix.c b/libguile/posix.c
 index 324f21b..cbee94d 100644
 --- a/libguile/posix.c
 +++ b/libguile/posix.c
-@@ -2286,6 +2286,266 @@ scm_init_popen (void)
+@@ -2286,6 +2286,261 @@ scm_init_popen (void)
  }
  #endif
  
@@ -84,12 +84,7 @@ index 324f21b..cbee94d 100644
 +  free (c_options);
 +
 +  if (err != 0)
-+    {
-+      /* XXX: `insmod' actually provides better translation of some of
-+	 the error codes.  */
-+      errno = err;
-+      SCM_SYSERROR;
-+    }
++    SCM_SYSERROR;
 +
 +  return SCM_UNSPECIFIED;
 +}