GNU logs - #30604, boring messages


Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 0/4] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 25 Feb 2018 11:47:02 +0000
Resent-Message-ID: <handler.30604.B.151955917913864 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: report 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
X-Debbugs-Original-To: guix-patches@HIDDEN
Received: via spool by submit <at> debbugs.gnu.org id=B.151955917913864
          (code B ref -1); Sun, 25 Feb 2018 11:47:02 +0000
Received: (at submit) by debbugs.gnu.org; 25 Feb 2018 11:46:19 +0000
Received: from localhost ([127.0.0.1]:59472 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1epul0-0003bY-Pu
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:46:18 -0500
Received: from eggs.gnu.org ([208.118.235.92]:34572)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1epuky-0003bL-N7
 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:46:16 -0500
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <dannym@HIDDEN>) id 1epuks-0005mv-Ge
 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:46:11 -0500
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=disabled
 version=3.3.2
Received: from lists.gnu.org ([2001:4830:134:3::11]:44986)
 by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32)
 (Exim 4.71) (envelope-from <dannym@HIDDEN>)
 id 1epuks-0005mo-D4
 for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:46:10 -0500
Received: from eggs.gnu.org ([2001:4830:134:3::10]:53771)
 by lists.gnu.org with esmtp (Exim 4.71)
 (envelope-from <dannym@HIDDEN>) id 1epukr-0000g8-A7
 for guix-patches@HIDDEN; Sun, 25 Feb 2018 06:46:10 -0500
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <dannym@HIDDEN>) id 1epuko-0005kt-6v
 for guix-patches@HIDDEN; Sun, 25 Feb 2018 06:46:09 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:39928)
 by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)
 (Exim 4.71) (envelope-from <dannym@HIDDEN>)
 id 1epukn-0005kZ-VY
 for guix-patches@HIDDEN; Sun, 25 Feb 2018 06:46:06 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 5BFF33360249;
 Sun, 25 Feb 2018 12:46:04 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun, 25 Feb 2018 12:45:57 +0100
Message-Id: <20180225114557.816-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
 [fuzzy]
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x
X-Received-From: 2001:4830:134:3::11
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

Danny Milosavljevic (4):
  gnu: kmod: Split off kmod-minimal.
  gnu: Add kmod-minimal-static.
  linux-initrd: Add kmod.
  linux-boot: Load kernel modules only when the hardware is present.

 gnu/build/linux-boot.scm    | 24 ++++++++++--
 gnu/build/linux-initrd.scm  | 13 ++++++-
 gnu/packages/linux.scm      | 91 +++++++++++++++++++++++++++++++++++++--------
 gnu/system/linux-initrd.scm | 52 ++++++++++++++++++++------
 4 files changed, 148 insertions(+), 32 deletions(-)





Message sent:


Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-Mailer: MIME-tools 5.505 (Entity 5.505)
Content-Type: text/plain; charset=utf-8
X-Loop: help-debbugs@HIDDEN
From: help-debbugs@HIDDEN (GNU bug Tracking System)
To: Danny Milosavljevic <dannym@HIDDEN>
Subject: bug#30604: Acknowledgement ([PATCH 0/4] Load Linux module only
 when supported hardware is present.)
Message-ID: <handler.30604.B.151955917913864.ack <at> debbugs.gnu.org>
References: <20180225114557.816-1-dannym@HIDDEN>
X-Gnu-PR-Message: ack 30604
X-Gnu-PR-Package: guix-patches
X-Gnu-PR-Keywords: patch
Reply-To: 30604 <at> debbugs.gnu.org
Date: Sun, 25 Feb 2018 11:47:03 +0000

Thank you for filing a new bug report with debbugs.gnu.org.

This is an automatically generated reply to let you know your message
has been received.

Your message is being forwarded to the package maintainers and other
interested parties for their attention; they will reply in due course.

Your message has been sent to the package maintainer(s):
 guix-patches@HIDDEN

If you wish to submit further information on this problem, please
send it to 30604 <at> debbugs.gnu.org.

Please do not send mail to help-debbugs@HIDDEN unless you wish
to report a problem with the Bug-tracking system.

--=20
30604: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D30604
GNU Bug Tracking System
Contact help-debbugs@HIDDEN with problems


Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 1/4] gnu: kmod: Split off kmod-minimal.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 25 Feb 2018 11:49:02 +0000
Resent-Message-ID: <handler.30604.B30604.151955931414109 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151955931414109
          (code B ref 30604); Sun, 25 Feb 2018 11:49:02 +0000
Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 11:48:34 +0000
Received: from localhost ([127.0.0.1]:59478 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1epunC-0003fU-6s
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:34 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:58676)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1epunA-0003fG-5q
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:32 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 809413360249;
 Sun, 25 Feb 2018 12:48:30 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun, 25 Feb 2018 12:48:13 +0100
Message-Id: <20180225114816.869-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180225114557.816-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal): New variable.
(kmod): Modify.
---
 gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 16 deletions(-)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 238398e84..1f8bf3050 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1933,8 +1933,35 @@ for systems using the Linux kernel.  This includes commands such as
 to use Linux' inotify mechanism, which allows file accesses to be monitored.")
     (license license:gpl2+)))
 
-(define-public kmod
+(define kmod-minimal
   (package
+    (name "kmod-minimal")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f)) ; FIXME: Investigate test failures
+    (home-page "https://www.kernel.org/")
+    (synopsis "Kernel module tools")
+    (description "Kmod is a set of tools to handle common tasks with Linux
+kernel modules like insert, remove, list, check properties, resolve
+dependencies and aliases.
+
+These tools are designed on top of libkmod, a library that is shipped with
+kmod.  The aim is to be compatible with tools, configurations and indices
+from the module-init-tools project.")
+    (license license:gpl2+))) ; library under lgpl2.1+
+
+(define-public kmod
+  (package (inherit kmod-minimal)
     (name "kmod")
     (version "24")
     (source (origin
@@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                (base32
                 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1"))
               (patches (search-patches "kmod-module-directory.patch"))))
-    (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
      `(("xz" ,xz)
        ("zlib" ,zlib)))
     (arguments
-     `(#:tests? #f ; FIXME: Investigate test failures
-       #:configure-flags '("--with-xz" "--with-zlib")
+     `(#:configure-flags '("--with-xz" "--with-zlib")
+       #:tests? #f ; FIXME: Investigate test failures
        #:phases (alist-cons-after
                  'install 'install-modprobe&co
                  (lambda* (#:key outputs #:allow-other-keys)
@@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                                  (symlink "kmod"
                                           (string-append bin "/" tool)))
                                '("insmod" "rmmod" "lsmod" "modprobe"
-                                 "modinfo" "depmod"))))
-                 %standard-phases)))
-    (home-page "https://www.kernel.org/")
-    (synopsis "Kernel module tools")
-    (description "Kmod is a set of tools to handle common tasks with Linux
-kernel modules like insert, remove, list, check properties, resolve
-dependencies and aliases.
-
-These tools are designed on top of libkmod, a library that is shipped with
-kmod.  The aim is to be compatible with tools, configurations and indices
-from the module-init-tools project.")
-    (license license:gpl2+))) ; library under lgpl2.1+
+                                 "modinfo" "depmod"))
+                     #t))
+                 %standard-phases)))))
 
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 2/4] gnu: Add kmod-minimal-static.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 25 Feb 2018 11:49:02 +0000
Resent-Message-ID: <handler.30604.B30604.151955931614128 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151955931614128
          (code B ref 30604); Sun, 25 Feb 2018 11:49:02 +0000
Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 11:48:36 +0000
Received: from localhost ([127.0.0.1]:59481 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1epunE-0003fk-Fu
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:36 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:58684)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1epunB-0003fN-9G
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:33 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 39A63336028A;
 Sun, 25 Feb 2018 12:48:32 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun, 25 Feb 2018 12:48:14 +0100
Message-Id: <20180225114816.869-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180225114816.869-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180225114816.869-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal/static): New variable.
---
 gnu/packages/linux.scm | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 1f8bf3050..b2e47f79a 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1994,6 +1994,50 @@ from the module-init-tools project.")
                      #t))
                  %standard-phases)))))
 
+(define-public kmod-minimal/static
+  (static-package
+   (package (inherit kmod-minimal)
+    (name "kmod-minimal-static")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (arguments
+     (substitute-keyword-arguments
+       (package-arguments (static-package kmod-minimal))
+       ((#:configure-flags flags ''())
+        `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags))
+       ((#:make-flags flags ''())
+        `(cons* "LDFLAGS=-all-static" ,flags))
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+          (delete 'install-license-files)
+          (add-after 'unpack 'patch-kmod
+           (lambda _
+             ;; Reduce size by 200 kiB.
+             (substitute* "tools/kmod.c"
+              (("[&]kmod_cmd_compat_lsmod,") "")
+              (("[&]kmod_cmd_compat_rmmod,") "")
+              (("[&]kmod_cmd_compat_insmod,") "")
+              (("[&]kmod_cmd_compat_modinfo,") ""))
+             #t))
+          (replace 'install
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (bin (string-append out "/bin")))
+                (install-file "tools/kmod" bin)
+                (for-each
+                 (lambda (tool)
+                   (symlink "kmod" (string-append bin "/" tool)))
+                 '("modprobe" "depmod"))
+                #t))))))))))
+
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.
   (package




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 3/4] linux-initrd: Add kmod.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 25 Feb 2018 11:49:03 +0000
Resent-Message-ID: <handler.30604.B30604.151955932014141 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151955932014141
          (code B ref 30604); Sun, 25 Feb 2018 11:49:03 +0000
Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 11:48:40 +0000
Received: from localhost ([127.0.0.1]:59484 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1epunH-0003fz-Ol
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:40 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:58694)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1epunD-0003fc-34
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:35 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 03F9D3360249;
 Sun, 25 Feb 2018 12:48:33 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun, 25 Feb 2018 12:48:15 +0100
Message-Id: <20180225114816.869-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180225114816.869-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180225114816.869-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (raw-initrd): Add kmod.
(base-initrd): Add kmod.
(expression->initrd): Add kmod, linux-module-directory.
(flat-linux-module-directory): Add kmod; invoke depmod.
* gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory.
---
 gnu/build/linux-initrd.scm  | 13 +++++++++++-
 gnu/system/linux-initrd.scm | 48 ++++++++++++++++++++++++++++++++++-----------
 2 files changed, 49 insertions(+), 12 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..52cc180b4 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init kmod linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,17 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+    ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (if kmod
+        (begin
+          (mkdir-p "sbin")
+          (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe")))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 7170d1c0e..93089a869 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -59,6 +59,8 @@
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             kmod
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
+                        #:kmod #$kmod
+                        #:linux-module-directory #$linux-module-directory
                         ;; Copy everything INIT refers to into the initrd.
                         #:references-graphs '("closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
@@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (gexp->derivation name builder
                     #:references-graphs `(("closure" ,init))))
 
-(define (flat-linux-module-directory linux modules)
+(define (flat-linux-module-directory linux modules kmod)
   "Return a flat directory containing the Linux kernel modules listed in
 MODULES and taken from LINUX."
   (define build-exp
@@ -109,7 +113,7 @@ MODULES and taken from LINUX."
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex)
+          (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw)
                        (srfi srfi-1)
                        (guix build utils)
                        (gnu build linux-modules))
@@ -138,13 +142,30 @@ MODULES and taken from LINUX."
                       (recursive-module-dependencies modules
                                                      #:lookup-module lookup))))
 
-          (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
+          (define version
+            (car
+             (filter
+              (lambda (name)
+                (not (string-prefix? "." name)))
+              (scandir module-dir))))
+
+          (display "VERSION")
+          (display version)
+          (newline)
+
+          (let ((output (string-append #$output "/lib/modules/" version)))
+            (mkdir-p output)
+            (for-each (lambda (module)
+                        (format #t "copying '~a'...~%" module)
+                        (copy-file module
+                                   (string-append output "/"
+                                                  (basename module))))
+                      (delete-duplicates modules)))
+          (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output
+                  ; -E
+                  "-F" (string-append #$linux "/System.map")
+                  version)
+          #t)))
 
   (computed-file "linux-modules" build-exp))
 
@@ -152,6 +173,7 @@ MODULES and taken from LINUX."
                       #:key
                       (linux linux-libre)
                       (linux-modules '())
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       (helper-packages '())
                       qemu-networking?
@@ -185,7 +207,7 @@ upon error."
          mapped-devices))
 
   (define kodir
-    (flat-linux-module-directory linux linux-modules))
+    (flat-linux-module-directory linux linux-modules kmod))
 
   (expression->initrd
    (with-imported-modules (source-module-closure
@@ -223,6 +245,8 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:kmod kmod
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))
@@ -245,6 +269,7 @@ FILE-SYSTEMS."
 (define* (base-initrd file-systems
                       #:key
                       (linux linux-libre)
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       qemu-networking?
                       volatile-root?
@@ -322,8 +347,9 @@ loaded at boot time in the order in which they appear."
   (raw-initrd file-systems
               #:linux linux
               #:linux-modules linux-modules
+              #:kmod kmod
               #:mapped-devices mapped-devices
-              #:helper-packages helper-packages
+              #:helper-packages (cons kmod helper-packages)
               #:qemu-networking? qemu-networking?
               #:volatile-root? volatile-root?
               #:on-error on-error))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 4/4] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 25 Feb 2018 11:49:03 +0000
Resent-Message-ID: <handler.30604.B30604.151955932014147 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151955932014147
          (code B ref 30604); Sun, 25 Feb 2018 11:49:03 +0000
Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 11:48:40 +0000
Received: from localhost ([127.0.0.1]:59486 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1epunI-0003g2-2v
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:40 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:58702)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1epunE-0003fj-Bl
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 06:48:36 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 286F2336028A;
 Sun, 25 Feb 2018 12:48:35 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun, 25 Feb 2018 12:48:16 +0100
Message-Id: <20180225114816.869-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180225114816.869-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180225114816.869-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 24 ++++++++++++++++++++----
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..65c91c50f 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -473,6 +473,25 @@ upon error."
     (string-append linux-module-directory "/"
                    (ensure-dot-ko name)))
 
+  (define (load-kernel-modules)
+    (define enter?
+      (const #t))
+    (file-system-fold
+     enter?
+     ;; This is the Leaf handler.  It tries to modprobe all the modaliases.
+     (lambda (path stat result) ; leaf
+       (let ((modalias-name (string-append path "/modalias")))
+         (if (file-exists? modalias-name)
+             (let ((modalias (call-with-input-file modalias-name read-string)))
+               (if (not (string=? modalias ""))
+                   (system* "/sbin/modprobe" "-q" "--" modalias))))))
+     (const #t) ; down
+     (const #t) ; up
+     (const #f) ; skip
+     (const #f) ; error
+     #f ; init
+     "/sys/devices"))
+
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
 
@@ -486,10 +505,7 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 93089a869..573f4a324 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -228,7 +228,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 3/4] linux-initrd: Add kmod.
Resent-From: Mathieu Othacehe <m.othacehe@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 25 Feb 2018 14:06:02 +0000
Resent-Message-ID: <handler.30604.B30604.15195675351332 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15195675351332
          (code B ref 30604); Sun, 25 Feb 2018 14:06:02 +0000
Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 14:05:35 +0000
Received: from localhost ([127.0.0.1]:59541 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1epwvm-0000LL-S9
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 09:05:35 -0500
Received: from mail-wm0-f41.google.com ([74.125.82.41]:33180)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <m.othacehe@HIDDEN>) id 1epwvk-0000Ky-6R
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 09:05:32 -0500
Received: by mail-wm0-f41.google.com with SMTP id s206so13397552wme.0
 for <30604 <at> debbugs.gnu.org>; Sun, 25 Feb 2018 06:05:32 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=references:user-agent:from:to:cc:subject:in-reply-to:date
 :message-id:mime-version;
 bh=eE8g9rlXxJtiMzrcCfh8ctgXBw/SVaPMsMpJ+nRtbAw=;
 b=pW0SFX+4WL/WOab00IB+iC5SmuJ3IWWDpKAr4jdLVEFwBZ0kzb+HCLj69WgWfC2r+O
 7dJ+o92bNkPE3BOiNXrpbCBdfYzetyqLOojlp4k1VWEwzIwwVhwHtxC01FYdRDbdWPGo
 jy5qyG+ivvEtz1bF+oP2QrVmP5xN29sCf6qJW6FqEBoicruE9KsbhMMqYrCIuuXq9CdX
 noGUsddPISy/7HHwpclsCAXE5SUw5vmBdS1sZiAkD1FhAPtF9ed38AE9L2hbajEA+7fT
 48KyGtiw2X2l6hsFjyvAi82hMbt/3mmFjRfS22+AJjCTV6Gz79RLnuY+1f9cbgkJNpYK
 Sijw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:references:user-agent:from:to:cc:subject
 :in-reply-to:date:message-id:mime-version;
 bh=eE8g9rlXxJtiMzrcCfh8ctgXBw/SVaPMsMpJ+nRtbAw=;
 b=eMNNxTuWCUEo1TGlmUyXeYC0tRAXDqWQ7829f8fs7E7kufWE0whSDS7OeGSuu/QqP2
 24OKs2y9LSueGmkHtYfzc+7xpwS2cuVxNpwXtVcD81hfTbAGvjG+0+ymKAusKAzmNTqj
 HPAZLTwFlvOLquTSikuYu0spcbxT7LIyKXKzBQsN5jCC7ZXgKI5P4pUVRiDkP6RnJEBd
 RVxy3ssKyb6sKr/ULoUp/9ELpEjf996ozxE2R2XWkIeSmZnjtTPyzO9d1b7g/x69nSCe
 0taFK9l2iZW6qwCSxYzQR2un59L16BJbQ3IsyQCDvGcYrWbOyFncC8OaivrmWDzPIblc
 n+eA==
X-Gm-Message-State: APf1xPDA42j8JyOM/J1GKYWtfAeYR206BILzN/ElFm9qXlYhkd3vtbRk
 g2KLWotBqJ2TgVnCu5sBiBbkHA==
X-Google-Smtp-Source: AH8x22688oTEM6HfMRXyaFrBcgT82T3TW6DAOBqgcl6IWN3em2LeJNc47qcDMYQ67dAaWI15l8JxXA==
X-Received: by 10.28.0.88 with SMTP id 85mr5817354wma.63.1519567526003;
 Sun, 25 Feb 2018 06:05:26 -0800 (PST)
Received: from cervin ([78.192.96.126])
 by smtp.gmail.com with ESMTPSA id q14sm5316150wre.83.2018.02.25.06.05.25
 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);
 Sun, 25 Feb 2018 06:05:25 -0800 (PST)
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180225114816.869-1-dannym@HIDDEN>
 <20180225114816.869-3-dannym@HIDDEN>
User-agent: mu4e 0.9.18; emacs 25.3.1
From: Mathieu Othacehe <m.othacehe@HIDDEN>
In-reply-to: <20180225114816.869-3-dannym@HIDDEN>
Date: Sun, 25 Feb 2018 15:05:24 +0100
Message-ID: <87vaelf9ln.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.0 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.0 (/)


Hi Danny,

Here are some small remarks,

> +    ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
> +    (if kmod
> +        (begin

You can use "when" to avoid "begin".

> +          (define version
> +            (car

Prefer match to car/cdr use.

> +             (filter
> +              (lambda (name)
> +                (not (string-prefix? "." name)))
> +              (scandir module-dir))))
> +
> +          (display "VERSION")
> +          (display version)
> +          (newline)

(format #t "VERSION" ~a~%" version) would be shorter.

> +                  ; -E

Why is this commented ?

> +                  "-F" (string-append #$linux "/System.map")
> +                  version)
> +          #t)))
>  

Thanks,

Mathieu




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 3/4] linux-initrd: Add kmod.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 25 Feb 2018 15:08:02 +0000
Resent-Message-ID: <handler.30604.B30604.15195712787594 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Mathieu Othacehe <m.othacehe@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15195712787594
          (code B ref 30604); Sun, 25 Feb 2018 15:08:02 +0000
Received: (at 30604) by debbugs.gnu.org; 25 Feb 2018 15:07:58 +0000
Received: from localhost ([127.0.0.1]:60535 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1epxu9-0001yP-WD
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 10:07:58 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:46008)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1epxu8-0001yH-8G
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 10:07:56 -0500
Received: from localhost (77.118.165.54.wireless.dyn.drei.com [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 9A68E33606CB;
 Sun, 25 Feb 2018 16:07:54 +0100 (CET)
Date: Sun, 25 Feb 2018 16:07:50 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180225160750.46bf5b50@HIDDEN>
In-Reply-To: <87vaelf9ln.fsf@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180225114816.869-1-dannym@HIDDEN>
 <20180225114816.869-3-dannym@HIDDEN>
 <87vaelf9ln.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Hi Mathieu,

thanks for the review.

On Sun, 25 Feb 2018 15:05:24 +0100
Mathieu Othacehe <m.othacehe@HIDDEN> wrote:

> > +                  ; -E  
> 
> Why is this commented ?

Because it's an option for specifying the location of "Module.symvers" - and
I don't know whether guix uses it (probably not).  If one doesn't specify an
option, depmod will default to the running kernel - which is not what we want.

I should elaborate in the comment that, if we start using Module.symvers, we
MUST pass "-E" there.  Maybe better to even just check for the file existence
and add it right now, otherwise we might forget later.  What do you think?




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 1/4] gnu: kmod: Split off kmod-minimal.
Resent-From: Marius Bakke <mbakke@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 01:11:01 +0000
Resent-Message-ID: <handler.30604.B30604.15196074182489 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>, 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15196074182489
          (code B ref 30604); Mon, 26 Feb 2018 01:11:01 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 01:10:18 +0000
Received: from localhost ([127.0.0.1]:60798 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eq7J4-0000e5-3C
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 20:10:18 -0500
Received: from out5-smtp.messagingengine.com ([66.111.4.29]:49367)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <mbakke@HIDDEN>) id 1eq7J2-0000dw-Ox
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 20:10:17 -0500
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
 by mailout.nyi.internal (Postfix) with ESMTP id 8399320D79;
 Sun, 25 Feb 2018 20:10:16 -0500 (EST)
Received: from frontend2 ([10.202.2.161])
 by compute5.internal (MEProxy); Sun, 25 Feb 2018 20:10:16 -0500
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fastmail.com; h=
 content-type:date:from:in-reply-to:message-id:mime-version
 :references:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s=
 fm2; bh=JZnlXr5pUawNBgTEQ2/mTtgNUVAwVHJFENtQyLoYgrE=; b=i24S8jEQ
 8t/58HRl8Sg4E73MdjrKlyiaBmmZtQZ10ffChwRBgEPaYHeqor+SDLGQ9hGyLF9p
 10g5jc/DIq8d8AznHPJjhF5CQc8jT71b7ZOiiWfe+lZuMgxGGt//MNPPOP8G0xnI
 Gbr9l0YBhbpVx3RgdtsJlvgL4wq80i7JHCrjhFyTOYiOjOyQECGq7y+M8VNlfqEV
 T/jBxQkll1ctVcxnvSxqEqiEb+ZnUcpBu3pcD3kRfYERwqrfqHs3PBq6YW3UvZGj
 S3AixT0nw4M/VNOtG4BesE8F9lDSeFiGLzpgBypNXXN40IpoQCjzt7HnTp6qS7gX
 lZ6tt/MSq1GXnQ==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
 messagingengine.com; h=content-type:date:from:in-reply-to
 :message-id:mime-version:references:subject:to:x-me-sender
 :x-me-sender:x-sasl-enc; s=fm2; bh=JZnlXr5pUawNBgTEQ2/mTtgNUVAwV
 HJFENtQyLoYgrE=; b=hE+tmTMQ4oM4lt/HggTg5+xlrASestzl4v+KKST5T8I3K
 U0SZR4qIbq1zieQAW+NUSWedXdgelUoBA/Cn+5bLXUo9wWOqAmkEyOGMwRxUYeSj
 FC3ESVjlR68wKHT/WvK3expOxG9aVLa9afFdX54ZlUlIEp4DphAfI6KES/QhYvZ4
 S33CRad8CgKXYFmgaEEUqCR3udlG7rZr5koD8px2pqcD6+yNgpTW3AqpDSHwilBl
 MbRmLzYyEyHGiwUTQfffi65yK/I0szOBdid2Qjsfw1glc5CmORlU49fr3SCxyrwn
 Zeom4ALkwhuSe06vlnl/91BjopxZWdVB3ISP+ynSA==
X-ME-Sender: <xms:eF6TWkTkeXX7inJXfJgqYRFnx9XtimvgYJ484TIkgQh7ctwDt0EZBg>
Received: from localhost (cm-84.214.173.174.getinternet.no [84.214.173.174])
 by mail.messagingengine.com (Postfix) with ESMTPA id 23BDD24651;
 Sun, 25 Feb 2018 20:10:16 -0500 (EST)
From: Marius Bakke <mbakke@HIDDEN>
In-Reply-To: <20180225114816.869-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180225114816.869-1-dannym@HIDDEN>
User-Agent: Notmuch/0.26 (https://notmuchmail.org) Emacs/25.3.1
 (x86_64-pc-linux-gnu)
Date: Mon, 26 Feb 2018 02:10:14 +0100
Message-ID: <87h8q4wo7d.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: multipart/signed; boundary="=-=-=";
 micalg=pgp-sha512; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--=-=-=
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable

Danny Milosavljevic <dannym@HIDDEN> writes:

> * gnu/packages/linux.scm (kmod-minimal): New variable.
> (kmod): Modify.
> ---
>  gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++-----------=
-----
>  1 file changed, 33 insertions(+), 16 deletions(-)
>
> diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
> index 238398e84..1f8bf3050 100644
> --- a/gnu/packages/linux.scm
> +++ b/gnu/packages/linux.scm
> @@ -1933,8 +1933,35 @@ for systems using the Linux kernel.  This includes=
 commands such as
>  to use Linux' inotify mechanism, which allows file accesses to be monito=
red.")
>      (license license:gpl2+)))
>=20=20
> -(define-public kmod
> +(define kmod-minimal
>    (package
> +    (name "kmod-minimal")
> +    (version "13")

Why this old version?

> +    (source (origin
> +              (method url-fetch)
> +              (uri
> +               (string-append "mirror://kernel.org/linux/utils/kernel/km=
od/"
> +                              "kmod-" version ".tar.xz"))
> +              (sha256
> +               (base32
> +                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
> +              (patches (search-patches "kmod-13-module-directory.patch")=
)))

This patch seems to be missing.

> +    (build-system gnu-build-system)
> +    (arguments
> +     `(#:tests? #f)) ; FIXME: Investigate test failures
> +    (home-page "https://www.kernel.org/")
> +    (synopsis "Kernel module tools")
> +    (description "Kmod is a set of tools to handle common tasks with Lin=
ux
> +kernel modules like insert, remove, list, check properties, resolve
> +dependencies and aliases.
> +
> +These tools are designed on top of libkmod, a library that is shipped wi=
th
> +kmod.  The aim is to be compatible with tools, configurations and indices
> +from the module-init-tools project.")
> +    (license license:gpl2+))) ; library under lgpl2.1+
> +
> +(define-public kmod
> +  (package (inherit kmod-minimal)
>      (name "kmod")
>      (version "24")
>      (source (origin
> @@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows fil=
e accesses to be monitored.")
>                 (base32
>                  "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1"))
>                (patches (search-patches "kmod-module-directory.patch"))))
> -    (build-system gnu-build-system)
>      (native-inputs
>       `(("pkg-config" ,pkg-config)))
>      (inputs
>       `(("xz" ,xz)
>         ("zlib" ,zlib)))
>      (arguments
> -     `(#:tests? #f ; FIXME: Investigate test failures
> -       #:configure-flags '("--with-xz" "--with-zlib")
> +     `(#:configure-flags '("--with-xz" "--with-zlib")
> +       #:tests? #f ; FIXME: Investigate test failures
>         #:phases (alist-cons-after
>                   'install 'install-modprobe&co
>                   (lambda* (#:key outputs #:allow-other-keys)
> @@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file=
 accesses to be monitored.")
>                                   (symlink "kmod"
>                                            (string-append bin "/" tool)))
>                                 '("insmod" "rmmod" "lsmod" "modprobe"
> -                                 "modinfo" "depmod"))))
> -                 %standard-phases)))
> -    (home-page "https://www.kernel.org/")
> -    (synopsis "Kernel module tools")
> -    (description "Kmod is a set of tools to handle common tasks with Lin=
ux
> -kernel modules like insert, remove, list, check properties, resolve
> -dependencies and aliases.
> -
> -These tools are designed on top of libkmod, a library that is shipped wi=
th
> -kmod.  The aim is to be compatible with tools, configurations and indices
> -from the module-init-tools project.")
> -    (license license:gpl2+))) ; library under lgpl2.1+
> +                                 "modinfo" "depmod"))
> +                     #t))
> +                 %standard-phases)))))
>=20=20
>  (define-public eudev
>    ;; The post-systemd fork, maintained by Gentoo.

--=-=-=
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAlqTXnYACgkQoqBt8qM6
VPpGtAf9HdKJjuRHFJxIT76qB3Yjub3mj5c3LRNhSA1vPnaPEMOXVDDTlq4t8XcR
K0oaixbKYcSvSmHJ+Sp17jy+SYpeA1WGGpCxKVsBl8FCKhEYh2ztbgRUtMwjXZyF
ZjO15dLd2SU40hWXVabKDeDTZyD9whMZMrbKAmu1OelG9lSPJw7fWfSU8UnZeXJg
TflXbAN+9Ikm5ey4kxY/v+IjE60aWd5CRlUqcWVzKzZ7bSmU81r+paUWSe+11V7n
7LoBFm/MwQM3JFkglmSkWsDv/9eQwfm6CI6yV15qChL+MXuSFKzuJNKeETd7TvV9
P8zks8IDY7CA9I3PwJXPEZRuwA7QYw==
=YgmH
-----END PGP SIGNATURE-----
--=-=-=--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v2 1/6] gnu: kmod: Split off kmod-minimal.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 03:51:02 +0000
Resent-Message-ID: <handler.30604.B30604.151961703416405 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961703416405
          (code B ref 30604); Mon, 26 Feb 2018 03:51:02 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:34 +0000
Received: from localhost ([127.0.0.1]:60883 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eq9oA-0004GV-G3
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:34 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43548)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eq9o8-0004GO-Qr
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:33 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id BD84D3362AB9;
 Mon, 26 Feb 2018 04:50:31 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 04:50:20 +0100
Message-Id: <20180226035025.1698-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180226035025.1698-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal): New variable.
(kmod): Modify.
---
 gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 16 deletions(-)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 238398e84..1f8bf3050 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1933,8 +1933,35 @@ for systems using the Linux kernel.  This includes commands such as
 to use Linux' inotify mechanism, which allows file accesses to be monitored.")
     (license license:gpl2+)))
 
-(define-public kmod
+(define kmod-minimal
   (package
+    (name "kmod-minimal")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f)) ; FIXME: Investigate test failures
+    (home-page "https://www.kernel.org/")
+    (synopsis "Kernel module tools")
+    (description "Kmod is a set of tools to handle common tasks with Linux
+kernel modules like insert, remove, list, check properties, resolve
+dependencies and aliases.
+
+These tools are designed on top of libkmod, a library that is shipped with
+kmod.  The aim is to be compatible with tools, configurations and indices
+from the module-init-tools project.")
+    (license license:gpl2+))) ; library under lgpl2.1+
+
+(define-public kmod
+  (package (inherit kmod-minimal)
     (name "kmod")
     (version "24")
     (source (origin
@@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                (base32
                 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1"))
               (patches (search-patches "kmod-module-directory.patch"))))
-    (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
      `(("xz" ,xz)
        ("zlib" ,zlib)))
     (arguments
-     `(#:tests? #f ; FIXME: Investigate test failures
-       #:configure-flags '("--with-xz" "--with-zlib")
+     `(#:configure-flags '("--with-xz" "--with-zlib")
+       #:tests? #f ; FIXME: Investigate test failures
        #:phases (alist-cons-after
                  'install 'install-modprobe&co
                  (lambda* (#:key outputs #:allow-other-keys)
@@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                                  (symlink "kmod"
                                           (string-append bin "/" tool)))
                                '("insmod" "rmmod" "lsmod" "modprobe"
-                                 "modinfo" "depmod"))))
-                 %standard-phases)))
-    (home-page "https://www.kernel.org/")
-    (synopsis "Kernel module tools")
-    (description "Kmod is a set of tools to handle common tasks with Linux
-kernel modules like insert, remove, list, check properties, resolve
-dependencies and aliases.
-
-These tools are designed on top of libkmod, a library that is shipped with
-kmod.  The aim is to be compatible with tools, configurations and indices
-from the module-init-tools project.")
-    (license license:gpl2+))) ; library under lgpl2.1+
+                                 "modinfo" "depmod"))
+                     #t))
+                 %standard-phases)))))
 
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v2 2/6] gnu: Add kmod-minimal-static.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 03:51:02 +0000
Resent-Message-ID: <handler.30604.B30604.151961703716426 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961703716426
          (code B ref 30604); Mon, 26 Feb 2018 03:51:02 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:37 +0000
Received: from localhost ([127.0.0.1]:60886 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eq9oC-0004Gq-OA
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:37 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43558)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eq9oB-0004GY-2W
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:35 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 0668A3361FF7;
 Mon, 26 Feb 2018 04:50:33 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 04:50:21 +0100
Message-Id: <20180226035025.1698-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180226035025.1698-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal/static): New variable.
* gnu/packages/patches/kmod-13-module-directory.patch: New file.
* gnu/local.mk: Add it.
---
 gnu/local.mk                                       |  1 +
 gnu/packages/linux.scm                             | 44 ++++++++++++++++++++++
 .../patches/kmod-13-module-directory.patch         | 33 ++++++++++++++++
 3 files changed, 78 insertions(+)
 create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 21195f8c1..b1e3c878d 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -795,6 +795,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/kiki-makefile.patch			\
   %D%/packages/patches/kiki-missing-includes.patch		\
   %D%/packages/patches/kiki-portability-64bit.patch		\
+  %D%/packages/patches/kmod-13-module-directory.patch		\
   %D%/packages/patches/kmod-module-directory.patch		\
   %D%/packages/patches/kobodeluxe-paths.patch			\
   %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch	\
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 1f8bf3050..b2e47f79a 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1994,6 +1994,50 @@ from the module-init-tools project.")
                      #t))
                  %standard-phases)))))
 
+(define-public kmod-minimal/static
+  (static-package
+   (package (inherit kmod-minimal)
+    (name "kmod-minimal-static")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (arguments
+     (substitute-keyword-arguments
+       (package-arguments (static-package kmod-minimal))
+       ((#:configure-flags flags ''())
+        `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags))
+       ((#:make-flags flags ''())
+        `(cons* "LDFLAGS=-all-static" ,flags))
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+          (delete 'install-license-files)
+          (add-after 'unpack 'patch-kmod
+           (lambda _
+             ;; Reduce size by 200 kiB.
+             (substitute* "tools/kmod.c"
+              (("[&]kmod_cmd_compat_lsmod,") "")
+              (("[&]kmod_cmd_compat_rmmod,") "")
+              (("[&]kmod_cmd_compat_insmod,") "")
+              (("[&]kmod_cmd_compat_modinfo,") ""))
+             #t))
+          (replace 'install
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (bin (string-append out "/bin")))
+                (install-file "tools/kmod" bin)
+                (for-each
+                 (lambda (tool)
+                   (symlink "kmod" (string-append bin "/" tool)))
+                 '("modprobe" "depmod"))
+                #t))))))))))
+
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.
   (package
diff --git a/gnu/packages/patches/kmod-13-module-directory.patch b/gnu/packages/patches/kmod-13-module-directory.patch
new file mode 100644
index 000000000..5ff2f8a60
--- /dev/null
+++ b/gnu/packages/patches/kmod-13-module-directory.patch
@@ -0,0 +1,33 @@
+This patch changes libkmod so it honors the 'LINUX_MODULE_DIRECTORY'
+environment variable, rather than looking for modules exclusively in
+/lib/modules.
+
+Patch by Shea Levy and Eelco Dolstra, from Nixpkgs; adjusted to
+use 'LINUX_MODULE_DIRECTORY' rather than 'MODULE_DIR' as the variable
+name.
+
+
+--- kmod-7/libkmod/libkmod.c	2012-03-15 08:19:16.750010226 -0400
++++ kmod-7/libkmod/libkmod.c	2012-04-04 15:21:29.532074313 -0400
+@@ -200,7 +200,7 @@
+ static char *get_kernel_release(const char *dirname)
+ {
+ 	struct utsname u;
+-	char *p;
++	char *p, *dirname_prefix;
+ 
+ 	if (dirname != NULL)
+ 		return path_make_absolute_cwd(dirname);
+@@ -208,7 +208,10 @@
+ 	if (uname(&u) < 0)
+ 		return NULL;
+ 
+-	if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0)
++	if ((dirname_prefix = getenv("LINUX_MODULE_DIRECTORY")) == NULL)
++		dirname_prefix = dirname_default_prefix;
++
++	if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0)
+ 		return NULL;
+ 
+ 	return p;
+




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v2 0/6] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 03:51:03 +0000
Resent-Message-ID: <handler.30604.B30604.151961703716438 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961703716438
          (code B ref 30604); Mon, 26 Feb 2018 03:51:03 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:37 +0000
Received: from localhost ([127.0.0.1]:60889 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eq9oD-0004Gt-2S
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:37 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43534)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eq9o8-0004GM-ED
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:35 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 884E63361672;
 Mon, 26 Feb 2018 04:50:30 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 04:50:19 +0100
Message-Id: <20180226035025.1698-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180225114557.816-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Danny Milosavljevic (6):
  gnu: kmod: Split off kmod-minimal.
  gnu: Add kmod-minimal-static.
  linux-initrd: Add kmod.
  linux-boot: Load kernel modules only when the hardware is present.
  vm: Allow qemu-image builder to load Linux kernel modules.
  vm: Make the virtio-blk is uniquely identifyable in /sys.

 gnu/build/linux-boot.scm                           | 31 +++++++-
 gnu/build/linux-initrd.scm                         | 12 ++-
 gnu/build/vm.scm                                   |  2 +-
 gnu/local.mk                                       |  1 +
 gnu/packages/linux.scm                             | 91 ++++++++++++++++++----
 .../patches/kmod-13-module-directory.patch         | 33 ++++++++
 gnu/system/linux-initrd.scm                        | 48 +++++++++---
 gnu/system/vm.scm                                  | 28 ++++++-
 8 files changed, 210 insertions(+), 36 deletions(-)
 create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v2 3/6] linux-initrd: Add kmod.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 03:51:03 +0000
Resent-Message-ID: <handler.30604.B30604.151961704016467 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961704016467
          (code B ref 30604); Mon, 26 Feb 2018 03:51:03 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:40 +0000
Received: from localhost ([127.0.0.1]:60894 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eq9oG-0004HW-Dw
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:40 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43568)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eq9oC-0004Gp-M2
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:37 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 753EF33628BE;
 Mon, 26 Feb 2018 04:50:35 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 04:50:22 +0100
Message-Id: <20180226035025.1698-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180226035025.1698-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (raw-initrd): Add kmod.
(base-initrd): Add kmod.
(expression->initrd): Add kmod, linux-module-directory.
(flat-linux-module-directory): Add kmod; invoke depmod.
* gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory.
---
 gnu/build/linux-initrd.scm  | 12 +++++++++++-
 gnu/system/linux-initrd.scm | 44 +++++++++++++++++++++++++++++++++-----------
 2 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..6356007df 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init kmod linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,16 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+    ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (when kmod
+      (mkdir-p "sbin")
+      (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe"))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 7170d1c0e..91e498787 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -59,6 +59,8 @@
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             kmod
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
+                        #:kmod #$kmod
+                        #:linux-module-directory #$linux-module-directory
                         ;; Copy everything INIT refers to into the initrd.
                         #:references-graphs '("closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
@@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (gexp->derivation name builder
                     #:references-graphs `(("closure" ,init))))
 
-(define (flat-linux-module-directory linux modules)
+(define (flat-linux-module-directory linux modules kmod)
   "Return a flat directory containing the Linux kernel modules listed in
 MODULES and taken from LINUX."
   (define build-exp
@@ -109,7 +113,7 @@ MODULES and taken from LINUX."
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex)
+          (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw)
                        (srfi srfi-1)
                        (guix build utils)
                        (gnu build linux-modules))
@@ -138,13 +142,26 @@ MODULES and taken from LINUX."
                       (recursive-module-dependencies modules
                                                      #:lookup-module lookup))))
 
-          (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
+          (define version
+            (car
+             (filter
+              (lambda (name)
+                (not (string-prefix? "." name)))
+              (scandir module-dir))))
+
+          (let ((output (string-append #$output "/lib/modules/" version)))
+            (mkdir-p output)
+            (for-each (lambda (module)
+                        (format #t "copying '~a'...~%" module)
+                        (copy-file module
+                                   (string-append output "/"
+                                                  (basename module))))
+                      (delete-duplicates modules)))
+          (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output
+                  ; -E
+                  "-F" (string-append #$linux "/System.map")
+                  version)
+          #t)))
 
   (computed-file "linux-modules" build-exp))
 
@@ -152,6 +169,7 @@ MODULES and taken from LINUX."
                       #:key
                       (linux linux-libre)
                       (linux-modules '())
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       (helper-packages '())
                       qemu-networking?
@@ -185,7 +203,7 @@ upon error."
          mapped-devices))
 
   (define kodir
-    (flat-linux-module-directory linux linux-modules))
+    (flat-linux-module-directory linux linux-modules kmod))
 
   (expression->initrd
    (with-imported-modules (source-module-closure
@@ -223,6 +241,8 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:kmod kmod
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))
@@ -245,6 +265,7 @@ FILE-SYSTEMS."
 (define* (base-initrd file-systems
                       #:key
                       (linux linux-libre)
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       qemu-networking?
                       volatile-root?
@@ -322,8 +343,9 @@ loaded at boot time in the order in which they appear."
   (raw-initrd file-systems
               #:linux linux
               #:linux-modules linux-modules
+              #:kmod kmod
               #:mapped-devices mapped-devices
-              #:helper-packages helper-packages
+              #:helper-packages (cons kmod helper-packages)
               #:qemu-networking? qemu-networking?
               #:volatile-root? volatile-root?
               #:on-error on-error))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v2 4/6] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 03:51:03 +0000
Resent-Message-ID: <handler.30604.B30604.151961704116474 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961704116474
          (code B ref 30604); Mon, 26 Feb 2018 03:51:03 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:41 +0000
Received: from localhost ([127.0.0.1]:60896 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eq9oG-0004HY-Nn
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:40 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43576)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eq9oD-0004Gz-IK
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:37 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 9F2FC3361672;
 Mon, 26 Feb 2018 04:50:36 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 04:50:23 +0100
Message-Id: <20180226035025.1698-5-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180226035025.1698-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 31 +++++++++++++++++++++++++++----
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..6d00ea9be 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -473,6 +473,32 @@ upon error."
     (string-append linux-module-directory "/"
                    (ensure-dot-ko name)))
 
+  (define (load-kernel-modules)
+    "Examine /sys/devices to find out which modules to load and load them."
+    (define enter?
+      (const #t))
+    (define (down! path stat result)
+     ;; Note: modprobe mutates the tree starting with path.
+     (let ((modalias-name (string-append path "/modalias")))
+       (if (file-exists? modalias-name)
+           (let ((modalias
+                 (string-trim-right (call-with-input-file modalias-name
+                                                          read-string)
+                                    #\newline)))
+             (system* "/sbin/modprobe" "-q" "--" modalias))))
+       #t)
+    (define up
+      (const #t))
+    (define skip
+      (const #t))
+    (define leaf
+      (const #t))
+    (define (error name stat errno result)
+      (format (current-error-port) "warning: ~a: ~a~%"
+              name (strerror errno))
+      result)
+    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
+
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
 
@@ -486,10 +512,7 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 91e498787..6d130ccac 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -224,7 +224,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v2 5/6] vm: Allow qemu-image builder to load Linux kernel modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 03:51:04 +0000
Resent-Message-ID: <handler.30604.B30604.151961704116481 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961704116481
          (code B ref 30604); Mon, 26 Feb 2018 03:51:04 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:41 +0000
Received: from localhost ([127.0.0.1]:60898 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eq9oG-0004Hf-Ux
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:41 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43584)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eq9oE-0004HH-K5
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:38 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id AD8A13361FF7;
 Mon, 26 Feb 2018 04:50:37 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 04:50:24 +0100
Message-Id: <20180226035025.1698-6-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180226035025.1698-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/vm.scm (%modprobe-wrapper): New variable.
(qemu-image): Modify.
---
 gnu/system/vm.scm | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 345cecedd..c64c9678f 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)."
    #:single-file-output? #t
    #:references-graphs inputs))
 
+(define (%modprobe-wrapper modprobe linux-module-directory)
+  ;; Wrapper for the 'modprobe' command that knows where modules live.
+  ;;
+  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
+  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
+  ;; environment variable is not set---hence the need for this wrapper.
+  (program-file "modprobe"
+    #~(begin
+        (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory)
+        (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))
+
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
@@ -275,6 +286,8 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe"))
+        (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules"))))
   (expression->derivation-in-linux-vm
    name
    (with-imported-modules (source-module-closure '((gnu build bootloader)
@@ -288,7 +301,7 @@ the image."
                       (ice-9 binary-ports))
 
          (let ((inputs
-                '#$(append (list qemu parted e2fsprogs dosfstools)
+                '#$(append (list qemu parted e2fsprogs dosfstools kmod)
                            (map canonical-package
                                 (list sed grep coreutils findutils gawk))
                            (if register-closures? (list guix) '())))
@@ -302,6 +315,14 @@ the image."
                         inputs)))
 
            (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+           ;; It's possible that we need to load nls modules in order to
+           ;; mount the new partition.
+           (if (file-exists? #$modprobe-name)
+               (activate-modprobe #$(%modprobe-wrapper modprobe-name
+                                     linux-module-directory))
+               (format (current-error-port)
+                "WARNING: No modprobe found in ~s.  \
+Loading kernel modules will be impossible.\n" #$modprobe-name))
 
            (let* ((graphs     '#$(match inputs
                                    (((names . _) ...)
@@ -364,7 +385,7 @@ the image."
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-   #:references-graphs inputs))
+   #:references-graphs inputs)))
 
 
 ;;;




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v2 6/6] vm: Make the virtio-blk is uniquely identifyable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 03:51:04 +0000
Resent-Message-ID: <handler.30604.B30604.151961704116488 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961704116488
          (code B ref 30604); Mon, 26 Feb 2018 03:51:04 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 03:50:41 +0000
Received: from localhost ([127.0.0.1]:60900 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eq9oH-0004Hm-72
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:41 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43594)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eq9oF-0004HP-Jh
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 22:50:39 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id A90643361672;
 Mon, 26 Feb 2018 04:50:38 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 04:50:25 +0100
Message-Id: <20180226035025.1698-7-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN>
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180226035025.1698-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.
---
 gnu/build/vm.scm  | 2 +-
 gnu/system/vm.scm | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..ebf9e9f6e 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index c64c9678f..ad48999ee 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -704,7 +704,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v3 1/6] gnu: kmod: Split off kmod-minimal.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 04:07:01 +0000
Resent-Message-ID: <handler.30604.B30604.151961797917893 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961797917893
          (code B ref 30604); Mon, 26 Feb 2018 04:07:01 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:19 +0000
Received: from localhost ([127.0.0.1]:60922 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqA3O-0004eW-QR
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:19 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:45142)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqA3M-0004eC-Kq
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:17 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id A05E63361FF7;
 Mon, 26 Feb 2018 05:06:15 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 05:06:04 +0100
Message-Id: <20180226040609.3066-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN>
References: <20180226035025.1698-1-dannym@HIDDEN>
 <20180226040609.3066-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal): New variable.
(kmod): Modify.
---
 gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 16 deletions(-)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 238398e84..1f8bf3050 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1933,8 +1933,35 @@ for systems using the Linux kernel.  This includes commands such as
 to use Linux' inotify mechanism, which allows file accesses to be monitored.")
     (license license:gpl2+)))
 
-(define-public kmod
+(define kmod-minimal
   (package
+    (name "kmod-minimal")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f)) ; FIXME: Investigate test failures
+    (home-page "https://www.kernel.org/")
+    (synopsis "Kernel module tools")
+    (description "Kmod is a set of tools to handle common tasks with Linux
+kernel modules like insert, remove, list, check properties, resolve
+dependencies and aliases.
+
+These tools are designed on top of libkmod, a library that is shipped with
+kmod.  The aim is to be compatible with tools, configurations and indices
+from the module-init-tools project.")
+    (license license:gpl2+))) ; library under lgpl2.1+
+
+(define-public kmod
+  (package (inherit kmod-minimal)
     (name "kmod")
     (version "24")
     (source (origin
@@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                (base32
                 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1"))
               (patches (search-patches "kmod-module-directory.patch"))))
-    (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
      `(("xz" ,xz)
        ("zlib" ,zlib)))
     (arguments
-     `(#:tests? #f ; FIXME: Investigate test failures
-       #:configure-flags '("--with-xz" "--with-zlib")
+     `(#:configure-flags '("--with-xz" "--with-zlib")
+       #:tests? #f ; FIXME: Investigate test failures
        #:phases (alist-cons-after
                  'install 'install-modprobe&co
                  (lambda* (#:key outputs #:allow-other-keys)
@@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                                  (symlink "kmod"
                                           (string-append bin "/" tool)))
                                '("insmod" "rmmod" "lsmod" "modprobe"
-                                 "modinfo" "depmod"))))
-                 %standard-phases)))
-    (home-page "https://www.kernel.org/")
-    (synopsis "Kernel module tools")
-    (description "Kmod is a set of tools to handle common tasks with Linux
-kernel modules like insert, remove, list, check properties, resolve
-dependencies and aliases.
-
-These tools are designed on top of libkmod, a library that is shipped with
-kmod.  The aim is to be compatible with tools, configurations and indices
-from the module-init-tools project.")
-    (license license:gpl2+))) ; library under lgpl2.1+
+                                 "modinfo" "depmod"))
+                     #t))
+                 %standard-phases)))))
 
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v3 0/6] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 04:07:02 +0000
Resent-Message-ID: <handler.30604.B30604.151961798117916 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961798117916
          (code B ref 30604); Mon, 26 Feb 2018 04:07:02 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:21 +0000
Received: from localhost ([127.0.0.1]:60926 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqA3R-0004et-2K
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:21 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:45138)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqA3L-0004eA-MF
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:18 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 8377B3361672;
 Mon, 26 Feb 2018 05:06:14 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 05:06:03 +0100
Message-Id: <20180226040609.3066-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226035025.1698-1-dannym@HIDDEN>
References: <20180226035025.1698-1-dannym@HIDDEN>
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Danny Milosavljevic (6):
  gnu: kmod: Split off kmod-minimal.
  gnu: Add kmod-minimal-static.
  linux-initrd: Add kmod.
  linux-boot: Load kernel modules only when the hardware is present.
  vm: Allow qemu-image builder to load Linux kernel modules.
  vm: Make the virtio-blk is uniquely identifyable in /sys.

 gnu/build/linux-boot.scm                           | 31 +++++++-
 gnu/build/linux-initrd.scm                         | 12 ++-
 gnu/build/vm.scm                                   |  2 +-
 gnu/local.mk                                       |  1 +
 gnu/packages/linux.scm                             | 91 ++++++++++++++++++----
 .../patches/kmod-13-module-directory.patch         | 33 ++++++++
 gnu/system/linux-initrd.scm                        | 49 +++++++++---
 gnu/system/vm.scm                                  | 34 ++++++--
 8 files changed, 215 insertions(+), 38 deletions(-)
 create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v3 2/6] gnu: Add kmod-minimal-static.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 04:07:02 +0000
Resent-Message-ID: <handler.30604.B30604.151961798117923 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961798117923
          (code B ref 30604); Mon, 26 Feb 2018 04:07:02 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:21 +0000
Received: from localhost ([127.0.0.1]:60928 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqA3R-0004ev-9k
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:21 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:45150)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqA3O-0004eK-26
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:18 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 23D6833628BE;
 Mon, 26 Feb 2018 05:06:17 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 05:06:05 +0100
Message-Id: <20180226040609.3066-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN>
References: <20180226035025.1698-1-dannym@HIDDEN>
 <20180226040609.3066-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal/static): New variable.
* gnu/packages/patches/kmod-13-module-directory.patch: New file.
* gnu/local.mk: Add it.
---
 gnu/local.mk                                       |  1 +
 gnu/packages/linux.scm                             | 44 ++++++++++++++++++++++
 .../patches/kmod-13-module-directory.patch         | 33 ++++++++++++++++
 3 files changed, 78 insertions(+)
 create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 21195f8c1..b1e3c878d 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -795,6 +795,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/kiki-makefile.patch			\
   %D%/packages/patches/kiki-missing-includes.patch		\
   %D%/packages/patches/kiki-portability-64bit.patch		\
+  %D%/packages/patches/kmod-13-module-directory.patch		\
   %D%/packages/patches/kmod-module-directory.patch		\
   %D%/packages/patches/kobodeluxe-paths.patch			\
   %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch	\
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 1f8bf3050..b2e47f79a 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1994,6 +1994,50 @@ from the module-init-tools project.")
                      #t))
                  %standard-phases)))))
 
+(define-public kmod-minimal/static
+  (static-package
+   (package (inherit kmod-minimal)
+    (name "kmod-minimal-static")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (arguments
+     (substitute-keyword-arguments
+       (package-arguments (static-package kmod-minimal))
+       ((#:configure-flags flags ''())
+        `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags))
+       ((#:make-flags flags ''())
+        `(cons* "LDFLAGS=-all-static" ,flags))
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+          (delete 'install-license-files)
+          (add-after 'unpack 'patch-kmod
+           (lambda _
+             ;; Reduce size by 200 kiB.
+             (substitute* "tools/kmod.c"
+              (("[&]kmod_cmd_compat_lsmod,") "")
+              (("[&]kmod_cmd_compat_rmmod,") "")
+              (("[&]kmod_cmd_compat_insmod,") "")
+              (("[&]kmod_cmd_compat_modinfo,") ""))
+             #t))
+          (replace 'install
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (bin (string-append out "/bin")))
+                (install-file "tools/kmod" bin)
+                (for-each
+                 (lambda (tool)
+                   (symlink "kmod" (string-append bin "/" tool)))
+                 '("modprobe" "depmod"))
+                #t))))))))))
+
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.
   (package
diff --git a/gnu/packages/patches/kmod-13-module-directory.patch b/gnu/packages/patches/kmod-13-module-directory.patch
new file mode 100644
index 000000000..5ff2f8a60
--- /dev/null
+++ b/gnu/packages/patches/kmod-13-module-directory.patch
@@ -0,0 +1,33 @@
+This patch changes libkmod so it honors the 'LINUX_MODULE_DIRECTORY'
+environment variable, rather than looking for modules exclusively in
+/lib/modules.
+
+Patch by Shea Levy and Eelco Dolstra, from Nixpkgs; adjusted to
+use 'LINUX_MODULE_DIRECTORY' rather than 'MODULE_DIR' as the variable
+name.
+
+
+--- kmod-7/libkmod/libkmod.c	2012-03-15 08:19:16.750010226 -0400
++++ kmod-7/libkmod/libkmod.c	2012-04-04 15:21:29.532074313 -0400
+@@ -200,7 +200,7 @@
+ static char *get_kernel_release(const char *dirname)
+ {
+ 	struct utsname u;
+-	char *p;
++	char *p, *dirname_prefix;
+ 
+ 	if (dirname != NULL)
+ 		return path_make_absolute_cwd(dirname);
+@@ -208,7 +208,10 @@
+ 	if (uname(&u) < 0)
+ 		return NULL;
+ 
+-	if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0)
++	if ((dirname_prefix = getenv("LINUX_MODULE_DIRECTORY")) == NULL)
++		dirname_prefix = dirname_default_prefix;
++
++	if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0)
+ 		return NULL;
+ 
+ 	return p;
+




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v3 3/6] linux-initrd: Add kmod.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 04:07:03 +0000
Resent-Message-ID: <handler.30604.B30604.151961798217935 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961798217935
          (code B ref 30604); Mon, 26 Feb 2018 04:07:03 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:22 +0000
Received: from localhost ([127.0.0.1]:60931 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqA3R-0004f2-LI
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:22 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:45160)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqA3P-0004eX-AV
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:19 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 2D84E3361FF7;
 Mon, 26 Feb 2018 05:06:18 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 05:06:06 +0100
Message-Id: <20180226040609.3066-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN>
References: <20180226035025.1698-1-dannym@HIDDEN>
 <20180226040609.3066-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (raw-initrd): Add kmod.
(base-initrd): Add kmod.
(expression->initrd): Add kmod, linux-module-directory.
(flat-linux-module-directory): Add kmod; invoke depmod.
* gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory.
---
 gnu/build/linux-initrd.scm  | 12 +++++++++++-
 gnu/system/linux-initrd.scm | 45 ++++++++++++++++++++++++++++++++++-----------
 2 files changed, 45 insertions(+), 12 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..6356007df 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init kmod linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,16 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+    ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (when kmod
+      (mkdir-p "sbin")
+      (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe"))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 7170d1c0e..46ef055f0 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -59,6 +59,8 @@
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             kmod
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
+                        #:kmod #$kmod
+                        #:linux-module-directory #$linux-module-directory
                         ;; Copy everything INIT refers to into the initrd.
                         #:references-graphs '("closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
@@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (gexp->derivation name builder
                     #:references-graphs `(("closure" ,init))))
 
-(define (flat-linux-module-directory linux modules)
+(define (flat-linux-module-directory linux modules kmod)
   "Return a flat directory containing the Linux kernel modules listed in
 MODULES and taken from LINUX."
   (define build-exp
@@ -109,7 +113,7 @@ MODULES and taken from LINUX."
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex)
+          (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw)
                        (srfi srfi-1)
                        (guix build utils)
                        (gnu build linux-modules))
@@ -138,13 +142,27 @@ MODULES and taken from LINUX."
                       (recursive-module-dependencies modules
                                                      #:lookup-module lookup))))
 
-          (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
+          (define version
+            (match
+             (filter
+              (lambda (name)
+                (not (string-prefix? "." name)))
+              (scandir module-dir))
+             ((item) item)))
+
+          (let ((output (string-append #$output "/lib/modules/" version)))
+            (mkdir-p output)
+            (for-each (lambda (module)
+                        (format #t "copying '~a'...~%" module)
+                        (copy-file module
+                                   (string-append output "/"
+                                                  (basename module))))
+                      (delete-duplicates modules)))
+          (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output
+                  ; -E
+                  "-F" (string-append #$linux "/System.map")
+                  version)
+          #t)))
 
   (computed-file "linux-modules" build-exp))
 
@@ -152,6 +170,7 @@ MODULES and taken from LINUX."
                       #:key
                       (linux linux-libre)
                       (linux-modules '())
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       (helper-packages '())
                       qemu-networking?
@@ -185,7 +204,7 @@ upon error."
          mapped-devices))
 
   (define kodir
-    (flat-linux-module-directory linux linux-modules))
+    (flat-linux-module-directory linux linux-modules kmod))
 
   (expression->initrd
    (with-imported-modules (source-module-closure
@@ -223,6 +242,8 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:kmod kmod
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))
@@ -245,6 +266,7 @@ FILE-SYSTEMS."
 (define* (base-initrd file-systems
                       #:key
                       (linux linux-libre)
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       qemu-networking?
                       volatile-root?
@@ -322,8 +344,9 @@ loaded at boot time in the order in which they appear."
   (raw-initrd file-systems
               #:linux linux
               #:linux-modules linux-modules
+              #:kmod kmod
               #:mapped-devices mapped-devices
-              #:helper-packages helper-packages
+              #:helper-packages (cons kmod helper-packages)
               #:qemu-networking? qemu-networking?
               #:volatile-root? volatile-root?
               #:on-error on-error))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v3 4/6] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 04:07:03 +0000
Resent-Message-ID: <handler.30604.B30604.151961798517951 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961798517951
          (code B ref 30604); Mon, 26 Feb 2018 04:07:03 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:25 +0000
Received: from localhost ([127.0.0.1]:60934 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqA3V-0004fS-37
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:25 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:45168)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqA3Q-0004el-7r
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:20 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 67A5E33628BE;
 Mon, 26 Feb 2018 05:06:19 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 05:06:07 +0100
Message-Id: <20180226040609.3066-5-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN>
References: <20180226035025.1698-1-dannym@HIDDEN>
 <20180226040609.3066-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 31 +++++++++++++++++++++++++++----
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..6d00ea9be 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -473,6 +473,32 @@ upon error."
     (string-append linux-module-directory "/"
                    (ensure-dot-ko name)))
 
+  (define (load-kernel-modules)
+    "Examine /sys/devices to find out which modules to load and load them."
+    (define enter?
+      (const #t))
+    (define (down! path stat result)
+     ;; Note: modprobe mutates the tree starting with path.
+     (let ((modalias-name (string-append path "/modalias")))
+       (if (file-exists? modalias-name)
+           (let ((modalias
+                 (string-trim-right (call-with-input-file modalias-name
+                                                          read-string)
+                                    #\newline)))
+             (system* "/sbin/modprobe" "-q" "--" modalias))))
+       #t)
+    (define up
+      (const #t))
+    (define skip
+      (const #t))
+    (define leaf
+      (const #t))
+    (define (error name stat errno result)
+      (format (current-error-port) "warning: ~a: ~a~%"
+              name (strerror errno))
+      result)
+    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
+
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
 
@@ -486,10 +512,7 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 46ef055f0..c8a9e4950 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -225,7 +225,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v3 5/6] vm: Allow qemu-image builder to load Linux kernel modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 04:07:03 +0000
Resent-Message-ID: <handler.30604.B30604.151961798517959 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961798517959
          (code B ref 30604); Mon, 26 Feb 2018 04:07:03 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:25 +0000
Received: from localhost ([127.0.0.1]:60936 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqA3V-0004fU-AH
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:25 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:45176)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqA3R-0004er-5R
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:21 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 546F33361FF7;
 Mon, 26 Feb 2018 05:06:20 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 05:06:08 +0100
Message-Id: <20180226040609.3066-6-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN>
References: <20180226035025.1698-1-dannym@HIDDEN>
 <20180226040609.3066-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/vm.scm (%modprobe-wrapper): New variable.
(qemu-image): Modify.
---
 gnu/system/vm.scm | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 345cecedd..b5a559012 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)."
    #:single-file-output? #t
    #:references-graphs inputs))
 
+(define (%modprobe-wrapper modprobe linux-module-directory)
+  ;; Wrapper for the 'modprobe' command that knows where modules live.
+  ;;
+  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
+  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
+  ;; environment variable is not set---hence the need for this wrapper.
+  (program-file "modprobe"
+    #~(begin
+        (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory)
+        (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))
+
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
@@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe"))
+        (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules"))))
   (expression->derivation-in-linux-vm
    name
-   (with-imported-modules (source-module-closure '((gnu build bootloader)
+   (with-imported-modules (source-module-closure '((gnu build activation)
+                                                   (gnu build bootloader)
                                                    (gnu build vm)
                                                    (guix build utils)))
      #~(begin
-         (use-modules (gnu build bootloader)
+         (use-modules (gnu build activation)
+                      (gnu build bootloader)
                       (gnu build vm)
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
          (let ((inputs
-                '#$(append (list qemu parted e2fsprogs dosfstools)
+                '#$(append (list qemu parted e2fsprogs dosfstools kmod)
                            (map canonical-package
                                 (list sed grep coreutils findutils gawk))
                            (if register-closures? (list guix) '())))
@@ -302,6 +317,14 @@ the image."
                         inputs)))
 
            (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+           ;; It's possible that we need to load nls modules in order to
+           ;; mount the new partition.
+           (if (file-exists? #$modprobe-name)
+               (activate-modprobe #$(%modprobe-wrapper modprobe-name
+                                     linux-module-directory))
+               (format (current-error-port)
+                "WARNING: No modprobe found in ~s.  \
+Loading kernel modules will be impossible.\n" #$modprobe-name))
 
            (let* ((graphs     '#$(match inputs
                                    (((names . _) ...)
@@ -364,7 +387,7 @@ the image."
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-   #:references-graphs inputs))
+   #:references-graphs inputs)))
 
 
 ;;;




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v3 6/6] vm: Make the virtio-blk is uniquely identifyable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 04:07:04 +0000
Resent-Message-ID: <handler.30604.B30604.151961798517965 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151961798517965
          (code B ref 30604); Mon, 26 Feb 2018 04:07:04 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 04:06:25 +0000
Received: from localhost ([127.0.0.1]:60938 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqA3V-0004fc-Hk
	for submit <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:25 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:45184)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqA3S-0004f7-2K
 for 30604 <at> debbugs.gnu.org; Sun, 25 Feb 2018 23:06:22 -0500
Received: from dayas.3.home (77.118.165.54.wireless.dyn.drei.com
 [77.118.165.54])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 409C433628BE;
 Mon, 26 Feb 2018 05:06:21 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Mon, 26 Feb 2018 05:06:09 +0100
Message-Id: <20180226040609.3066-7-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN>
References: <20180226035025.1698-1-dannym@HIDDEN>
 <20180226040609.3066-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.
---
 gnu/build/vm.scm  | 2 +-
 gnu/system/vm.scm | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..ebf9e9f6e 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index b5a559012..fdff64ed9 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH 3/4] linux-initrd: Add kmod.
Resent-From: Mathieu Othacehe <m.othacehe@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Feb 2018 11:52:02 +0000
Resent-Message-ID: <handler.30604.B30604.151964592127246 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151964592127246
          (code B ref 30604); Mon, 26 Feb 2018 11:52:02 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Feb 2018 11:52:01 +0000
Received: from localhost ([127.0.0.1]:32826 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqHK5-00075N-ES
	for submit <at> debbugs.gnu.org; Mon, 26 Feb 2018 06:52:01 -0500
Received: from mail-wm0-f45.google.com ([74.125.82.45]:37279)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <m.othacehe@HIDDEN>) id 1eqHK3-00075A-F7
 for 30604 <at> debbugs.gnu.org; Mon, 26 Feb 2018 06:51:59 -0500
Received: by mail-wm0-f45.google.com with SMTP id 139so3519697wmn.2
 for <30604 <at> debbugs.gnu.org>; Mon, 26 Feb 2018 03:51:59 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=references:user-agent:from:to:cc:subject:in-reply-to:date
 :message-id:mime-version;
 bh=5i6T3rxqP8CWJWRxiWNh6xDnQ5Hvl15DMRbhDNWQMdI=;
 b=Wse6k8247do6aHihrvX3dKSu+y/PWmohVtP8kSh9pVkHJ7oU6kSMiWoqZCfjhwd2FB
 9XL9HKEvheHn4BPrP7Ubqw3zEmltu1Fts3gDRKX6toHc3IqCcuYxAE4gi98Jtn23pXtn
 duh82szm94cqaarjfTkRKUEJmz+XsDsrWBnFBX1JANNKVps+vQCdBU1ThpCRx+sRrUVM
 862dzqlGNVvdsinV/txl1+Iljv/857iyWYJQPs9qY2gYsf/oUcyoBLHYXmiVMvDyCoTf
 WCpUq+6G5/wH3ymmhpeHSIrONq7tJoWIzY4BF4ZQK55WQzPgajiSe7Ckce6N5XbR5Y12
 Bb9g==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:references:user-agent:from:to:cc:subject
 :in-reply-to:date:message-id:mime-version;
 bh=5i6T3rxqP8CWJWRxiWNh6xDnQ5Hvl15DMRbhDNWQMdI=;
 b=LKi8ltl1CByVwAog/ENeeNHHGqTGbecP2OjgojHkjsq5cVY/uRnVGfjHErm8XmbkpG
 UV7akTall3Hl/56sASqU6I2lTQSGrq0BsMBT+ONnyYC6iRCsCZvkPl6J7ApDfu3p7Mes
 PSYHCKHUD9JjowIBCQplhqQTtz0uRStAMjTu/VPE/T/g9G8/Cp+sJaUAoTY74iDVzFIn
 rGHU3tXf30cvsH6EPyXWDuu7lDJy1INSj1ONtsQm9kvcdvMJt5G5iqcqLtyfDkAz/woy
 uHirvhq52wLddIu1ystJxgJWWwfK/9q213mIVvYLgYvWwUnLpEWXPTpUct9BZnOI3uXl
 SgOA==
X-Gm-Message-State: APf1xPD9yeL0GxO7UgL29XYX5f0Urst2Y5yVo58jcHcAr4mfBWWFH3Am
 5IDXVoCuFFcgCOjq4n3wpOQ92w==
X-Google-Smtp-Source: AG47ELugXm3kREm1j/NY1qEAXEvwcJDzkGcHEr4LKGGF0FAVmDWCLHjAr4rwmDZ/K0WcsVJTaltBWg==
X-Received: by 10.28.133.129 with SMTP id h123mr8763571wmd.146.1519645913390; 
 Mon, 26 Feb 2018 03:51:53 -0800 (PST)
Received: from denali ([46.218.109.88])
 by smtp.gmail.com with ESMTPSA id x78sm19032749wmd.2.2018.02.26.03.51.52
 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);
 Mon, 26 Feb 2018 03:51:52 -0800 (PST)
References: <20180225114557.816-1-dannym@HIDDEN>
 <20180225114816.869-1-dannym@HIDDEN>
 <20180225114816.869-3-dannym@HIDDEN> <87vaelf9ln.fsf@HIDDEN>
 <20180225160750.46bf5b50@HIDDEN>
User-agent: mu4e 0.9.18; emacs 25.3.1
From: Mathieu Othacehe <m.othacehe@HIDDEN>
In-reply-to: <20180225160750.46bf5b50@HIDDEN>
Date: Mon, 26 Feb 2018 12:51:51 +0100
Message-ID: <87h8q4j7e0.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: -0.0 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.0 (/)


Hey Danny,

> Because it's an option for specifying the location of "Module.symvers" - and
> I don't know whether guix uses it (probably not).  If one doesn't specify an
> option, depmod will default to the running kernel - which is not what we want.
>
> I should elaborate in the comment that, if we start using Module.symvers, we
> MUST pass "-E" there.  Maybe better to even just check for the file existence
> and add it right now, otherwise we might forget later.  What do you think?

Reading 'depmod' manpage, I understand that -E and -F are mutually
exclusive. Both options seem to have an interest only if -e is supplied
to "reports any symbols which a module needs which are not supplied by
other modules or the kernel".

So maybe something like "-F (string-append #$linux "/System.map") -e"
would make more sense ?

Mathieu




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v4 1/7] gnu: kmod: Split off kmod-minimal.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 10:27:01 +0000
Resent-Message-ID: <handler.30604.B30604.151972718614927 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151972718614927
          (code B ref 30604); Tue, 27 Feb 2018 10:27:01 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:26 +0000
Received: from localhost ([127.0.0.1]:34364 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqcSn-0003sU-32
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:26 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42444)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqcSl-0003sM-LI
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:24 -0500
Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com
 [77.118.239.24])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 982AA33615C9;
 Tue, 27 Feb 2018 11:26:22 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 12:26:13 +0100
Message-Id: <20180227112619.5071-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN>
References: <20180226040609.3066-1-dannym@HIDDEN>
 <20180227112619.5071-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal): New variable.
(kmod): Modify.
---
 gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 16 deletions(-)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 238398e84..1f8bf3050 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1933,8 +1933,35 @@ for systems using the Linux kernel.  This includes commands such as
 to use Linux' inotify mechanism, which allows file accesses to be monitored.")
     (license license:gpl2+)))
 
-(define-public kmod
+(define kmod-minimal
   (package
+    (name "kmod-minimal")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f)) ; FIXME: Investigate test failures
+    (home-page "https://www.kernel.org/")
+    (synopsis "Kernel module tools")
+    (description "Kmod is a set of tools to handle common tasks with Linux
+kernel modules like insert, remove, list, check properties, resolve
+dependencies and aliases.
+
+These tools are designed on top of libkmod, a library that is shipped with
+kmod.  The aim is to be compatible with tools, configurations and indices
+from the module-init-tools project.")
+    (license license:gpl2+))) ; library under lgpl2.1+
+
+(define-public kmod
+  (package (inherit kmod-minimal)
     (name "kmod")
     (version "24")
     (source (origin
@@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                (base32
                 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1"))
               (patches (search-patches "kmod-module-directory.patch"))))
-    (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
      `(("xz" ,xz)
        ("zlib" ,zlib)))
     (arguments
-     `(#:tests? #f ; FIXME: Investigate test failures
-       #:configure-flags '("--with-xz" "--with-zlib")
+     `(#:configure-flags '("--with-xz" "--with-zlib")
+       #:tests? #f ; FIXME: Investigate test failures
        #:phases (alist-cons-after
                  'install 'install-modprobe&co
                  (lambda* (#:key outputs #:allow-other-keys)
@@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                                  (symlink "kmod"
                                           (string-append bin "/" tool)))
                                '("insmod" "rmmod" "lsmod" "modprobe"
-                                 "modinfo" "depmod"))))
-                 %standard-phases)))
-    (home-page "https://www.kernel.org/")
-    (synopsis "Kernel module tools")
-    (description "Kmod is a set of tools to handle common tasks with Linux
-kernel modules like insert, remove, list, check properties, resolve
-dependencies and aliases.
-
-These tools are designed on top of libkmod, a library that is shipped with
-kmod.  The aim is to be compatible with tools, configurations and indices
-from the module-init-tools project.")
-    (license license:gpl2+))) ; library under lgpl2.1+
+                                 "modinfo" "depmod"))
+                     #t))
+                 %standard-phases)))))
 
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v4 2/7] gnu: Add kmod-minimal-static.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 10:27:02 +0000
Resent-Message-ID: <handler.30604.B30604.151972718714946 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151972718714946
          (code B ref 30604); Tue, 27 Feb 2018 10:27:02 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:27 +0000
Received: from localhost ([127.0.0.1]:34368 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqcSp-0003sz-3v
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:27 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42452)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqcSm-0003sT-Pp
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:25 -0500
Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com
 [77.118.239.24])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id C6A0B3362DFC;
 Tue, 27 Feb 2018 11:26:23 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 12:26:14 +0100
Message-Id: <20180227112619.5071-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN>
References: <20180226040609.3066-1-dannym@HIDDEN>
 <20180227112619.5071-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal/static): New variable.
* gnu/packages/patches/kmod-13-module-directory.patch: New file.
* gnu/local.mk: Add it.
---
 gnu/local.mk                                       |  1 +
 gnu/packages/linux.scm                             | 44 ++++++++++++++++++++++
 .../patches/kmod-13-module-directory.patch         | 33 ++++++++++++++++
 3 files changed, 78 insertions(+)
 create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 21195f8c1..b1e3c878d 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -795,6 +795,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/kiki-makefile.patch			\
   %D%/packages/patches/kiki-missing-includes.patch		\
   %D%/packages/patches/kiki-portability-64bit.patch		\
+  %D%/packages/patches/kmod-13-module-directory.patch		\
   %D%/packages/patches/kmod-module-directory.patch		\
   %D%/packages/patches/kobodeluxe-paths.patch			\
   %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch	\
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 1f8bf3050..b2e47f79a 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1994,6 +1994,50 @@ from the module-init-tools project.")
                      #t))
                  %standard-phases)))))
 
+(define-public kmod-minimal/static
+  (static-package
+   (package (inherit kmod-minimal)
+    (name "kmod-minimal-static")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (arguments
+     (substitute-keyword-arguments
+       (package-arguments (static-package kmod-minimal))
+       ((#:configure-flags flags ''())
+        `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags))
+       ((#:make-flags flags ''())
+        `(cons* "LDFLAGS=-all-static" ,flags))
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+          (delete 'install-license-files)
+          (add-after 'unpack 'patch-kmod
+           (lambda _
+             ;; Reduce size by 200 kiB.
+             (substitute* "tools/kmod.c"
+              (("[&]kmod_cmd_compat_lsmod,") "")
+              (("[&]kmod_cmd_compat_rmmod,") "")
+              (("[&]kmod_cmd_compat_insmod,") "")
+              (("[&]kmod_cmd_compat_modinfo,") ""))
+             #t))
+          (replace 'install
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (bin (string-append out "/bin")))
+                (install-file "tools/kmod" bin)
+                (for-each
+                 (lambda (tool)
+                   (symlink "kmod" (string-append bin "/" tool)))
+                 '("modprobe" "depmod"))
+                #t))))))))))
+
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.
   (package
diff --git a/gnu/packages/patches/kmod-13-module-directory.patch b/gnu/packages/patches/kmod-13-module-directory.patch
new file mode 100644
index 000000000..5ff2f8a60
--- /dev/null
+++ b/gnu/packages/patches/kmod-13-module-directory.patch
@@ -0,0 +1,33 @@
+This patch changes libkmod so it honors the 'LINUX_MODULE_DIRECTORY'
+environment variable, rather than looking for modules exclusively in
+/lib/modules.
+
+Patch by Shea Levy and Eelco Dolstra, from Nixpkgs; adjusted to
+use 'LINUX_MODULE_DIRECTORY' rather than 'MODULE_DIR' as the variable
+name.
+
+
+--- kmod-7/libkmod/libkmod.c	2012-03-15 08:19:16.750010226 -0400
++++ kmod-7/libkmod/libkmod.c	2012-04-04 15:21:29.532074313 -0400
+@@ -200,7 +200,7 @@
+ static char *get_kernel_release(const char *dirname)
+ {
+ 	struct utsname u;
+-	char *p;
++	char *p, *dirname_prefix;
+ 
+ 	if (dirname != NULL)
+ 		return path_make_absolute_cwd(dirname);
+@@ -208,7 +208,10 @@
+ 	if (uname(&u) < 0)
+ 		return NULL;
+ 
+-	if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0)
++	if ((dirname_prefix = getenv("LINUX_MODULE_DIRECTORY")) == NULL)
++		dirname_prefix = dirname_default_prefix;
++
++	if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0)
+ 		return NULL;
+ 
+ 	return p;
+




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v4 0/7] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 10:27:02 +0000
Resent-Message-ID: <handler.30604.B30604.151972718714952 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151972718714952
          (code B ref 30604); Tue, 27 Feb 2018 10:27:02 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:27 +0000
Received: from localhost ([127.0.0.1]:34370 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqcSp-0003t1-Dk
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:27 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42440)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqcSk-0003sJ-8p
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:25 -0500
Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com
 [77.118.239.24])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 4FB8F336287E;
 Tue, 27 Feb 2018 11:26:20 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 12:26:12 +0100
Message-Id: <20180227112619.5071-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180226040609.3066-1-dannym@HIDDEN>
References: <20180226040609.3066-1-dannym@HIDDEN>
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Danny Milosavljevic (7):
  gnu: kmod: Split off kmod-minimal.
  gnu: Add kmod-minimal-static.
  linux-initrd: Add kmod.
  linux-boot: Load kernel modules only when the hardware is present.
  vm: Allow qemu-image builder to load Linux kernel modules.
  vm: Make the virtio-blk uniquely identifyable in /sys.
  linux-boot: Call make-static-device-nodes much earlier.

 gnu/build/linux-boot.scm                           | 43 ++++++++--
 gnu/build/linux-initrd.scm                         | 12 ++-
 gnu/build/vm.scm                                   |  2 +-
 gnu/local.mk                                       |  1 +
 gnu/packages/linux.scm                             | 91 ++++++++++++++++++----
 .../patches/kmod-13-module-directory.patch         | 33 ++++++++
 gnu/services/base.scm                              | 11 ---
 gnu/system/linux-initrd.scm                        | 50 +++++++++---
 gnu/system/vm.scm                                  | 34 ++++++--
 9 files changed, 224 insertions(+), 53 deletions(-)
 create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v4 3/7] linux-initrd: Add kmod.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 10:27:02 +0000
Resent-Message-ID: <handler.30604.B30604.151972719114981 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151972719114981
          (code B ref 30604); Tue, 27 Feb 2018 10:27:02 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:31 +0000
Received: from localhost ([127.0.0.1]:34375 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqcSs-0003tY-MT
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:30 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42462)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqcSo-0003sY-4j
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:26 -0500
Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com
 [77.118.239.24])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id D778333615C9;
 Tue, 27 Feb 2018 11:26:24 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 12:26:15 +0100
Message-Id: <20180227112619.5071-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN>
References: <20180226040609.3066-1-dannym@HIDDEN>
 <20180227112619.5071-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (raw-initrd): Add kmod.
(base-initrd): Add kmod.
(expression->initrd): Add kmod, linux-module-directory.
(flat-linux-module-directory): Add kmod; invoke depmod.
* gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory.
---
 gnu/build/linux-initrd.scm  | 12 +++++++++++-
 gnu/system/linux-initrd.scm | 45 ++++++++++++++++++++++++++++++++++-----------
 2 files changed, 45 insertions(+), 12 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..6356007df 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init kmod linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,16 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+    ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (when kmod
+      (mkdir-p "sbin")
+      (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe"))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 7170d1c0e..46ef055f0 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -59,6 +59,8 @@
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             kmod
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
+                        #:kmod #$kmod
+                        #:linux-module-directory #$linux-module-directory
                         ;; Copy everything INIT refers to into the initrd.
                         #:references-graphs '("closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
@@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (gexp->derivation name builder
                     #:references-graphs `(("closure" ,init))))
 
-(define (flat-linux-module-directory linux modules)
+(define (flat-linux-module-directory linux modules kmod)
   "Return a flat directory containing the Linux kernel modules listed in
 MODULES and taken from LINUX."
   (define build-exp
@@ -109,7 +113,7 @@ MODULES and taken from LINUX."
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex)
+          (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw)
                        (srfi srfi-1)
                        (guix build utils)
                        (gnu build linux-modules))
@@ -138,13 +142,27 @@ MODULES and taken from LINUX."
                       (recursive-module-dependencies modules
                                                      #:lookup-module lookup))))
 
-          (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
+          (define version
+            (match
+             (filter
+              (lambda (name)
+                (not (string-prefix? "." name)))
+              (scandir module-dir))
+             ((item) item)))
+
+          (let ((output (string-append #$output "/lib/modules/" version)))
+            (mkdir-p output)
+            (for-each (lambda (module)
+                        (format #t "copying '~a'...~%" module)
+                        (copy-file module
+                                   (string-append output "/"
+                                                  (basename module))))
+                      (delete-duplicates modules)))
+          (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output
+                  "-e"
+                  "-F" (string-append #$linux "/System.map")
+                  version)
+          #t)))
 
   (computed-file "linux-modules" build-exp))
 
@@ -152,6 +170,7 @@ MODULES and taken from LINUX."
                       #:key
                       (linux linux-libre)
                       (linux-modules '())
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       (helper-packages '())
                       qemu-networking?
@@ -185,7 +204,7 @@ upon error."
          mapped-devices))
 
   (define kodir
-    (flat-linux-module-directory linux linux-modules))
+    (flat-linux-module-directory linux linux-modules kmod))
 
   (expression->initrd
    (with-imported-modules (source-module-closure
@@ -223,6 +242,8 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:kmod kmod
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))
@@ -245,6 +266,7 @@ FILE-SYSTEMS."
 (define* (base-initrd file-systems
                       #:key
                       (linux linux-libre)
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       qemu-networking?
                       volatile-root?
@@ -322,8 +344,9 @@ loaded at boot time in the order in which they appear."
   (raw-initrd file-systems
               #:linux linux
               #:linux-modules linux-modules
+              #:kmod kmod
               #:mapped-devices mapped-devices
-              #:helper-packages helper-packages
+              #:helper-packages (cons kmod helper-packages)
               #:qemu-networking? qemu-networking?
               #:volatile-root? volatile-root?
               #:on-error on-error))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v4 4/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 10:27:03 +0000
Resent-Message-ID: <handler.30604.B30604.151972719114989 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151972719114989
          (code B ref 30604); Tue, 27 Feb 2018 10:27:03 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:31 +0000
Received: from localhost ([127.0.0.1]:34377 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqcSt-0003ta-0V
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:31 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42452)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqcSo-0003sT-NX
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:27 -0500
Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com
 [77.118.239.24])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 3860E3362AB9;
 Tue, 27 Feb 2018 11:26:26 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 12:26:16 +0100
Message-Id: <20180227112619.5071-5-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN>
References: <20180226040609.3066-1-dannym@HIDDEN>
 <20180227112619.5071-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 31 +++++++++++++++++++++++++++----
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..6d00ea9be 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -473,6 +473,32 @@ upon error."
     (string-append linux-module-directory "/"
                    (ensure-dot-ko name)))
 
+  (define (load-kernel-modules)
+    "Examine /sys/devices to find out which modules to load and load them."
+    (define enter?
+      (const #t))
+    (define (down! path stat result)
+     ;; Note: modprobe mutates the tree starting with path.
+     (let ((modalias-name (string-append path "/modalias")))
+       (if (file-exists? modalias-name)
+           (let ((modalias
+                 (string-trim-right (call-with-input-file modalias-name
+                                                          read-string)
+                                    #\newline)))
+             (system* "/sbin/modprobe" "-q" "--" modalias))))
+       #t)
+    (define up
+      (const #t))
+    (define skip
+      (const #t))
+    (define leaf
+      (const #t))
+    (define (error name stat errno result)
+      (format (current-error-port) "warning: ~a: ~a~%"
+              name (strerror errno))
+      result)
+    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
+
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
 
@@ -486,10 +512,7 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 46ef055f0..c8a9e4950 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -225,7 +225,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v4 5/7] vm: Allow qemu-image builder to load Linux kernel modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 10:27:03 +0000
Resent-Message-ID: <handler.30604.B30604.151972719114997 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151972719114997
          (code B ref 30604); Tue, 27 Feb 2018 10:27:03 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:31 +0000
Received: from localhost ([127.0.0.1]:34379 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqcSt-0003ti-A0
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:31 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42476)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqcSq-0003tD-37
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:28 -0500
Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com
 [77.118.239.24])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 38CEC33615C9;
 Tue, 27 Feb 2018 11:26:27 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 12:26:17 +0100
Message-Id: <20180227112619.5071-6-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN>
References: <20180226040609.3066-1-dannym@HIDDEN>
 <20180227112619.5071-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/vm.scm (%modprobe-wrapper): New variable.
(qemu-image): Modify.
---
 gnu/system/vm.scm | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 345cecedd..b5a559012 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)."
    #:single-file-output? #t
    #:references-graphs inputs))
 
+(define (%modprobe-wrapper modprobe linux-module-directory)
+  ;; Wrapper for the 'modprobe' command that knows where modules live.
+  ;;
+  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
+  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
+  ;; environment variable is not set---hence the need for this wrapper.
+  (program-file "modprobe"
+    #~(begin
+        (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory)
+        (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))
+
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
@@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe"))
+        (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules"))))
   (expression->derivation-in-linux-vm
    name
-   (with-imported-modules (source-module-closure '((gnu build bootloader)
+   (with-imported-modules (source-module-closure '((gnu build activation)
+                                                   (gnu build bootloader)
                                                    (gnu build vm)
                                                    (guix build utils)))
      #~(begin
-         (use-modules (gnu build bootloader)
+         (use-modules (gnu build activation)
+                      (gnu build bootloader)
                       (gnu build vm)
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
          (let ((inputs
-                '#$(append (list qemu parted e2fsprogs dosfstools)
+                '#$(append (list qemu parted e2fsprogs dosfstools kmod)
                            (map canonical-package
                                 (list sed grep coreutils findutils gawk))
                            (if register-closures? (list guix) '())))
@@ -302,6 +317,14 @@ the image."
                         inputs)))
 
            (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+           ;; It's possible that we need to load nls modules in order to
+           ;; mount the new partition.
+           (if (file-exists? #$modprobe-name)
+               (activate-modprobe #$(%modprobe-wrapper modprobe-name
+                                     linux-module-directory))
+               (format (current-error-port)
+                "WARNING: No modprobe found in ~s.  \
+Loading kernel modules will be impossible.\n" #$modprobe-name))
 
            (let* ((graphs     '#$(match inputs
                                    (((names . _) ...)
@@ -364,7 +387,7 @@ the image."
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-   #:references-graphs inputs))
+   #:references-graphs inputs)))
 
 
 ;;;




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v4 6/7] vm: Make the virtio-blk uniquely identifyable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 10:27:04 +0000
Resent-Message-ID: <handler.30604.B30604.151972719215005 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151972719215005
          (code B ref 30604); Tue, 27 Feb 2018 10:27:04 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:32 +0000
Received: from localhost ([127.0.0.1]:34381 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqcSt-0003tq-If
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:31 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42486)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqcSr-0003tK-1Y
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:29 -0500
Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com
 [77.118.239.24])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 287F7336287E;
 Tue, 27 Feb 2018 11:26:28 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 12:26:18 +0100
Message-Id: <20180227112619.5071-7-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN>
References: <20180226040609.3066-1-dannym@HIDDEN>
 <20180227112619.5071-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.
---
 gnu/build/vm.scm  | 2 +-
 gnu/system/vm.scm | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..ebf9e9f6e 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index b5a559012..fdff64ed9 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v4 7/7] linux-boot: Call make-static-device-nodes much earlier.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 10:27:04 +0000
Resent-Message-ID: <handler.30604.B30604.151972719215012 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151972719215012
          (code B ref 30604); Tue, 27 Feb 2018 10:27:04 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 10:26:32 +0000
Received: from localhost ([127.0.0.1]:34383 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqcSt-0003tz-SH
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:32 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42494)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqcSs-0003tR-6v
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 05:26:30 -0500
Received: from dayas.3.home (77.118.239.24.wireless.dyn.drei.com
 [77.118.239.24])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 3B36533615C9;
 Tue, 27 Feb 2018 11:26:29 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 12:26:19 +0100
Message-Id: <20180227112619.5071-8-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN>
References: <20180226040609.3066-1-dannym@HIDDEN>
 <20180227112619.5071-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (expression->initrd): Store data files for
make-static-device-nodes.
* gnu/build/linux-boot.scm (make-static-device-nodes): Unexport.
(boot-system): Call make-static-device-nodes.  Delete lookup-module.
* gnu/services/base.scm (udev-shepherd-service): Delete
make-static-device-nodes call.
---
 gnu/build/linux-boot.scm    | 14 +++++++++-----
 gnu/services/base.scm       | 11 -----------
 gnu/system/linux-initrd.scm |  3 ++-
 3 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 6d00ea9be..f0ac755f8 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -39,7 +39,6 @@
             find-long-option
             find-long-options
             make-essential-device-nodes
-            make-static-device-nodes
             configure-qemu-networking
 
             device-number
@@ -469,10 +468,6 @@ upon error."
              mounts)
         "ext4"))
 
-  (define (lookup-module name)
-    (string-append linux-module-directory "/"
-                   (ensure-dot-ko name)))
-
   (define (load-kernel-modules)
     "Examine /sys/devices to find out which modules to load and load them."
     (define enter?
@@ -512,6 +507,15 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
+       (let* ((kernel-release
+               (utsname:release (uname)))
+              (directory
+               (string-append linux-module-directory "/lib/modules/"
+                              kernel-release))
+              (old-umask (umask #o022)))
+         (make-static-device-nodes directory)
+         (umask old-umask))
+
        (load-kernel-modules)
 
        (when qemu-guest-networking?
diff --git a/gnu/services/base.scm b/gnu/services/base.scm
index 69e211ffa..0cba1c66f 100644
--- a/gnu/services/base.scm
+++ b/gnu/services/base.scm
@@ -1857,17 +1857,6 @@ item of @var{packages}."
                     (setenv "EUDEV_RULES_DIRECTORY"
                             #$(file-append rules "/lib/udev/rules.d"))
 
-                    (let* ((kernel-release
-                            (utsname:release (uname)))
-                           (linux-module-directory
-                            (getenv "LINUX_MODULE_DIRECTORY"))
-                           (directory
-                            (string-append linux-module-directory "/"
-                                           kernel-release))
-                           (old-umask (umask #o022)))
-                      (make-static-device-nodes directory)
-                      (umask old-umask))
-
                     (let ((pid (primitive-fork)))
                       (case pid
                         ((0)




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v3 4/6] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:27:02 +0000
Resent-Message-ID: <handler.30604.B30604.151974157013343 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974157013343
          (code B ref 30604); Tue, 27 Feb 2018 14:27:02 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:26:10 +0000
Received: from localhost ([127.0.0.1]:34594 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgCn-0003T9-Vw
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:26:10 -0500
Received: from hera.aquilenet.fr ([185.233.100.1]:52424)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1eqgCm-0003Sz-Bb
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:26:08 -0500
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id D2C2D11FDE;
 Tue, 27 Feb 2018 15:26:07 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id c7om1nzrY475; Tue, 27 Feb 2018 15:26:06 +0100 (CET)
Received: from ribbon (unknown [193.50.110.216])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 6E96B11CC3;
 Tue, 27 Feb 2018 15:26:06 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <20180226035025.1698-1-dannym@HIDDEN>
 <20180226040609.3066-1-dannym@HIDDEN>
 <20180226040609.3066-5-dannym@HIDDEN>
Date: Tue, 27 Feb 2018 15:26:06 +0100
In-Reply-To: <20180226040609.3066-5-dannym@HIDDEN> (Danny
 Milosavljevic's message of "Mon, 26 Feb 2018 05:06:07 +0100")
Message-ID: <87muzu33wh.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Hello,

Nice patch series!

Danny Milosavljevic <dannym@HIDDEN> skribis:

> * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
> the hardware is present.
> * gnu/system/linux-initrd.scm (raw-initrd): Add imports.

[...]

> +  (define (load-kernel-modules)
> +    "Examine /sys/devices to find out which modules to load and load the=
m."
> +    (define enter?
> +      (const #t))
> +    (define (down! path stat result)
> +     ;; Note: modprobe mutates the tree starting with path.
> +     (let ((modalias-name (string-append path "/modalias")))
> +       (if (file-exists? modalias-name)
> +           (let ((modalias
> +                 (string-trim-right (call-with-input-file modalias-name
> +                                                          read-string)
> +                                    #\newline)))
> +             (system* "/sbin/modprobe" "-q" "--" modalias))))

Can we build upon (gnu build linux-modules) to achieve this?

Hopefully the tools at
<https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D30629#14> can help a bit.

Thanks,
Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v5 1/7] gnu: kmod: Split off kmod-minimal.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:51:01 +0000
Resent-Message-ID: <handler.30604.B30604.151974305415820 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974305415820
          (code B ref 30604); Tue, 27 Feb 2018 14:51:01 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:54 +0000
Received: from localhost ([127.0.0.1]:34606 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgak-000475-7U
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:54 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:35998)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqgai-00046u-Ii
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:53 -0500
Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com
 [77.118.157.234])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 4278533601CF;
 Tue, 27 Feb 2018 15:50:51 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 16:50:45 +0100
Message-Id: <20180227155051.1141-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN>
References: <20180227112619.5071-1-dannym@HIDDEN>
 <20180227155051.1141-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal): New variable.
(kmod): Modify.
---
 gnu/packages/linux.scm | 49 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 16 deletions(-)

diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 238398e84..1f8bf3050 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1933,8 +1933,35 @@ for systems using the Linux kernel.  This includes commands such as
 to use Linux' inotify mechanism, which allows file accesses to be monitored.")
     (license license:gpl2+)))
 
-(define-public kmod
+(define kmod-minimal
   (package
+    (name "kmod-minimal")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:tests? #f)) ; FIXME: Investigate test failures
+    (home-page "https://www.kernel.org/")
+    (synopsis "Kernel module tools")
+    (description "Kmod is a set of tools to handle common tasks with Linux
+kernel modules like insert, remove, list, check properties, resolve
+dependencies and aliases.
+
+These tools are designed on top of libkmod, a library that is shipped with
+kmod.  The aim is to be compatible with tools, configurations and indices
+from the module-init-tools project.")
+    (license license:gpl2+))) ; library under lgpl2.1+
+
+(define-public kmod
+  (package (inherit kmod-minimal)
     (name "kmod")
     (version "24")
     (source (origin
@@ -1946,15 +1973,14 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                (base32
                 "15xkkkzvca9flvkm48gkh8y8f13vlm3sl7nz9ydc7b3jy4fqs2v1"))
               (patches (search-patches "kmod-module-directory.patch"))))
-    (build-system gnu-build-system)
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (inputs
      `(("xz" ,xz)
        ("zlib" ,zlib)))
     (arguments
-     `(#:tests? #f ; FIXME: Investigate test failures
-       #:configure-flags '("--with-xz" "--with-zlib")
+     `(#:configure-flags '("--with-xz" "--with-zlib")
+       #:tests? #f ; FIXME: Investigate test failures
        #:phases (alist-cons-after
                  'install 'install-modprobe&co
                  (lambda* (#:key outputs #:allow-other-keys)
@@ -1964,18 +1990,9 @@ to use Linux' inotify mechanism, which allows file accesses to be monitored.")
                                  (symlink "kmod"
                                           (string-append bin "/" tool)))
                                '("insmod" "rmmod" "lsmod" "modprobe"
-                                 "modinfo" "depmod"))))
-                 %standard-phases)))
-    (home-page "https://www.kernel.org/")
-    (synopsis "Kernel module tools")
-    (description "Kmod is a set of tools to handle common tasks with Linux
-kernel modules like insert, remove, list, check properties, resolve
-dependencies and aliases.
-
-These tools are designed on top of libkmod, a library that is shipped with
-kmod.  The aim is to be compatible with tools, configurations and indices
-from the module-init-tools project.")
-    (license license:gpl2+))) ; library under lgpl2.1+
+                                 "modinfo" "depmod"))
+                     #t))
+                 %standard-phases)))))
 
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v5 0/7] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:51:02 +0000
Resent-Message-ID: <handler.30604.B30604.151974305815856 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974305815856
          (code B ref 30604); Tue, 27 Feb 2018 14:51:02 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:58 +0000
Received: from localhost ([127.0.0.1]:34611 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgao-00047f-G7
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:58 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:35994)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqgah-00046r-8w
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:55 -0500
Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com
 [77.118.157.234])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 5F1073360129;
 Tue, 27 Feb 2018 15:50:49 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 16:50:44 +0100
Message-Id: <20180227155051.1141-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227112619.5071-1-dannym@HIDDEN>
References: <20180227112619.5071-1-dannym@HIDDEN>
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Danny Milosavljevic (7):
  gnu: kmod: Split off kmod-minimal.
  gnu: Add kmod-minimal-static.
  linux-initrd: Add kmod.
  linux-boot: Load kernel modules only when the hardware is present.
  vm: Allow qemu-image builder to load Linux kernel modules.
  vm: Make the virtio-blk is uniquely identifyable in /sys.
  linux-boot: Call make-static-device-nodes much earlier.

 gnu/build/linux-boot.scm                           | 42 ++++++++--
 gnu/build/linux-initrd.scm                         | 12 ++-
 gnu/build/vm.scm                                   |  2 +-
 gnu/local.mk                                       |  1 +
 gnu/packages/linux.scm                             | 91 ++++++++++++++++++----
 .../patches/kmod-13-module-directory.patch         | 33 ++++++++
 gnu/system/linux-initrd.scm                        | 50 +++++++++---
 gnu/system/vm.scm                                  | 34 ++++++--
 8 files changed, 224 insertions(+), 41 deletions(-)
 create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v5 2/7] gnu: Add kmod-minimal-static.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:51:02 +0000
Resent-Message-ID: <handler.30604.B30604.151974305915863 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974305915863
          (code B ref 30604); Tue, 27 Feb 2018 14:51:02 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:59 +0000
Received: from localhost ([127.0.0.1]:34613 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgao-00047h-Mm
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:58 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:36008)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqgak-000476-Oq
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:55 -0500
Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com
 [77.118.157.234])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id D24623361202;
 Tue, 27 Feb 2018 15:50:52 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 16:50:46 +0100
Message-Id: <20180227155051.1141-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN>
References: <20180227112619.5071-1-dannym@HIDDEN>
 <20180227155051.1141-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/packages/linux.scm (kmod-minimal/static): New variable.
* gnu/packages/patches/kmod-13-module-directory.patch: New file.
* gnu/local.mk: Add it.
---
 gnu/local.mk                                       |  1 +
 gnu/packages/linux.scm                             | 44 ++++++++++++++++++++++
 .../patches/kmod-13-module-directory.patch         | 33 ++++++++++++++++
 3 files changed, 78 insertions(+)
 create mode 100644 gnu/packages/patches/kmod-13-module-directory.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 21195f8c1..b1e3c878d 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -795,6 +795,7 @@ dist_patch_DATA =						\
   %D%/packages/patches/kiki-makefile.patch			\
   %D%/packages/patches/kiki-missing-includes.patch		\
   %D%/packages/patches/kiki-portability-64bit.patch		\
+  %D%/packages/patches/kmod-13-module-directory.patch		\
   %D%/packages/patches/kmod-module-directory.patch		\
   %D%/packages/patches/kobodeluxe-paths.patch			\
   %D%/packages/patches/kobodeluxe-enemies-pipe-decl.patch	\
diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm
index 1f8bf3050..b2e47f79a 100644
--- a/gnu/packages/linux.scm
+++ b/gnu/packages/linux.scm
@@ -1994,6 +1994,50 @@ from the module-init-tools project.")
                      #t))
                  %standard-phases)))))
 
+(define-public kmod-minimal/static
+  (static-package
+   (package (inherit kmod-minimal)
+    (name "kmod-minimal-static")
+    (version "13")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "mirror://kernel.org/linux/utils/kernel/kmod/"
+                              "kmod-" version ".tar.xz"))
+              (sha256
+               (base32
+                "0mkrklih0f33c3zc4mkk9qqbzy36r18mj9xffd4wi61gpamx6dkc"))
+              (patches (search-patches "kmod-13-module-directory.patch"))))
+    (arguments
+     (substitute-keyword-arguments
+       (package-arguments (static-package kmod-minimal))
+       ((#:configure-flags flags ''())
+        `(cons* "--disable-manpages" "--disable-static" "--disable-shared" ,flags))
+       ((#:make-flags flags ''())
+        `(cons* "LDFLAGS=-all-static" ,flags))
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+          (delete 'install-license-files)
+          (add-after 'unpack 'patch-kmod
+           (lambda _
+             ;; Reduce size by 200 kiB.
+             (substitute* "tools/kmod.c"
+              (("[&]kmod_cmd_compat_lsmod,") "")
+              (("[&]kmod_cmd_compat_rmmod,") "")
+              (("[&]kmod_cmd_compat_insmod,") "")
+              (("[&]kmod_cmd_compat_modinfo,") ""))
+             #t))
+          (replace 'install
+            (lambda* (#:key outputs #:allow-other-keys)
+              (let* ((out (assoc-ref outputs "out"))
+                     (bin (string-append out "/bin")))
+                (install-file "tools/kmod" bin)
+                (for-each
+                 (lambda (tool)
+                   (symlink "kmod" (string-append bin "/" tool)))
+                 '("modprobe" "depmod"))
+                #t))))))))))
+
 (define-public eudev
   ;; The post-systemd fork, maintained by Gentoo.
   (package
diff --git a/gnu/packages/patches/kmod-13-module-directory.patch b/gnu/packages/patches/kmod-13-module-directory.patch
new file mode 100644
index 000000000..5ff2f8a60
--- /dev/null
+++ b/gnu/packages/patches/kmod-13-module-directory.patch
@@ -0,0 +1,33 @@
+This patch changes libkmod so it honors the 'LINUX_MODULE_DIRECTORY'
+environment variable, rather than looking for modules exclusively in
+/lib/modules.
+
+Patch by Shea Levy and Eelco Dolstra, from Nixpkgs; adjusted to
+use 'LINUX_MODULE_DIRECTORY' rather than 'MODULE_DIR' as the variable
+name.
+
+
+--- kmod-7/libkmod/libkmod.c	2012-03-15 08:19:16.750010226 -0400
++++ kmod-7/libkmod/libkmod.c	2012-04-04 15:21:29.532074313 -0400
+@@ -200,7 +200,7 @@
+ static char *get_kernel_release(const char *dirname)
+ {
+ 	struct utsname u;
+-	char *p;
++	char *p, *dirname_prefix;
+ 
+ 	if (dirname != NULL)
+ 		return path_make_absolute_cwd(dirname);
+@@ -208,7 +208,10 @@
+ 	if (uname(&u) < 0)
+ 		return NULL;
+ 
+-	if (asprintf(&p, "%s/%s", dirname_default_prefix, u.release) < 0)
++	if ((dirname_prefix = getenv("LINUX_MODULE_DIRECTORY")) == NULL)
++		dirname_prefix = dirname_default_prefix;
++
++	if (asprintf(&p, "%s/%s", dirname_prefix, u.release) < 0)
+ 		return NULL;
+ 
+ 	return p;
+




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v5 3/7] linux-initrd: Add kmod.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:51:03 +0000
Resent-Message-ID: <handler.30604.B30604.151974305915876 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974305915876
          (code B ref 30604); Tue, 27 Feb 2018 14:51:03 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:59 +0000
Received: from localhost ([127.0.0.1]:34615 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgao-00047o-VY
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:59 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:36020)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqgam-00047P-F0
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:56 -0500
Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com
 [77.118.157.234])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id ED3CC33601CF;
 Tue, 27 Feb 2018 15:50:54 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 16:50:47 +0100
Message-Id: <20180227155051.1141-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN>
References: <20180227112619.5071-1-dannym@HIDDEN>
 <20180227155051.1141-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (raw-initrd): Add kmod.
(base-initrd): Add kmod.
(expression->initrd): Add kmod, linux-module-directory.
(flat-linux-module-directory): Add kmod; invoke depmod.
* gnu/build/linux-initrd.scm (build-initrd): Add kmod, linux-module-directory.
---
 gnu/build/linux-initrd.scm  | 12 +++++++++++-
 gnu/system/linux-initrd.scm | 45 ++++++++++++++++++++++++++++++++++-----------
 2 files changed, 45 insertions(+), 12 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..6356007df 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init kmod linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,16 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+    ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (when kmod
+      (mkdir-p "sbin")
+      (symlink (string-append kmod "/bin/modprobe") "sbin/modprobe"))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 7170d1c0e..46ef055f0 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -59,6 +59,8 @@
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             kmod
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -94,6 +96,8 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
+                        #:kmod #$kmod
+                        #:linux-module-directory #$linux-module-directory
                         ;; Copy everything INIT refers to into the initrd.
                         #:references-graphs '("closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
@@ -101,7 +105,7 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (gexp->derivation name builder
                     #:references-graphs `(("closure" ,init))))
 
-(define (flat-linux-module-directory linux modules)
+(define (flat-linux-module-directory linux modules kmod)
   "Return a flat directory containing the Linux kernel modules listed in
 MODULES and taken from LINUX."
   (define build-exp
@@ -109,7 +113,7 @@ MODULES and taken from LINUX."
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex)
+          (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw)
                        (srfi srfi-1)
                        (guix build utils)
                        (gnu build linux-modules))
@@ -138,13 +142,27 @@ MODULES and taken from LINUX."
                       (recursive-module-dependencies modules
                                                      #:lookup-module lookup))))
 
-          (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
+          (define version
+            (match
+             (filter
+              (lambda (name)
+                (not (string-prefix? "." name)))
+              (scandir module-dir))
+             ((item) item)))
+
+          (let ((output (string-append #$output "/lib/modules/" version)))
+            (mkdir-p output)
+            (for-each (lambda (module)
+                        (format #t "copying '~a'...~%" module)
+                        (copy-file module
+                                   (string-append output "/"
+                                                  (basename module))))
+                      (delete-duplicates modules)))
+          (invoke (string-append #$kmod "/bin/depmod") "-a" "-b" #$output
+                  "-e"
+                  "-F" (string-append #$linux "/System.map")
+                  version)
+          #t)))
 
   (computed-file "linux-modules" build-exp))
 
@@ -152,6 +170,7 @@ MODULES and taken from LINUX."
                       #:key
                       (linux linux-libre)
                       (linux-modules '())
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       (helper-packages '())
                       qemu-networking?
@@ -185,7 +204,7 @@ upon error."
          mapped-devices))
 
   (define kodir
-    (flat-linux-module-directory linux linux-modules))
+    (flat-linux-module-directory linux linux-modules kmod))
 
   (expression->initrd
    (with-imported-modules (source-module-closure
@@ -223,6 +242,8 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:kmod kmod
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))
@@ -245,6 +266,7 @@ FILE-SYSTEMS."
 (define* (base-initrd file-systems
                       #:key
                       (linux linux-libre)
+                      (kmod kmod-minimal/static)
                       (mapped-devices '())
                       qemu-networking?
                       volatile-root?
@@ -322,8 +344,9 @@ loaded at boot time in the order in which they appear."
   (raw-initrd file-systems
               #:linux linux
               #:linux-modules linux-modules
+              #:kmod kmod
               #:mapped-devices mapped-devices
-              #:helper-packages helper-packages
+              #:helper-packages (cons kmod helper-packages)
               #:qemu-networking? qemu-networking?
               #:volatile-root? volatile-root?
               #:on-error on-error))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v5 4/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:51:03 +0000
Resent-Message-ID: <handler.30604.B30604.151974305915882 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974305915882
          (code B ref 30604); Tue, 27 Feb 2018 14:51:03 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:50:59 +0000
Received: from localhost ([127.0.0.1]:34618 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgap-000481-AZ
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:59 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:36030)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqgan-00047X-JD
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:57 -0500
Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com
 [77.118.157.234])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 86D683361202;
 Tue, 27 Feb 2018 15:50:56 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 16:50:48 +0100
Message-Id: <20180227155051.1141-5-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN>
References: <20180227112619.5071-1-dannym@HIDDEN>
 <20180227155051.1141-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 31 +++++++++++++++++++++++++++----
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..6d00ea9be 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -473,6 +473,32 @@ upon error."
     (string-append linux-module-directory "/"
                    (ensure-dot-ko name)))
 
+  (define (load-kernel-modules)
+    "Examine /sys/devices to find out which modules to load and load them."
+    (define enter?
+      (const #t))
+    (define (down! path stat result)
+     ;; Note: modprobe mutates the tree starting with path.
+     (let ((modalias-name (string-append path "/modalias")))
+       (if (file-exists? modalias-name)
+           (let ((modalias
+                 (string-trim-right (call-with-input-file modalias-name
+                                                          read-string)
+                                    #\newline)))
+             (system* "/sbin/modprobe" "-q" "--" modalias))))
+       #t)
+    (define up
+      (const #t))
+    (define skip
+      (const #t))
+    (define leaf
+      (const #t))
+    (define (error name stat errno result)
+      (format (current-error-port) "warning: ~a: ~a~%"
+              name (strerror errno))
+      result)
+    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
+
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
 
@@ -486,10 +512,7 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 46ef055f0..c8a9e4950 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -225,7 +225,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v5 5/7] vm: Allow qemu-image builder to load Linux kernel modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:52:01 +0000
Resent-Message-ID: <handler.30604.B30604.151974306715964 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974306715964
          (code B ref 30604); Tue, 27 Feb 2018 14:52:01 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:51:07 +0000
Received: from localhost ([127.0.0.1]:34627 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgaw-00049P-KF
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:06 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:36040)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqgao-00047e-Oj
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:50:59 -0500
Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com
 [77.118.157.234])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id B4E8E3360129;
 Tue, 27 Feb 2018 15:50:57 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 16:50:49 +0100
Message-Id: <20180227155051.1141-6-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN>
References: <20180227112619.5071-1-dannym@HIDDEN>
 <20180227155051.1141-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/vm.scm (%modprobe-wrapper): New variable.
(qemu-image): Modify.
---
 gnu/system/vm.scm | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 345cecedd..b5a559012 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)."
    #:single-file-output? #t
    #:references-graphs inputs))
 
+(define (%modprobe-wrapper modprobe linux-module-directory)
+  ;; Wrapper for the 'modprobe' command that knows where modules live.
+  ;;
+  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
+  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
+  ;; environment variable is not set---hence the need for this wrapper.
+  (program-file "modprobe"
+    #~(begin
+        (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory)
+        (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))
+
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
@@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe"))
+        (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules"))))
   (expression->derivation-in-linux-vm
    name
-   (with-imported-modules (source-module-closure '((gnu build bootloader)
+   (with-imported-modules (source-module-closure '((gnu build activation)
+                                                   (gnu build bootloader)
                                                    (gnu build vm)
                                                    (guix build utils)))
      #~(begin
-         (use-modules (gnu build bootloader)
+         (use-modules (gnu build activation)
+                      (gnu build bootloader)
                       (gnu build vm)
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
          (let ((inputs
-                '#$(append (list qemu parted e2fsprogs dosfstools)
+                '#$(append (list qemu parted e2fsprogs dosfstools kmod)
                            (map canonical-package
                                 (list sed grep coreutils findutils gawk))
                            (if register-closures? (list guix) '())))
@@ -302,6 +317,14 @@ the image."
                         inputs)))
 
            (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+           ;; It's possible that we need to load nls modules in order to
+           ;; mount the new partition.
+           (if (file-exists? #$modprobe-name)
+               (activate-modprobe #$(%modprobe-wrapper modprobe-name
+                                     linux-module-directory))
+               (format (current-error-port)
+                "WARNING: No modprobe found in ~s.  \
+Loading kernel modules will be impossible.\n" #$modprobe-name))
 
            (let* ((graphs     '#$(match inputs
                                    (((names . _) ...)
@@ -364,7 +387,7 @@ the image."
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-   #:references-graphs inputs))
+   #:references-graphs inputs)))
 
 
 ;;;




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v5 6/7] vm: Make the virtio-blk is uniquely identifyable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:52:01 +0000
Resent-Message-ID: <handler.30604.B30604.151974306715972 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974306715972
          (code B ref 30604); Tue, 27 Feb 2018 14:52:01 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:51:07 +0000
Received: from localhost ([127.0.0.1]:34629 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgaw-00049R-Sq
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:07 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:36048)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqgaq-00048E-UK
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:01 -0500
Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com
 [77.118.157.234])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 951C03360129;
 Tue, 27 Feb 2018 15:50:59 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 16:50:50 +0100
Message-Id: <20180227155051.1141-7-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN>
References: <20180227112619.5071-1-dannym@HIDDEN>
 <20180227155051.1141-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.
---
 gnu/build/vm.scm  | 2 +-
 gnu/system/vm.scm | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..ebf9e9f6e 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index b5a559012..fdff64ed9 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v5 7/7] linux-boot: Call make-static-device-nodes much earlier.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 27 Feb 2018 14:52:02 +0000
Resent-Message-ID: <handler.30604.B30604.151974306715978 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.151974306715978
          (code B ref 30604); Tue, 27 Feb 2018 14:52:02 +0000
Received: (at 30604) by debbugs.gnu.org; 27 Feb 2018 14:51:07 +0000
Received: from localhost ([127.0.0.1]:34631 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1eqgax-00049Z-4B
	for submit <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:07 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:36062)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1eqgat-00048n-Bl
 for 30604 <at> debbugs.gnu.org; Tue, 27 Feb 2018 09:51:03 -0500
Received: from dayas.3.home (77.118.157.234.wireless.dyn.drei.com
 [77.118.157.234])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id BC7A533601CF;
 Tue, 27 Feb 2018 15:51:01 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Tue, 27 Feb 2018 16:50:51 +0100
Message-Id: <20180227155051.1141-8-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN>
References: <20180227112619.5071-1-dannym@HIDDEN>
 <20180227155051.1141-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (expression->initrd): Store data files for
make-static-device-nodes.
* gnu/build/linux-boot.scm (boot-system): Call make-static-device-nodes.
Delete lookup-module.
---
 gnu/build/linux-boot.scm    | 13 +++++++++----
 gnu/system/linux-initrd.scm |  3 ++-
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 6d00ea9be..1b16f267a 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -469,10 +469,6 @@ upon error."
              mounts)
         "ext4"))
 
-  (define (lookup-module name)
-    (string-append linux-module-directory "/"
-                   (ensure-dot-ko name)))
-
   (define (load-kernel-modules)
     "Examine /sys/devices to find out which modules to load and load them."
     (define enter?
@@ -512,6 +508,15 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
+       (let* ((kernel-release
+               (utsname:release (uname)))
+              (directory
+               (string-append linux-module-directory "/lib/modules/"
+                              kernel-release))
+              (old-umask (umask #o022)))
+         (make-static-device-nodes directory)
+         (umask old-umask))
+
        (load-kernel-modules)
 
        (when qemu-guest-networking?




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v6 0/6] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 14:17:02 +0000
Resent-Message-ID: <handler.30604.B30604.15200001755816 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15200001755816
          (code B ref 30604); Fri, 02 Mar 2018 14:17:02 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:16:15 +0000
Received: from localhost ([127.0.0.1]:40319 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1erlTr-0001Vk-9b
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:16:15 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:54846)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1erlTq-0001Vc-0o
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:16:14 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 0FC8E33601D1;
 Fri,  2 Mar 2018 15:16:10 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 15:16:06 +0100
Message-Id: <20180302141606.10669-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180227155051.1141-1-dannym@HIDDEN>
References: <20180227155051.1141-1-dannym@HIDDEN>
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Danny Milosavljevic (6):
  linux-modules: Add module-aliases.
  linux-modules: Add install-modules.
  linux-boot: Load kernel modules only when the hardware is present.
  vm: Allow qemu-image builder to load Linux kernel modules.
  vm: Make the virtio-blk uniquely identifiable in /sys.
  linux-initrd: Provide modprobe to the initrd.

 gnu/build/linux-boot.scm    | 42 ++++++++++++++++++----
 gnu/build/linux-initrd.scm  | 13 ++++++-
 gnu/build/linux-modules.scm | 61 +++++++++++++++++++++++++++++++
 gnu/build/vm.scm            |  2 +-
 gnu/system/linux-initrd.scm | 88 +++++++++++++++++++++++++++++++++++++++------
 gnu/system/vm.scm           | 34 +++++++++++++++---
 6 files changed, 216 insertions(+), 24 deletions(-)





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v6 1/6] linux-modules: Add module-aliases.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 14:18:01 +0000
Resent-Message-ID: <handler.30604.B30604.15200002505937 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15200002505937
          (code B ref 30604); Fri, 02 Mar 2018 14:18:01 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:30 +0000
Received: from localhost ([127.0.0.1]:40323 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1erlV3-0001Xh-JG
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:29 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:55060)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1erlV1-0001XX-Mp
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:27 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 13F6733601D1;
 Fri,  2 Mar 2018 15:17:25 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 15:17:15 +0100
Message-Id: <20180302141720.10720-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302141606.10669-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (module-aliases): New variable.
---
 gnu/build/linux-modules.scm | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 4a6d4ff08..364339df9 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -30,6 +30,7 @@
   #:use-module (ice-9 rdelim)
   #:export (dot-ko
             ensure-dot-ko
+            module-aliases
             module-dependencies
             recursive-module-dependencies
             modules-loaded
@@ -95,6 +96,14 @@ contains module names, not actual file names."
       (('depends . what)
        (string-tokenize what %not-comma)))))
 
+(define (module-aliases file)
+  "Return the list of aliases for FILE."
+  (let ((info (modinfo-section-contents file)))
+    (filter-map (match-lambda
+                 (('alias . value)
+                  value)
+                 (_ #f)) (modinfo-section-contents file))))
+
 (define dot-ko
   (cut string-append <> ".ko"))
 




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v6 2/6] linux-modules: Add install-modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 14:18:02 +0000
Resent-Message-ID: <handler.30604.B30604.15200002515951 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15200002515951
          (code B ref 30604); Fri, 02 Mar 2018 14:18:02 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:31 +0000
Received: from localhost ([127.0.0.1]:40326 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1erlV4-0001Xu-Rg
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:31 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:55068)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1erlV3-0001Xe-Jl
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:29 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 2743F33601D1;
 Fri,  2 Mar 2018 15:17:27 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 15:17:16 +0100
Message-Id: <20180302141720.10720-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302141720.10720-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (install-modules): New procedure.
(%not-dash): New variable.
---
 gnu/build/linux-modules.scm | 52 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 364339df9..af217c974 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -36,6 +36,7 @@
             modules-loaded
             module-loaded?
             load-linux-module*
+            install-module-files
 
             current-module-debugging-port
 
@@ -379,4 +380,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                       module)))
               known-aliases))
 
+(define %not-dash
+  (char-set-complement (char-set #\-)))
+
+(define (install-module-files module-files output)
+  "Install MODULE-FILES to OUTPUT.
+Precondition: OUTPUT is an empty directory."
+  (let ((aliases
+         (map (lambda (module-file-name)
+                (format #t "copying '~a'...~%" module-file-name)
+                (copy-file module-file-name
+                           (string-append output "/"
+                                          (basename module-file-name)))
+                `(,(file-name->module-name module-file-name) .
+                  ,(module-aliases module-file-name)))
+              (sort module-files string<))))
+    (call-with-output-file (string-append output "/modules.alias")
+      (lambda (port)
+        (format port
+                "# Aliases extracted from modules themselves.\n")
+        (for-each (match-lambda ((module . aliases)
+                                 (for-each (lambda (alias)
+                                             (format port "alias ~a ~a\n" alias
+                                                     module))
+                                           aliases)))
+                  aliases)))
+    (call-with-output-file (string-append output "/modules.devname")
+      (lambda (port)
+        (format port
+                "# Device nodes to trigger on-demand module loading.\n")
+        (let* ((aliases (append-map (match-lambda
+                                     ((module . aliases) aliases))
+                                    aliases))
+               (devname #f))
+          ;; Note: there's only one devname and then only one (char-major|block-major).
+          (for-each
+           (match-lambda
+            (((? (cut string-prefix? "devname:" <>) alias) . value)
+             (set! devname (string-drop value (string-length "devname:"))))
+            (((? (cut string-prefix? "char-major-" <>) alias) . value)
+             (let ((parts (string-tokenize %not-dash)))
+               (match parts
+                      ((a b major minor)
+                       (format port "~a ~a ~a:~a\n" devname "c" major minor)))))
+            (((? (cut string-prefix? "block-major-" <>) alias) . value)
+             (let ((parts (string-tokenize %not-dash)))
+               (match parts
+                      ((a b major minor)
+                       (format port "~a ~a ~a:~a\n" devname "b" major minor)))))
+            (_ #f))
+           aliases))))))
+
 ;;; linux-modules.scm ends here




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v6 3/6] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 14:18:02 +0000
Resent-Message-ID: <handler.30604.B30604.15200002535966 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15200002535966
          (code B ref 30604); Fri, 02 Mar 2018 14:18:02 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:33 +0000
Received: from localhost ([127.0.0.1]:40329 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1erlV7-0001YA-3k
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:33 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:55084)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1erlV5-0001Xv-E6
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:31 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id E351233602EB;
 Fri,  2 Mar 2018 15:17:29 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 15:17:17 +0100
Message-Id: <20180302141720.10720-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302141720.10720-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
(lookup-module): Delete procedure.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 42 +++++++++++++++++++++++++++++++++++-------
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..1b16f267a 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -469,9 +469,31 @@ upon error."
              mounts)
         "ext4"))
 
-  (define (lookup-module name)
-    (string-append linux-module-directory "/"
-                   (ensure-dot-ko name)))
+  (define (load-kernel-modules)
+    "Examine /sys/devices to find out which modules to load and load them."
+    (define enter?
+      (const #t))
+    (define (down! path stat result)
+     ;; Note: modprobe mutates the tree starting with path.
+     (let ((modalias-name (string-append path "/modalias")))
+       (if (file-exists? modalias-name)
+           (let ((modalias
+                 (string-trim-right (call-with-input-file modalias-name
+                                                          read-string)
+                                    #\newline)))
+             (system* "/sbin/modprobe" "-q" "--" modalias))))
+       #t)
+    (define up
+      (const #t))
+    (define skip
+      (const #t))
+    (define leaf
+      (const #t))
+    (define (error name stat errno result)
+      (format (current-error-port) "warning: ~a: ~a~%"
+              name (strerror errno))
+      result)
+    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
 
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
@@ -486,10 +508,16 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (let* ((kernel-release
+               (utsname:release (uname)))
+              (directory
+               (string-append linux-module-directory "/lib/modules/"
+                              kernel-release))
+              (old-umask (umask #o022)))
+         (make-static-device-nodes directory)
+         (umask old-umask))
+
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index e7f97bb88..b50d3ff80 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -208,7 +208,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v6 4/6] vm: Allow qemu-image builder to load Linux kernel modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 14:18:02 +0000
Resent-Message-ID: <handler.30604.B30604.15200002555986 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15200002555986
          (code B ref 30604); Fri, 02 Mar 2018 14:18:02 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:35 +0000
Received: from localhost ([127.0.0.1]:40333 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1erlV9-0001YP-C8
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:35 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:55092)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1erlV7-0001Y9-7T
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:33 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id CFE7F33601D1;
 Fri,  2 Mar 2018 15:17:31 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 15:17:18 +0100
Message-Id: <20180302141720.10720-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302141720.10720-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/vm.scm (%modprobe-wrapper): New variable.
(qemu-image): Modify.
---
 gnu/system/vm.scm | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 345cecedd..b5a559012 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)."
    #:single-file-output? #t
    #:references-graphs inputs))
 
+(define (%modprobe-wrapper modprobe linux-module-directory)
+  ;; Wrapper for the 'modprobe' command that knows where modules live.
+  ;;
+  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
+  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
+  ;; environment variable is not set---hence the need for this wrapper.
+  (program-file "modprobe"
+    #~(begin
+        (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory)
+        (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))
+
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
@@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe"))
+        (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules"))))
   (expression->derivation-in-linux-vm
    name
-   (with-imported-modules (source-module-closure '((gnu build bootloader)
+   (with-imported-modules (source-module-closure '((gnu build activation)
+                                                   (gnu build bootloader)
                                                    (gnu build vm)
                                                    (guix build utils)))
      #~(begin
-         (use-modules (gnu build bootloader)
+         (use-modules (gnu build activation)
+                      (gnu build bootloader)
                       (gnu build vm)
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
          (let ((inputs
-                '#$(append (list qemu parted e2fsprogs dosfstools)
+                '#$(append (list qemu parted e2fsprogs dosfstools kmod)
                            (map canonical-package
                                 (list sed grep coreutils findutils gawk))
                            (if register-closures? (list guix) '())))
@@ -302,6 +317,14 @@ the image."
                         inputs)))
 
            (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+           ;; It's possible that we need to load nls modules in order to
+           ;; mount the new partition.
+           (if (file-exists? #$modprobe-name)
+               (activate-modprobe #$(%modprobe-wrapper modprobe-name
+                                     linux-module-directory))
+               (format (current-error-port)
+                "WARNING: No modprobe found in ~s.  \
+Loading kernel modules will be impossible.\n" #$modprobe-name))
 
            (let* ((graphs     '#$(match inputs
                                    (((names . _) ...)
@@ -364,7 +387,7 @@ the image."
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-   #:references-graphs inputs))
+   #:references-graphs inputs)))
 
 
 ;;;




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v6 5/6] vm: Make the virtio-blk uniquely identifiable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 14:18:03 +0000
Resent-Message-ID: <handler.30604.B30604.15200002575997 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15200002575997
          (code B ref 30604); Fri, 02 Mar 2018 14:18:03 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:37 +0000
Received: from localhost ([127.0.0.1]:40335 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1erlVA-0001Yd-OI
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:36 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:55096)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1erlV9-0001YN-4g
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:35 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 7CE5533602EB;
 Fri,  2 Mar 2018 15:17:33 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 15:17:19 +0100
Message-Id: <20180302141720.10720-5-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302141720.10720-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.
---
 gnu/build/vm.scm  | 2 +-
 gnu/system/vm.scm | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..ebf9e9f6e 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index b5a559012..fdff64ed9 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v6 6/6] linux-initrd: Provide modprobe to the initrd.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 14:18:03 +0000
Resent-Message-ID: <handler.30604.B30604.15200002606010 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15200002606010
          (code B ref 30604); Fri, 02 Mar 2018 14:18:03 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 14:17:40 +0000
Received: from localhost ([127.0.0.1]:40338 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1erlVC-0001Yr-C2
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:40 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:55104)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1erlVA-0001Yc-Jc
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 09:17:37 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 6E7BB33601D1;
 Fri,  2 Mar 2018 15:17:35 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 15:17:20 +0100
Message-Id: <20180302141720.10720-6-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302141720.10720-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302141720.10720-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-initrd.scm (build-initrd): Provide modprobe and the
linux modules to the initrd.
* gnu/system/linux-initrd.scm (%modprobe): New procedure.
(expression->initrd): Use it.  Add linux-module-directory.
(raw-initrd): Pass linux-module-directory.
---
 gnu/build/linux-initrd.scm  | 13 ++++++-
 gnu/system/linux-initrd.scm | 84 ++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 87 insertions(+), 10 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..d4cb5e2d8 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init modprobe linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,17 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+     ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (when modprobe
+      (mkdir-p "sbin")
+      (symlink modprobe "sbin/modprobe")
+      (compile-to-cache "sbin/modprobe"))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index b50d3ff80..a69497ff8 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -56,11 +56,73 @@
 ;;;
 ;;; Code:
 
+(define* (%modprobe linux-module-directory #:key
+                    (guile %guile-static-stripped))
+  (program-file "modprobe"
+    (with-imported-modules (source-module-closure
+                            '((gnu build linux-modules)))
+      #~(begin
+          (use-modules (gnu build linux-modules) (ice-9 getopt-long)
+                       (ice-9 match) (srfi srfi-1) (ice-9 ftw))
+          (define (find-only-entry directory)
+            (match (scandir directory)
+             (("." ".." basename)
+              (string-append directory "/" basename))))
+          (define (resolve-alias alias)
+            (let* ((linux-release-module-directory
+                    (find-only-entry (string-append "/lib/modules"))))
+              (match (delete-duplicates (matching-modules alias
+                      (known-module-aliases
+                        (string-append linux-release-module-directory
+                                       "/modules.alias"))))
+               (()
+                (error "no alias by that name" alias))
+               (items
+                items))))
+          (define (lookup-module module)
+            (let* ((linux-release-module-directory
+                    (find-only-entry (string-append "/lib/modules")))
+                   (file-name (string-append linux-release-module-directory
+                                             "/" (ensure-dot-ko module))))
+              (if (file-exists? file-name)
+                  file-name
+                  (error "no module file found for module" module))))
+          (define option-spec
+           '((quiet    (single-char #\q) (value #f))))
+          (define options
+            (getopt-long (command-line) option-spec))
+          (when (option-ref options 'quiet #f)
+            (current-error-port (%make-void-port "w"))
+            (current-output-port (%make-void-port "w")))
+          (let ((exit-status 0))
+            (for-each (match-lambda
+                        (('quiet . #t)
+                         #f)
+                        ((() modules ...)
+                         (for-each (lambda (alias)
+                                     (catch #t
+                                       (lambda ()
+                                         (let ((modules (resolve-alias alias)))                                           (for-each (lambda (module)
+                                                       (load-linux-module*
+                                                        (lookup-module module)
+                                                        #:lookup-module
+                                                        lookup-module))
+                                                     modules)))
+                                       (lambda (key . args)
+                                         (display (cons* key args)
+                                                  (current-error-port))
+                                         (newline (current-error-port))
+                                         (set! exit-status 1))))
+                                   modules)))
+                      options)
+            (exit exit-status))))
+  #:guile guile))
 
 (define* (expression->initrd exp
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -73,6 +135,9 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (define init
     (program-file "init" exp #:guile guile))
 
+  (define modprobe
+    (%modprobe linux-module-directory #:guile guile))
+
   (define builder
     (with-imported-modules (source-module-closure
                             '((gnu build linux-initrd)))
@@ -96,12 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
-                        ;; Copy everything INIT refers to into the initrd.
-                        #:references-graphs '("closure")
+                        #:modprobe #$modprobe
+                        #:linux-module-directory #$linux-module-directory
+                        ;; Copy everything INIT and MODPROBE refer to into the
+                        ;; initrd.
+                        #:references-graphs '("init-closure"
+                                              "modprobe-closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
 
   (gexp->derivation name builder
-                    #:references-graphs `(("closure" ,init))))
+                    #:references-graphs `(("init-closure" ,init)
+                                          ("modprobe-closure" ,modprobe))))
 
 (define (flat-linux-module-directory linux modules)
   "Return a flat directory containing the Linux kernel modules listed in
@@ -141,12 +211,7 @@ MODULES and taken from LINUX."
                                                      #:lookup-module lookup))))
 
           (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
+          (install-module-files (delete-duplicates modules) #$output))))
 
   (computed-file "linux-modules" build-exp))
 
@@ -227,6 +292,7 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 0/6] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 15:35:02 +0000
Resent-Message-ID: <handler.30604.B30604.152000485913862 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000485913862
          (code B ref 30604); Fri, 02 Mar 2018 15:35:02 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:19 +0000
Received: from localhost ([127.0.0.1]:41405 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ermhP-0003bW-2u
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:19 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:32886)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ermhN-0003bI-Hf
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:18 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 9E65733601D1;
 Fri,  2 Mar 2018 16:34:15 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 16:34:02 +0100
Message-Id: <20180302153408.14091-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302141606.10669-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Danny Milosavljevic (6):
  linux-modules: Add module-aliases.
  linux-modules: Add install-modules.
  linux-boot: Load kernel modules only when the hardware is present.
  vm: Allow qemu-image builder to load Linux kernel modules.
  vm: Make the virtio-blk uniquely identifiable in /sys.
  linux-initrd: Provide modprobe to the initrd.

 gnu/build/linux-boot.scm    |  42 +++++++++++++++---
 gnu/build/linux-initrd.scm  |  13 +++++-
 gnu/build/linux-modules.scm |  61 ++++++++++++++++++++++++++
 gnu/build/vm.scm            |   2 +-
 gnu/system/linux-initrd.scm | 103 ++++++++++++++++++++++++++++++++++++++------
 gnu/system/vm.scm           |  34 ++++++++++++---
 6 files changed, 228 insertions(+), 27 deletions(-)





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 1/6] linux-modules: Add module-aliases.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 15:35:02 +0000
Resent-Message-ID: <handler.30604.B30604.152000486013877 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000486013877
          (code B ref 30604); Fri, 02 Mar 2018 15:35:02 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:20 +0000
Received: from localhost ([127.0.0.1]:41408 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ermhQ-0003bk-9y
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:20 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:32890)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ermhO-0003bJ-72
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:18 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 362D733602EB;
 Fri,  2 Mar 2018 16:34:17 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 16:34:03 +0100
Message-Id: <20180302153408.14091-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302153408.14091-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (module-aliases): New variable.
---
 gnu/build/linux-modules.scm | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 4a6d4ff08..364339df9 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -30,6 +30,7 @@
   #:use-module (ice-9 rdelim)
   #:export (dot-ko
             ensure-dot-ko
+            module-aliases
             module-dependencies
             recursive-module-dependencies
             modules-loaded
@@ -95,6 +96,14 @@ contains module names, not actual file names."
       (('depends . what)
        (string-tokenize what %not-comma)))))
 
+(define (module-aliases file)
+  "Return the list of aliases for FILE."
+  (let ((info (modinfo-section-contents file)))
+    (filter-map (match-lambda
+                 (('alias . value)
+                  value)
+                 (_ #f)) (modinfo-section-contents file))))
+
 (define dot-ko
   (cut string-append <> ".ko"))
 




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 2/6] linux-modules: Add install-modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 15:35:03 +0000
Resent-Message-ID: <handler.30604.B30604.152000486113893 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000486113893
          (code B ref 30604); Fri, 02 Mar 2018 15:35:03 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:21 +0000
Received: from localhost ([127.0.0.1]:41411 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ermhR-0003c0-GJ
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:21 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:32898)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ermhP-0003bd-Qp
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:20 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 5AE1333601D1;
 Fri,  2 Mar 2018 16:34:18 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 16:34:04 +0100
Message-Id: <20180302153408.14091-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302153408.14091-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (install-modules): New procedure.
(%not-dash): New variable.
---
 gnu/build/linux-modules.scm | 52 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 364339df9..af217c974 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -36,6 +36,7 @@
             modules-loaded
             module-loaded?
             load-linux-module*
+            install-module-files
 
             current-module-debugging-port
 
@@ -379,4 +380,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                       module)))
               known-aliases))
 
+(define %not-dash
+  (char-set-complement (char-set #\-)))
+
+(define (install-module-files module-files output)
+  "Install MODULE-FILES to OUTPUT.
+Precondition: OUTPUT is an empty directory."
+  (let ((aliases
+         (map (lambda (module-file-name)
+                (format #t "copying '~a'...~%" module-file-name)
+                (copy-file module-file-name
+                           (string-append output "/"
+                                          (basename module-file-name)))
+                `(,(file-name->module-name module-file-name) .
+                  ,(module-aliases module-file-name)))
+              (sort module-files string<))))
+    (call-with-output-file (string-append output "/modules.alias")
+      (lambda (port)
+        (format port
+                "# Aliases extracted from modules themselves.\n")
+        (for-each (match-lambda ((module . aliases)
+                                 (for-each (lambda (alias)
+                                             (format port "alias ~a ~a\n" alias
+                                                     module))
+                                           aliases)))
+                  aliases)))
+    (call-with-output-file (string-append output "/modules.devname")
+      (lambda (port)
+        (format port
+                "# Device nodes to trigger on-demand module loading.\n")
+        (let* ((aliases (append-map (match-lambda
+                                     ((module . aliases) aliases))
+                                    aliases))
+               (devname #f))
+          ;; Note: there's only one devname and then only one (char-major|block-major).
+          (for-each
+           (match-lambda
+            (((? (cut string-prefix? "devname:" <>) alias) . value)
+             (set! devname (string-drop value (string-length "devname:"))))
+            (((? (cut string-prefix? "char-major-" <>) alias) . value)
+             (let ((parts (string-tokenize %not-dash)))
+               (match parts
+                      ((a b major minor)
+                       (format port "~a ~a ~a:~a\n" devname "c" major minor)))))
+            (((? (cut string-prefix? "block-major-" <>) alias) . value)
+             (let ((parts (string-tokenize %not-dash)))
+               (match parts
+                      ((a b major minor)
+                       (format port "~a ~a ~a:~a\n" devname "b" major minor)))))
+            (_ #f))
+           aliases))))))
+
 ;;; linux-modules.scm ends here




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 3/6] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 15:35:05 +0000
Resent-Message-ID: <handler.30604.B30604.152000486413915 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000486413915
          (code B ref 30604); Fri, 02 Mar 2018 15:35:05 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:24 +0000
Received: from localhost ([127.0.0.1]:41415 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ermhT-0003cM-Pq
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:23 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:32906)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ermhQ-0003br-SR
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:21 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id E11E133602EB;
 Fri,  2 Mar 2018 16:34:19 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 16:34:05 +0100
Message-Id: <20180302153408.14091-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302153408.14091-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
(lookup-module): Delete procedure.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 42 +++++++++++++++++++++++++++++++++++-------
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..1b16f267a 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -469,9 +469,31 @@ upon error."
              mounts)
         "ext4"))
 
-  (define (lookup-module name)
-    (string-append linux-module-directory "/"
-                   (ensure-dot-ko name)))
+  (define (load-kernel-modules)
+    "Examine /sys/devices to find out which modules to load and load them."
+    (define enter?
+      (const #t))
+    (define (down! path stat result)
+     ;; Note: modprobe mutates the tree starting with path.
+     (let ((modalias-name (string-append path "/modalias")))
+       (if (file-exists? modalias-name)
+           (let ((modalias
+                 (string-trim-right (call-with-input-file modalias-name
+                                                          read-string)
+                                    #\newline)))
+             (system* "/sbin/modprobe" "-q" "--" modalias))))
+       #t)
+    (define up
+      (const #t))
+    (define skip
+      (const #t))
+    (define leaf
+      (const #t))
+    (define (error name stat errno result)
+      (format (current-error-port) "warning: ~a: ~a~%"
+              name (strerror errno))
+      result)
+    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
 
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
@@ -486,10 +508,16 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (let* ((kernel-release
+               (utsname:release (uname)))
+              (directory
+               (string-append linux-module-directory "/lib/modules/"
+                              kernel-release))
+              (old-umask (umask #o022)))
+         (make-static-device-nodes directory)
+         (umask old-umask))
+
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index e7f97bb88..b50d3ff80 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -208,7 +208,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 4/6] vm: Allow qemu-image builder to load Linux kernel modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 15:35:05 +0000
Resent-Message-ID: <handler.30604.B30604.152000486413921 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000486413921
          (code B ref 30604); Fri, 02 Mar 2018 15:35:05 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:24 +0000
Received: from localhost ([127.0.0.1]:41417 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ermhU-0003cO-1Q
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:24 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:32916)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ermhR-0003c1-SW
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:22 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id E139933601D1;
 Fri,  2 Mar 2018 16:34:20 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 16:34:06 +0100
Message-Id: <20180302153408.14091-5-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302153408.14091-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/vm.scm (%modprobe-wrapper): New variable.
(qemu-image): Modify.
---
 gnu/system/vm.scm | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 345cecedd..b5a559012 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)."
    #:single-file-output? #t
    #:references-graphs inputs))
 
+(define (%modprobe-wrapper modprobe linux-module-directory)
+  ;; Wrapper for the 'modprobe' command that knows where modules live.
+  ;;
+  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
+  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
+  ;; environment variable is not set---hence the need for this wrapper.
+  (program-file "modprobe"
+    #~(begin
+        (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory)
+        (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))
+
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
@@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe"))
+        (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules"))))
   (expression->derivation-in-linux-vm
    name
-   (with-imported-modules (source-module-closure '((gnu build bootloader)
+   (with-imported-modules (source-module-closure '((gnu build activation)
+                                                   (gnu build bootloader)
                                                    (gnu build vm)
                                                    (guix build utils)))
      #~(begin
-         (use-modules (gnu build bootloader)
+         (use-modules (gnu build activation)
+                      (gnu build bootloader)
                       (gnu build vm)
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
          (let ((inputs
-                '#$(append (list qemu parted e2fsprogs dosfstools)
+                '#$(append (list qemu parted e2fsprogs dosfstools kmod)
                            (map canonical-package
                                 (list sed grep coreutils findutils gawk))
                            (if register-closures? (list guix) '())))
@@ -302,6 +317,14 @@ the image."
                         inputs)))
 
            (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+           ;; It's possible that we need to load nls modules in order to
+           ;; mount the new partition.
+           (if (file-exists? #$modprobe-name)
+               (activate-modprobe #$(%modprobe-wrapper modprobe-name
+                                     linux-module-directory))
+               (format (current-error-port)
+                "WARNING: No modprobe found in ~s.  \
+Loading kernel modules will be impossible.\n" #$modprobe-name))
 
            (let* ((graphs     '#$(match inputs
                                    (((names . _) ...)
@@ -364,7 +387,7 @@ the image."
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-   #:references-graphs inputs))
+   #:references-graphs inputs)))
 
 
 ;;;




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 5/6] vm: Make the virtio-blk uniquely identifiable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 15:35:06 +0000
Resent-Message-ID: <handler.30604.B30604.152000486513935 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000486513935
          (code B ref 30604); Fri, 02 Mar 2018 15:35:06 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:25 +0000
Received: from localhost ([127.0.0.1]:41420 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ermhV-0003ch-AW
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:25 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:32924)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ermhS-0003cE-RQ
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:23 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id D764F33602EB;
 Fri,  2 Mar 2018 16:34:21 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 16:34:07 +0100
Message-Id: <20180302153408.14091-6-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302153408.14091-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.
---
 gnu/build/vm.scm  | 2 +-
 gnu/system/vm.scm | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..ebf9e9f6e 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index b5a559012..fdff64ed9 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 6/6] linux-initrd: Provide modprobe to the initrd.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 15:35:06 +0000
Resent-Message-ID: <handler.30604.B30604.152000486613944 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000486613944
          (code B ref 30604); Fri, 02 Mar 2018 15:35:06 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 15:34:26 +0000
Received: from localhost ([127.0.0.1]:41422 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ermhW-0003cp-H4
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:26 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:32932)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ermhT-0003cL-UY
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 10:34:24 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id C8A0233601D1;
 Fri,  2 Mar 2018 16:34:22 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Fri,  2 Mar 2018 16:34:08 +0100
Message-Id: <20180302153408.14091-7-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302153408.14091-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-initrd.scm (build-initrd): Provide modprobe and the
linux modules to the initrd.
* gnu/system/linux-initrd.scm (%modprobe): New procedure.
(expression->initrd): Use it.  Add linux-module-directory.
(raw-initrd): Pass linux-module-directory.
---
 gnu/build/linux-initrd.scm  | 13 +++++-
 gnu/system/linux-initrd.scm | 99 +++++++++++++++++++++++++++++++++++++++------
 2 files changed, 99 insertions(+), 13 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..d4cb5e2d8 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init modprobe linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,17 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+     ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (when modprobe
+      (mkdir-p "sbin")
+      (symlink modprobe "sbin/modprobe")
+      (compile-to-cache "sbin/modprobe"))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index b50d3ff80..8050ac47e 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -56,11 +56,73 @@
 ;;;
 ;;; Code:
 
+(define* (%modprobe linux-module-directory #:key
+                    (guile %guile-static-stripped))
+  (program-file "modprobe"
+    (with-imported-modules (source-module-closure
+                            '((gnu build linux-modules)))
+      #~(begin
+          (use-modules (gnu build linux-modules) (ice-9 getopt-long)
+                       (ice-9 match) (srfi srfi-1) (ice-9 ftw))
+          (define (find-only-entry directory)
+            (match (scandir directory)
+             (("." ".." basename)
+              (string-append directory "/" basename))))
+          (define (resolve-alias alias)
+            (let* ((linux-release-module-directory
+                    (find-only-entry (string-append "/lib/modules"))))
+              (match (delete-duplicates (matching-modules alias
+                      (known-module-aliases
+                        (string-append linux-release-module-directory
+                                       "/modules.alias"))))
+               (()
+                (error "no alias by that name" alias))
+               (items
+                items))))
+          (define (lookup-module module)
+            (let* ((linux-release-module-directory
+                    (find-only-entry (string-append "/lib/modules")))
+                   (file-name (string-append linux-release-module-directory
+                                             "/" (ensure-dot-ko module))))
+              (if (file-exists? file-name)
+                  file-name
+                  (error "no module file found for module" module))))
+          (define option-spec
+           '((quiet    (single-char #\q) (value #f))))
+          (define options
+            (getopt-long (command-line) option-spec))
+          (when (option-ref options 'quiet #f)
+            (current-error-port (%make-void-port "w"))
+            (current-output-port (%make-void-port "w")))
+          (let ((exit-status 0))
+            (for-each (match-lambda
+                        (('quiet . #t)
+                         #f)
+                        ((() modules ...)
+                         (for-each (lambda (alias)
+                                     (catch #t
+                                       (lambda ()
+                                         (let ((modules (resolve-alias alias)))                                           (for-each (lambda (module)
+                                                       (load-linux-module*
+                                                        (lookup-module module)
+                                                        #:lookup-module
+                                                        lookup-module))
+                                                     modules)))
+                                       (lambda (key . args)
+                                         (display (cons* key args)
+                                                  (current-error-port))
+                                         (newline (current-error-port))
+                                         (set! exit-status 1))))
+                                   modules)))
+                      options)
+            (exit exit-status))))
+  #:guile guile))
 
 (define* (expression->initrd exp
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -73,6 +135,9 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (define init
     (program-file "init" exp #:guile guile))
 
+  (define modprobe
+    (%modprobe linux-module-directory #:guile guile))
+
   (define builder
     (with-imported-modules (source-module-closure
                             '((gnu build linux-initrd)))
@@ -96,12 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
-                        ;; Copy everything INIT refers to into the initrd.
-                        #:references-graphs '("closure")
+                        #:modprobe #$modprobe
+                        #:linux-module-directory #$linux-module-directory
+                        ;; Copy everything INIT and MODPROBE refer to into the
+                        ;; initrd.
+                        #:references-graphs '("init-closure"
+                                              "modprobe-closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
 
   (gexp->derivation name builder
-                    #:references-graphs `(("closure" ,init))))
+                    #:references-graphs `(("init-closure" ,init)
+                                          ("modprobe-closure" ,modprobe))))
 
 (define (flat-linux-module-directory linux modules)
   "Return a flat directory containing the Linux kernel modules listed in
@@ -111,7 +181,7 @@ MODULES and taken from LINUX."
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex)
+          (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw)
                        (srfi srfi-1)
                        (guix build utils)
                        (gnu build linux-modules))
@@ -140,14 +210,18 @@ MODULES and taken from LINUX."
                       (recursive-module-dependencies modules
                                                      #:lookup-module lookup))))
 
-          (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
-
+          (define version
+            (match
+             (filter
+              (lambda (name)
+                (not (string-prefix? "." name)))
+              (scandir module-dir))
+             ((item) item)))
+
+          (let ((output (string-append #$output "/lib/modules/" version)))
+            (mkdir-p output)
+            (install-module-files (delete-duplicates modules) output))
+          #t)))
   (computed-file "linux-modules" build-exp))
 
 (define* (raw-initrd file-systems
@@ -227,6 +301,7 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 3/6] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 16:48:01 +0000
Resent-Message-ID: <handler.30604.B30604.152000924120510 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000924120510
          (code B ref 30604); Fri, 02 Mar 2018 16:48:01 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 16:47:21 +0000
Received: from localhost ([127.0.0.1]:41473 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ernq5-0005Kk-38
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 11:47:21 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38282)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ernq3-0005Kc-CO
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 11:47:20 -0500
Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id D5B2533602EB
 for <30604 <at> debbugs.gnu.org>; Fri,  2 Mar 2018 17:47:17 +0100 (CET)
Date: Fri, 2 Mar 2018 17:47:11 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180302174711.4018dc49@HIDDEN>
In-Reply-To: <20180302153408.14091-4-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302153408.14091-1-dannym@HIDDEN>
 <20180302153408.14091-4-dannym@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

> +  (define (load-kernel-modules)
> +    "Examine /sys/devices to find out which modules to load and load them."
> +    (define enter?
> +      (const #t))
> +    (define (down! path stat result)
> +     ;; Note: modprobe mutates the tree starting with path.
> +     (let ((modalias-name (string-append path "/modalias")))

I should rename "path" to "directory".





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v7 1/6] linux-modules: Add module-aliases.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 02 Mar 2018 16:48:02 +0000
Resent-Message-ID: <handler.30604.B30604.152000927820560 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152000927820560
          (code B ref 30604); Fri, 02 Mar 2018 16:48:02 +0000
Received: (at 30604) by debbugs.gnu.org; 2 Mar 2018 16:47:58 +0000
Received: from localhost ([127.0.0.1]:41476 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ernqg-0005LY-Bp
	for submit <at> debbugs.gnu.org; Fri, 02 Mar 2018 11:47:58 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38338)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ernqe-0005LQ-G2
 for 30604 <at> debbugs.gnu.org; Fri, 02 Mar 2018 11:47:56 -0500
Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 893513360099
 for <30604 <at> debbugs.gnu.org>; Fri,  2 Mar 2018 17:47:55 +0100 (CET)
Date: Fri, 2 Mar 2018 17:47:51 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180302174751.741d5dd3@HIDDEN>
In-Reply-To: <20180302153408.14091-2-dannym@HIDDEN>
References: <20180302141606.10669-1-dannym@HIDDEN>
 <20180302153408.14091-1-dannym@HIDDEN>
 <20180302153408.14091-2-dannym@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

> +  "Return the list of aliases for FILE."
                                 ^^^ replace by "in"




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 0/7] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 13:56:01 +0000
Resent-Message-ID: <handler.30604.B30604.152008534824382 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152008534824382
          (code B ref 30604); Sat, 03 Mar 2018 13:56:01 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:48 +0000
Received: from localhost ([127.0.0.1]:41960 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es7dc-0006L6-12
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:48 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43760)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es7da-0006Kq-18
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:46 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id C58B4336188F;
 Sat,  3 Mar 2018 14:55:43 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sat,  3 Mar 2018 14:55:26 +0100
Message-Id: <20180303135533.6112-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180302153408.14091-1-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Danny Milosavljevic (7):
  linux-modules: Add module-aliases.
  linux-modules: Add install-modules.
  linux-boot: Load kernel modules only when the hardware is present.
  vm: Allow qemu-image builder to load Linux kernel modules.
  vm: Make the virtio-blk uniquely identifiable in /sys.
  linux-initrd: Provide modprobe to the initrd.
  linux-initrd: Factorize %modprobe and flat-linux-module-directory.

 gnu/build/linux-boot.scm    |  42 ++++++++++++---
 gnu/build/linux-initrd.scm  |  13 ++++-
 gnu/build/linux-modules.scm | 115 +++++++++++++++++++++++++++++++++++++++++
 gnu/build/vm.scm            |   2 +-
 gnu/system/linux-initrd.scm | 121 ++++++++++++++++++++++++++++++++------------
 gnu/system/vm.scm           |  34 +++++++++++--
 6 files changed, 281 insertions(+), 46 deletions(-)





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 1/7] linux-modules: Add module-aliases.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 13:56:02 +0000
Resent-Message-ID: <handler.30604.B30604.152008534824390 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152008534824390
          (code B ref 30604); Sat, 03 Mar 2018 13:56:02 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:48 +0000
Received: from localhost ([127.0.0.1]:41962 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es7dc-0006LD-Bj
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:48 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43764)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es7da-0006Kt-Kb
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:46 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 819593362284;
 Sat,  3 Mar 2018 14:55:45 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sat,  3 Mar 2018 14:55:27 +0100
Message-Id: <20180303135533.6112-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (module-aliases): New variable.
---
 gnu/build/linux-modules.scm | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 4a6d4ff08..364339df9 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -30,6 +30,7 @@
   #:use-module (ice-9 rdelim)
   #:export (dot-ko
             ensure-dot-ko
+            module-aliases
             module-dependencies
             recursive-module-dependencies
             modules-loaded
@@ -95,6 +96,14 @@ contains module names, not actual file names."
       (('depends . what)
        (string-tokenize what %not-comma)))))
 
+(define (module-aliases file)
+  "Return the list of aliases of module FILE."
+  (let ((info (modinfo-section-contents file)))
+    (filter-map (match-lambda
+                 (('alias . value)
+                  value)
+                 (_ #f)) (modinfo-section-contents file))))
+
 (define dot-ko
   (cut string-append <> ".ko"))
 




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 2/7] linux-modules: Add install-modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 13:56:02 +0000
Resent-Message-ID: <handler.30604.B30604.152008535224421 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152008535224421
          (code B ref 30604); Sat, 03 Mar 2018 13:56:02 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:52 +0000
Received: from localhost ([127.0.0.1]:41967 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es7df-0006Ln-LI
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:51 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43772)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es7db-0006L5-Mz
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:48 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id A8307336188F;
 Sat,  3 Mar 2018 14:55:46 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sat,  3 Mar 2018 14:55:28 +0100
Message-Id: <20180303135533.6112-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (install-modules): New procedure.
(%not-dash): New variable.
---
 gnu/build/linux-modules.scm | 52 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 364339df9..af217c974 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -36,6 +36,7 @@
             modules-loaded
             module-loaded?
             load-linux-module*
+            install-module-files
 
             current-module-debugging-port
 
@@ -379,4 +380,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                       module)))
               known-aliases))
 
+(define %not-dash
+  (char-set-complement (char-set #\-)))
+
+(define (install-module-files module-files output)
+  "Install MODULE-FILES to OUTPUT.
+Precondition: OUTPUT is an empty directory."
+  (let ((aliases
+         (map (lambda (module-file-name)
+                (format #t "copying '~a'...~%" module-file-name)
+                (copy-file module-file-name
+                           (string-append output "/"
+                                          (basename module-file-name)))
+                `(,(file-name->module-name module-file-name) .
+                  ,(module-aliases module-file-name)))
+              (sort module-files string<))))
+    (call-with-output-file (string-append output "/modules.alias")
+      (lambda (port)
+        (format port
+                "# Aliases extracted from modules themselves.\n")
+        (for-each (match-lambda ((module . aliases)
+                                 (for-each (lambda (alias)
+                                             (format port "alias ~a ~a\n" alias
+                                                     module))
+                                           aliases)))
+                  aliases)))
+    (call-with-output-file (string-append output "/modules.devname")
+      (lambda (port)
+        (format port
+                "# Device nodes to trigger on-demand module loading.\n")
+        (let* ((aliases (append-map (match-lambda
+                                     ((module . aliases) aliases))
+                                    aliases))
+               (devname #f))
+          ;; Note: there's only one devname and then only one (char-major|block-major).
+          (for-each
+           (match-lambda
+            (((? (cut string-prefix? "devname:" <>) alias) . value)
+             (set! devname (string-drop value (string-length "devname:"))))
+            (((? (cut string-prefix? "char-major-" <>) alias) . value)
+             (let ((parts (string-tokenize %not-dash)))
+               (match parts
+                      ((a b major minor)
+                       (format port "~a ~a ~a:~a\n" devname "c" major minor)))))
+            (((? (cut string-prefix? "block-major-" <>) alias) . value)
+             (let ((parts (string-tokenize %not-dash)))
+               (match parts
+                      ((a b major minor)
+                       (format port "~a ~a ~a:~a\n" devname "b" major minor)))))
+            (_ #f))
+           aliases))))))
+
 ;;; linux-modules.scm ends here




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 13:56:03 +0000
Resent-Message-ID: <handler.30604.B30604.152008535224429 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152008535224429
          (code B ref 30604); Sat, 03 Mar 2018 13:56:03 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:52 +0000
Received: from localhost ([127.0.0.1]:41970 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es7df-0006Lq-Vk
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:52 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43780)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es7dc-0006LI-Nr
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:49 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id B1D9F3362284;
 Sat,  3 Mar 2018 14:55:47 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sat,  3 Mar 2018 14:55:29 +0100
Message-Id: <20180303135533.6112-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
(lookup-module): Delete procedure.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 42 +++++++++++++++++++++++++++++++++++-------
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..1b16f267a 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -469,9 +469,31 @@ upon error."
              mounts)
         "ext4"))
 
-  (define (lookup-module name)
-    (string-append linux-module-directory "/"
-                   (ensure-dot-ko name)))
+  (define (load-kernel-modules)
+    "Examine /sys/devices to find out which modules to load and load them."
+    (define enter?
+      (const #t))
+    (define (down! directory stat result)
+     ;; Note: modprobe mutates the tree starting with DIRECTORY.
+     (let ((modalias-name (string-append directory "/modalias")))
+       (if (file-exists? modalias-name)
+           (let ((modalias
+                 (string-trim-right (call-with-input-file modalias-name
+                                                          read-string)
+                                    #\newline)))
+             (system* "/sbin/modprobe" "-q" "--" modalias))))
+       #t)
+    (define up
+      (const #t))
+    (define skip
+      (const #t))
+    (define leaf
+      (const #t))
+    (define (error name stat errno result)
+      (format (current-error-port) "warning: ~a: ~a~%"
+              name (strerror errno))
+      result)
+    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
 
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
@@ -486,10 +508,16 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (let* ((kernel-release
+               (utsname:release (uname)))
+              (directory
+               (string-append linux-module-directory "/lib/modules/"
+                              kernel-release))
+              (old-umask (umask #o022)))
+         (make-static-device-nodes directory)
+         (umask old-umask))
+
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index e7f97bb88..b50d3ff80 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -208,7 +208,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 4/7] vm: Allow qemu-image builder to load Linux kernel modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 13:56:03 +0000
Resent-Message-ID: <handler.30604.B30604.152008535324441 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152008535324441
          (code B ref 30604); Sat, 03 Mar 2018 13:56:03 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:53 +0000
Received: from localhost ([127.0.0.1]:41972 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es7dg-0006Ly-DD
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:52 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43788)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es7dd-0006LY-L6
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:50 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 9EF85336287E;
 Sat,  3 Mar 2018 14:55:48 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sat,  3 Mar 2018 14:55:30 +0100
Message-Id: <20180303135533.6112-5-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/vm.scm (%modprobe-wrapper): New variable.
(qemu-image): Modify.
---
 gnu/system/vm.scm | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 345cecedd..b5a559012 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)."
    #:single-file-output? #t
    #:references-graphs inputs))
 
+(define (%modprobe-wrapper modprobe linux-module-directory)
+  ;; Wrapper for the 'modprobe' command that knows where modules live.
+  ;;
+  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
+  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
+  ;; environment variable is not set---hence the need for this wrapper.
+  (program-file "modprobe"
+    #~(begin
+        (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory)
+        (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))
+
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
@@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe"))
+        (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules"))))
   (expression->derivation-in-linux-vm
    name
-   (with-imported-modules (source-module-closure '((gnu build bootloader)
+   (with-imported-modules (source-module-closure '((gnu build activation)
+                                                   (gnu build bootloader)
                                                    (gnu build vm)
                                                    (guix build utils)))
      #~(begin
-         (use-modules (gnu build bootloader)
+         (use-modules (gnu build activation)
+                      (gnu build bootloader)
                       (gnu build vm)
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
          (let ((inputs
-                '#$(append (list qemu parted e2fsprogs dosfstools)
+                '#$(append (list qemu parted e2fsprogs dosfstools kmod)
                            (map canonical-package
                                 (list sed grep coreutils findutils gawk))
                            (if register-closures? (list guix) '())))
@@ -302,6 +317,14 @@ the image."
                         inputs)))
 
            (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+           ;; It's possible that we need to load nls modules in order to
+           ;; mount the new partition.
+           (if (file-exists? #$modprobe-name)
+               (activate-modprobe #$(%modprobe-wrapper modprobe-name
+                                     linux-module-directory))
+               (format (current-error-port)
+                "WARNING: No modprobe found in ~s.  \
+Loading kernel modules will be impossible.\n" #$modprobe-name))
 
            (let* ((graphs     '#$(match inputs
                                    (((names . _) ...)
@@ -364,7 +387,7 @@ the image."
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-   #:references-graphs inputs))
+   #:references-graphs inputs)))
 
 
 ;;;




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 5/7] vm: Make the virtio-blk uniquely identifiable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 13:56:03 +0000
Resent-Message-ID: <handler.30604.B30604.152008535424455 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152008535424455
          (code B ref 30604); Sat, 03 Mar 2018 13:56:03 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:54 +0000
Received: from localhost ([127.0.0.1]:41975 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es7dh-0006MM-VM
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:54 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43798)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es7de-0006Lf-K4
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:50 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 8B90D3362284;
 Sat,  3 Mar 2018 14:55:49 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sat,  3 Mar 2018 14:55:31 +0100
Message-Id: <20180303135533.6112-6-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.
---
 gnu/build/vm.scm  | 2 +-
 gnu/system/vm.scm | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..ebf9e9f6e 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index b5a559012..fdff64ed9 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -706,7 +706,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 6/7] linux-initrd: Provide modprobe to the initrd.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 13:56:04 +0000
Resent-Message-ID: <handler.30604.B30604.152008535424462 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152008535424462
          (code B ref 30604); Sat, 03 Mar 2018 13:56:04 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:54 +0000
Received: from localhost ([127.0.0.1]:41977 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es7di-0006MO-5h
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:54 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43806)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es7df-0006Lm-K8
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:52 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 79D25336188F;
 Sat,  3 Mar 2018 14:55:50 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sat,  3 Mar 2018 14:55:32 +0100
Message-Id: <20180303135533.6112-7-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-initrd.scm (build-initrd): Provide modprobe and the
linux modules to the initrd.
* gnu/system/linux-initrd.scm (%modprobe): New procedure.
(expression->initrd): Use it.  Add linux-module-directory.
(raw-initrd): Pass linux-module-directory.
---
 gnu/build/linux-initrd.scm  | 13 +++++-
 gnu/system/linux-initrd.scm | 99 +++++++++++++++++++++++++++++++++++++++------
 2 files changed, 99 insertions(+), 13 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..d4cb5e2d8 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init modprobe linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,17 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+     ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (when modprobe
+      (mkdir-p "sbin")
+      (symlink modprobe "sbin/modprobe")
+      (compile-to-cache "sbin/modprobe"))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index b50d3ff80..8050ac47e 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -56,11 +56,73 @@
 ;;;
 ;;; Code:
 
+(define* (%modprobe linux-module-directory #:key
+                    (guile %guile-static-stripped))
+  (program-file "modprobe"
+    (with-imported-modules (source-module-closure
+                            '((gnu build linux-modules)))
+      #~(begin
+          (use-modules (gnu build linux-modules) (ice-9 getopt-long)
+                       (ice-9 match) (srfi srfi-1) (ice-9 ftw))
+          (define (find-only-entry directory)
+            (match (scandir directory)
+             (("." ".." basename)
+              (string-append directory "/" basename))))
+          (define (resolve-alias alias)
+            (let* ((linux-release-module-directory
+                    (find-only-entry (string-append "/lib/modules"))))
+              (match (delete-duplicates (matching-modules alias
+                      (known-module-aliases
+                        (string-append linux-release-module-directory
+                                       "/modules.alias"))))
+               (()
+                (error "no alias by that name" alias))
+               (items
+                items))))
+          (define (lookup-module module)
+            (let* ((linux-release-module-directory
+                    (find-only-entry (string-append "/lib/modules")))
+                   (file-name (string-append linux-release-module-directory
+                                             "/" (ensure-dot-ko module))))
+              (if (file-exists? file-name)
+                  file-name
+                  (error "no module file found for module" module))))
+          (define option-spec
+           '((quiet    (single-char #\q) (value #f))))
+          (define options
+            (getopt-long (command-line) option-spec))
+          (when (option-ref options 'quiet #f)
+            (current-error-port (%make-void-port "w"))
+            (current-output-port (%make-void-port "w")))
+          (let ((exit-status 0))
+            (for-each (match-lambda
+                        (('quiet . #t)
+                         #f)
+                        ((() modules ...)
+                         (for-each (lambda (alias)
+                                     (catch #t
+                                       (lambda ()
+                                         (let ((modules (resolve-alias alias)))                                           (for-each (lambda (module)
+                                                       (load-linux-module*
+                                                        (lookup-module module)
+                                                        #:lookup-module
+                                                        lookup-module))
+                                                     modules)))
+                                       (lambda (key . args)
+                                         (display (cons* key args)
+                                                  (current-error-port))
+                                         (newline (current-error-port))
+                                         (set! exit-status 1))))
+                                   modules)))
+                      options)
+            (exit exit-status))))
+  #:guile guile))
 
 (define* (expression->initrd exp
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -73,6 +135,9 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (define init
     (program-file "init" exp #:guile guile))
 
+  (define modprobe
+    (%modprobe linux-module-directory #:guile guile))
+
   (define builder
     (with-imported-modules (source-module-closure
                             '((gnu build linux-initrd)))
@@ -96,12 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
-                        ;; Copy everything INIT refers to into the initrd.
-                        #:references-graphs '("closure")
+                        #:modprobe #$modprobe
+                        #:linux-module-directory #$linux-module-directory
+                        ;; Copy everything INIT and MODPROBE refer to into the
+                        ;; initrd.
+                        #:references-graphs '("init-closure"
+                                              "modprobe-closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
 
   (gexp->derivation name builder
-                    #:references-graphs `(("closure" ,init))))
+                    #:references-graphs `(("init-closure" ,init)
+                                          ("modprobe-closure" ,modprobe))))
 
 (define (flat-linux-module-directory linux modules)
   "Return a flat directory containing the Linux kernel modules listed in
@@ -111,7 +181,7 @@ MODULES and taken from LINUX."
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex)
+          (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw)
                        (srfi srfi-1)
                        (guix build utils)
                        (gnu build linux-modules))
@@ -140,14 +210,18 @@ MODULES and taken from LINUX."
                       (recursive-module-dependencies modules
                                                      #:lookup-module lookup))))
 
-          (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
-
+          (define version
+            (match
+             (filter
+              (lambda (name)
+                (not (string-prefix? "." name)))
+              (scandir module-dir))
+             ((item) item)))
+
+          (let ((output (string-append #$output "/lib/modules/" version)))
+            (mkdir-p output)
+            (install-module-files (delete-duplicates modules) output))
+          #t)))
   (computed-file "linux-modules" build-exp))
 
 (define* (raw-initrd file-systems
@@ -227,6 +301,7 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 7/7] linux-initrd: Factorize %modprobe and flat-linux-module-directory.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 13:56:04 +0000
Resent-Message-ID: <handler.30604.B30604.152008535524470 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152008535524470
          (code B ref 30604); Sat, 03 Mar 2018 13:56:04 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 13:55:55 +0000
Received: from localhost ([127.0.0.1]:41979 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es7di-0006MV-Kv
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:55 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:43814)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es7dg-0006Lv-Gh
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 08:55:53 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 7EA443362284;
 Sat,  3 Mar 2018 14:55:51 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sat,  3 Mar 2018 14:55:33 +0100
Message-Id: <20180303135533.6112-8-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (module-aliases->module-file-names): New
procedure.
* gnu/system/linux-initrd.scm (%modprobe): Use
module-aliases->module-file-names.
(flat-linux-module-directory): Use module-aliases->module-file-names.
---
 gnu/build/linux-modules.scm |  56 +++++++++++++++++++++-
 gnu/system/linux-initrd.scm | 110 ++++++++++++++++++--------------------------
 2 files changed, 100 insertions(+), 66 deletions(-)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index af217c974..44059ad93 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -21,6 +21,7 @@
   #:use-module (guix elf)
   #:use-module (guix glob)
   #:use-module (guix build syscalls)
+  #:use-module (guix build utils) ; find-files
   #:use-module (rnrs io ports)
   #:use-module (rnrs bytevectors)
   #:use-module (srfi srfi-1)
@@ -28,9 +29,12 @@
   #:use-module (ice-9 vlist)
   #:use-module (ice-9 match)
   #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 regex)
+  #:use-module (ice-9 ftw)
   #:export (dot-ko
             ensure-dot-ko
             module-aliases
+            module-aliases->module-file-names
             module-dependencies
             recursive-module-dependencies
             modules-loaded
@@ -385,7 +389,7 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
 
 (define (install-module-files module-files output)
   "Install MODULE-FILES to OUTPUT.
-Precondition: OUTPUT is an empty directory."
+Precondition: OUTPUT is an empty directory except for \"modules.builtin\"."
   (let ((aliases
          (map (lambda (module-file-name)
                 (format #t "copying '~a'...~%" module-file-name)
@@ -431,4 +435,54 @@ Precondition: OUTPUT is an empty directory."
             (_ #f))
            aliases))))))
 
+(define (module-aliases->module-file-names linux aliases)
+  "Resolve ALIASES to module file names, including their dependencies (which will appear
+first).  Each alias will map to a list of module file names.
+LINUX is the directory containing \"lib\"."
+  (define (string->regexp str)
+    ;; Return a regexp that matches STR exactly.
+    (string-append "^" (regexp-quote str) "$"))
+
+  (define module-dir
+    (string-append linux "/lib/modules"))
+
+  (define (find-only-entry directory)
+    (match (scandir directory)
+     (("." ".." basename)
+      (string-append directory "/" basename))))
+
+  (define linux-release-module-directory
+    (find-only-entry module-dir))
+
+  (define known-module-aliases*
+    (known-module-aliases
+     (string-append linux-release-module-directory
+                    "/modules.alias")))
+  (define (resolve-alias alias)
+    "If possible, resolve ALIAS to a list of module names.
+Otherwise return just ALIAS as possible module names."
+    (match (delete-duplicates (matching-modules alias
+                                                known-module-aliases*))
+           (()
+            (list alias))
+           (items
+            items)))
+
+  (define (lookup module)
+    (let ((name (ensure-dot-ko module)))
+      (match (find-files module-dir (string->regexp name))
+             ((file)
+              file)
+             (()
+              (error "module not found" name module-dir))
+             ((_ ...)
+              (error "several modules by that name"
+                     name module-dir)))))
+  (append-map (lambda (alias)
+                (let ((modules (map lookup (resolve-alias alias))))
+                  (append (recursive-module-dependencies modules
+                                                         #:lookup-module
+                                                         lookup) modules)))
+              aliases))
+
 ;;; linux-modules.scm ends here
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 8050ac47e..dc826c63e 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -58,35 +58,14 @@
 
 (define* (%modprobe linux-module-directory #:key
                     (guile %guile-static-stripped))
+  "Minimal implementation of modprobe for our initrd.
+LINUX-MODULE-DIRECTORY is the directory that contains \"lib\"."
   (program-file "modprobe"
     (with-imported-modules (source-module-closure
                             '((gnu build linux-modules)))
       #~(begin
           (use-modules (gnu build linux-modules) (ice-9 getopt-long)
-                       (ice-9 match) (srfi srfi-1) (ice-9 ftw))
-          (define (find-only-entry directory)
-            (match (scandir directory)
-             (("." ".." basename)
-              (string-append directory "/" basename))))
-          (define (resolve-alias alias)
-            (let* ((linux-release-module-directory
-                    (find-only-entry (string-append "/lib/modules"))))
-              (match (delete-duplicates (matching-modules alias
-                      (known-module-aliases
-                        (string-append linux-release-module-directory
-                                       "/modules.alias"))))
-               (()
-                (error "no alias by that name" alias))
-               (items
-                items))))
-          (define (lookup-module module)
-            (let* ((linux-release-module-directory
-                    (find-only-entry (string-append "/lib/modules")))
-                   (file-name (string-append linux-release-module-directory
-                                             "/" (ensure-dot-ko module))))
-              (if (file-exists? file-name)
-                  file-name
-                  (error "no module file found for module" module))))
+                       (ice-9 match) (srfi srfi-1))
           (define option-spec
            '((quiet    (single-char #\q) (value #f))))
           (define options
@@ -98,22 +77,31 @@
             (for-each (match-lambda
                         (('quiet . #t)
                          #f)
-                        ((() modules ...)
-                         (for-each (lambda (alias)
-                                     (catch #t
-                                       (lambda ()
-                                         (let ((modules (resolve-alias alias)))                                           (for-each (lambda (module)
-                                                       (load-linux-module*
-                                                        (lookup-module module)
-                                                        #:lookup-module
-                                                        lookup-module))
-                                                     modules)))
-                                       (lambda (key . args)
-                                         (display (cons* key args)
-                                                  (current-error-port))
-                                         (newline (current-error-port))
-                                         (set! exit-status 1))))
-                                   modules)))
+                        ((() aliases ...)
+                         (catch #t
+                           (lambda ()
+                             (let ((module-file-names
+                                    (module-aliases->module-file-names
+                                     #$linux-module-directory aliases)))
+                               (for-each (lambda (name)
+                                           (catch 'system-error
+                                             (lambda ()
+                                               (when (not (load-linux-module* name
+                                                                              #:recursive?
+                                                                              #f))
+                                                 (set! exit-status 1)))
+                                             (lambda (key . args)
+                                               (when (not (= EEXIST
+                                                             (system-error-errno
+                                                              (cons key args))))
+                                                 (print-exception (current-error-port)
+                                                                  #f key args)
+                                                 (set! exit-status 1)))))
+                                         module-file-names)))
+                           (lambda (key . args)
+                             (print-exception (current-error-port)
+                                              #f key args)
+                             (set! exit-status 1)))))
                       options)
             (exit exit-status))))
   #:guile guile))
@@ -173,17 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd."
                     #:references-graphs `(("init-closure" ,init)
                                           ("modprobe-closure" ,modprobe))))
 
-(define (flat-linux-module-directory linux modules)
-  "Return a flat directory containing the Linux kernel modules listed in
-MODULES and taken from LINUX."
+(define (flat-linux-module-directory linux aliases)
+  "Return a flat directory containing the Linux kernel modules resolved by
+ALIASES and taken from LINUX."
   (define build-exp
     (with-imported-modules (source-module-closure
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex) (ice-9 ftw)
+          (use-modules (ice-9 match) (ice-9 ftw)
                        (srfi srfi-1)
-                       (guix build utils)
+                       (guix build utils) ; TODO: Remove
                        (gnu build linux-modules))
 
           (define (string->regexp str)
@@ -193,33 +181,25 @@ MODULES and taken from LINUX."
           (define module-dir
             (string-append #$linux "/lib/modules"))
 
-          (define (lookup module)
-            (let ((name (ensure-dot-ko module)))
-              (match (find-files module-dir (string->regexp name))
-                ((file)
-                 file)
-                (()
-                 (error "module not found" name module-dir))
-                ((_ ...)
-                 (error "several modules by that name"
-                        name module-dir)))))
+          (define (find-only-entry directory)
+            (match (scandir directory)
+             (("." ".." basename)
+              (string-append directory "/" basename))))
+
+          (define linux-release-module-directory
+            (find-only-entry module-dir))
 
           (define modules
-            (let ((modules (map lookup '#$modules)))
-              (append modules
-                      (recursive-module-dependencies modules
-                                                     #:lookup-module lookup))))
+            (module-aliases->module-file-names #$linux '#$aliases))
 
           (define version
-            (match
-             (filter
-              (lambda (name)
-                (not (string-prefix? "." name)))
-              (scandir module-dir))
-             ((item) item)))
+            (basename linux-release-module-directory))
 
           (let ((output (string-append #$output "/lib/modules/" version)))
             (mkdir-p output)
+            (install-file
+             (string-append linux-release-module-directory "/modules.builtin")
+             output)
             (install-module-files (delete-duplicates modules) output))
           #t)))
   (computed-file "linux-modules" build-exp))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 2/7] linux-modules: Add install-modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 15:33:02 +0000
Resent-Message-ID: <handler.30604.B30604.15200911481342 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15200911481342
          (code B ref 30604); Sat, 03 Mar 2018 15:33:02 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 15:32:28 +0000
Received: from localhost ([127.0.0.1]:42955 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1es999-0000La-Vr
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 10:32:28 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:51092)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1es998-0000LS-Eb
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 10:32:26 -0500
Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id C19CD336173E
 for <30604 <at> debbugs.gnu.org>; Sat,  3 Mar 2018 16:32:24 +0100 (CET)
Date: Sat, 3 Mar 2018 16:32:12 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180303163212.40f17905@HIDDEN>
In-Reply-To: <20180303135533.6112-3-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-3-dannym@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/bCYi916gqBvqPpM=6.JlJQN"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/bCYi916gqBvqPpM=6.JlJQN
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

> +          ;; Note: there's only one devname and then only one (char-majo=
r|block-major).
> +          (for-each
> +           (match-lambda
> +            (((? (cut string-prefix? "devname:" <>) alias) . value)
> +             (set! devname (string-drop value (string-length "devname:")=
)))
> +            (((? (cut string-prefix? "char-major-" <>) alias) . value)
> +             (let ((parts (string-tokenize %not-dash)))
> +               (match parts
> +                      ((a b major minor)
> +                       (format port "~a ~a ~a:~a\n" devname "c" major mi=
nor)))))
> +            (((? (cut string-prefix? "block-major-" <>) alias) . value)
> +             (let ((parts (string-tokenize %not-dash)))
> +               (match parts
> +                      ((a b major minor)
> +                       (format port "~a ~a ~a:~a\n" devname "b" major mi=
nor)))))
> +            (_ #f))
> +           aliases))))))

Probably better to be more careful that devname is set early enough.

--Sig_/bCYi916gqBvqPpM=6.JlJQN
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqav/wACgkQ5xo1VCww
uqV50wf/VBhDH1xsp4i365g/suHyV27f38/lFep7ohe11uMGlKxolmCCaGoo8/bC
lhVuRnGme8dWV3DaKW8Ih+DE82FkZr+EulBxK9MmPxuw3FRCZDqw058PPkjM+pAM
a09O8uj3qHTsWhNZzKA+Mf0o442+Pz4MwQE2JnX1eEuFltTzBrVAKjIsgbHgmRfh
OAfPnmmBK3lNRTDB/qLvc6U1iuZOP+JduRr05kr7cjOFDZ2Rr0Q1dgB034GXwlj0
3dCw2izbdKc6xhGP5wjDt6Hradg+ReglrDgLzh0mXY0hq9aUIvXxj9ngA3Q05gu1
5n9B45TPg7OOKL7hsHumczfWFXLBLA==
=EtMr
-----END PGP SIGNATURE-----

--Sig_/bCYi916gqBvqPpM=6.JlJQN--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 7/7] linux-initrd: Factorize %modprobe and flat-linux-module-directory.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 18:02:01 +0000
Resent-Message-ID: <handler.30604.B30604.152010010421765 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152010010421765
          (code B ref 30604); Sat, 03 Mar 2018 18:02:01 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 18:01:44 +0000
Received: from localhost ([127.0.0.1]:42985 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esBTc-0005ez-9z
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 13:01:44 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:33880)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esBTZ-0005ep-Tx
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 13:01:42 -0500
Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 4079833602C9
 for <30604 <at> debbugs.gnu.org>; Sat,  3 Mar 2018 19:01:40 +0100 (CET)
Date: Sat, 3 Mar 2018 19:01:31 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180303190131.5a400f7d@HIDDEN>
In-Reply-To: <20180303135533.6112-8-dannym@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-8-dannym@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/2RZK+1d+ZEai1B.L8BmqBOA"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/2RZK+1d+ZEai1B.L8BmqBOA
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

> +                       (guix build utils) ; TODO: Remove

Required for mkdir-p

--Sig_/2RZK+1d+ZEai1B.L8BmqBOA
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqa4vsACgkQ5xo1VCww
uqXOsgf/YAhsza+9v+prxTjzBWMjmdnk4mmMOMjJMoKQvMJlUDKzpVGXRBmmiAXc
gkDel+oaMwi59dhe9jCmMb6cxDETIrFWk7HTHnjpAW5TwS6giIDu4ka83Qk65hI0
cQYgntsHOLfoOrONKnZ9Aw6TnG19lZAsyga1efmFllvyuU+tXuKAde2YZhrbx9ri
vvKJTIVmeAd5tXRxhw44yniPigWS2MRJkEasgYOJPNbaBtoZ4JkfIaWkBIGxsDtF
uVw+JxlMqp/SlbnPPEdYasDWSijIv9ypqAFjNoU/oZd9NqjO8ORSdctRutKy///R
ANg1nn1m7F3x48yAenSc78etjezWfA==
=ILLM
-----END PGP SIGNATURE-----

--Sig_/2RZK+1d+ZEai1B.L8BmqBOA--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 1/7] linux-modules: Add module-aliases.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 21:59:01 +0000
Resent-Message-ID: <handler.30604.B30604.152011432025599 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152011432025599
          (code B ref 30604); Sat, 03 Mar 2018 21:59:01 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 21:58:40 +0000
Received: from localhost ([127.0.0.1]:43230 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esFAu-0006ep-4C
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 16:58:40 -0500
Received: from hera.aquilenet.fr ([185.233.100.1]:54924)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1esFAs-0006eh-IA
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 16:58:39 -0500
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id EA45611D90;
 Sat,  3 Mar 2018 22:58:37 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id gcfN9Wz-4cDE; Sat,  3 Mar 2018 22:58:37 +0100 (CET)
Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 113E8111A6;
 Sat,  3 Mar 2018 22:58:37 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-2-dannym@HIDDEN>
Date: Sat, 03 Mar 2018 22:58:36 +0100
In-Reply-To: <20180303135533.6112-2-dannym@HIDDEN> (Danny
 Milosavljevic's message of "Sat, 3 Mar 2018 14:55:27 +0100")
Message-ID: <87371g6ctv.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Danny Milosavljevic <dannym@HIDDEN> skribis:

> * gnu/build/linux-modules.scm (module-aliases): New variable.

LGTM!

> +(define (module-aliases file)
> +  "Return the list of aliases of module FILE."
> +  (let ((info (modinfo-section-contents file)))
> +    (filter-map (match-lambda
> +                 (('alias . value)
> +                  value)
> +                 (_ #f)) (modinfo-section-contents file))))

Nitpick: align like this:

  (filter-map first
              second)

when the first arg spans several lines.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 2/7] linux-modules: Add install-modules.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 22:09:01 +0000
Resent-Message-ID: <handler.30604.B30604.152011488126535 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152011488126535
          (code B ref 30604); Sat, 03 Mar 2018 22:09:01 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 22:08:01 +0000
Received: from localhost ([127.0.0.1]:43244 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esFJx-0006tn-DJ
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 17:08:01 -0500
Received: from hera.aquilenet.fr ([185.233.100.1]:54960)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1esFJv-0006tY-Em
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 17:07:59 -0500
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id E8E4011D90;
 Sat,  3 Mar 2018 23:07:58 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id ZNbPZTCOq_gq; Sat,  3 Mar 2018 23:07:58 +0100 (CET)
Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id F3B58111A6;
 Sat,  3 Mar 2018 23:07:57 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-3-dannym@HIDDEN>
Date: Sat, 03 Mar 2018 23:07:57 +0100
In-Reply-To: <20180303135533.6112-3-dannym@HIDDEN> (Danny
 Milosavljevic's message of "Sat, 3 Mar 2018 14:55:28 +0100")
Message-ID: <87y3j84xtu.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Danny Milosavljevic <dannym@HIDDEN> skribis:

> * gnu/build/linux-modules.scm (install-modules): New procedure.
> (%not-dash): New variable.

We could reuse modules.alias and modules.devname from the =E2=80=98linux-li=
bre=E2=80=99
package (right?), but I guess it doesn=E2=80=99t hurt to generate custom on=
es.

> +(define (install-module-files module-files output)
> +  "Install MODULE-FILES to OUTPUT.
> +Precondition: OUTPUT is an empty directory."
> +  (let ((aliases
> +         (map (lambda (module-file-name)
> +                (format #t "copying '~a'...~%" module-file-name)
> +                (copy-file module-file-name
> +                           (string-append output "/"
> +                                          (basename module-file-name)))
> +                `(,(file-name->module-name module-file-name) .
> +                  ,(module-aliases module-file-name)))
> +              (sort module-files string<))))
> +    (call-with-output-file (string-append output "/modules.alias")
> +      (lambda (port)
> +        (format port
> +                "# Aliases extracted from modules themselves.\n")
> +        (for-each (match-lambda ((module . aliases)
> +                                 (for-each (lambda (alias)
> +                                             (format port "alias ~a ~a\n=
" alias
> +                                                     module))
> +                                           aliases)))
> +                  aliases)))
> +    (call-with-output-file (string-append output "/modules.devname")
> +      (lambda (port)
> +        (format port
> +                "# Device nodes to trigger on-demand module loading.\n")
> +        (let* ((aliases (append-map (match-lambda
> +                                     ((module . aliases) aliases))
> +                                    aliases))
> +               (devname #f))
> +          ;; Note: there's only one devname and then only one (char-majo=
r|block-major).
> +          (for-each
> +           (match-lambda
> +            (((? (cut string-prefix? "devname:" <>) alias) . value)
> +             (set! devname (string-drop value (string-length "devname:")=
)))
> +            (((? (cut string-prefix? "char-major-" <>) alias) . value)
> +             (let ((parts (string-tokenize %not-dash)))
> +               (match parts
> +                      ((a b major minor)
> +                       (format port "~a ~a ~a:~a\n" devname "c" major mi=
nor)))))
> +            (((? (cut string-prefix? "block-major-" <>) alias) . value)
> +             (let ((parts (string-tokenize %not-dash)))
> +               (match parts
> +                      ((a b major minor)
> +                       (format port "~a ~a ~a:~a\n" devname "b" major mi=
nor)))))
> +            (_ #f))
> +           aliases))))))

I think we need different procedures here:

  (write-module-alias-database modules port)  ;for =E2=80=9Cmodules.alias=
=E2=80=9D
  (write-module-device-database modules port) ;for =E2=80=9Cmodules.devname=
=E2=80=9D

with docstrings.

I=E2=80=99m not sure we need =E2=80=98install-module-files=E2=80=99 itself.=
  Perhaps we can
inline it at the call site?

For the devname code, please avoid =E2=80=98set!=E2=80=99.  Instead you can=
 thread the
current devname as the state of a loop:

  (let loop ((devname #f)
             (aliases aliases))
    (match aliases
      (() =E2=80=A6)
      (((? devname-alias? devname) . rest)
       (loop devname rest))
      =E2=80=A6))
=20=20=20=20=20=20=20
The indentation of =E2=80=98match=E2=80=99 forms is wrong.  Would it be OK =
for you to
pass it through ./etc/indent-code.el?  (It=E2=80=99s non interactive, you d=
on=E2=80=99t
need to actually use Emacs.)

Thanks,
Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 03 Mar 2018 22:49:02 +0000
Resent-Message-ID: <handler.30604.B30604.152011732330236 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152011732330236
          (code B ref 30604); Sat, 03 Mar 2018 22:49:02 +0000
Received: (at 30604) by debbugs.gnu.org; 3 Mar 2018 22:48:43 +0000
Received: from localhost ([127.0.0.1]:43292 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esFxL-0007rb-JY
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 17:48:43 -0500
Received: from hera.aquilenet.fr ([185.233.100.1]:55216)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1esFxJ-0007rS-9F
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 17:48:41 -0500
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 72AED11DE2;
 Sat,  3 Mar 2018 23:48:40 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id Siot1ErsUpmx; Sat,  3 Mar 2018 23:48:39 +0100 (CET)
Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 3465211D90;
 Sat,  3 Mar 2018 23:48:39 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
Date: Sat, 03 Mar 2018 23:48:38 +0100
In-Reply-To: <20180303135533.6112-4-dannym@HIDDEN> (Danny
 Milosavljevic's message of "Sat, 3 Mar 2018 14:55:29 +0100")
Message-ID: <87sh9g4vy1.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Danny Milosavljevic <dannym@HIDDEN> skribis:

> * gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
> the hardware is present.
> (lookup-module): Delete procedure.
> * gnu/system/linux-initrd.scm (raw-initrd): Add imports.

[...]

> +  (define (load-kernel-modules)
> +    "Examine /sys/devices to find out which modules to load and load the=
m."
> +    (define enter?
> +      (const #t))
> +    (define (down! directory stat result)
> +     ;; Note: modprobe mutates the tree starting with DIRECTORY.
> +     (let ((modalias-name (string-append directory "/modalias")))
> +       (if (file-exists? modalias-name)
> +           (let ((modalias
> +                 (string-trim-right (call-with-input-file modalias-name
> +                                                          read-string)
> +                                    #\newline)))
> +             (system* "/sbin/modprobe" "-q" "--" modalias))))

If we change =E2=80=98flat-linux-module-directory=E2=80=99 to produce a =E2=
=80=98modules.alias=E2=80=99
file, here we could read =E2=80=98modules.aliases=E2=80=99 directly and loa=
d the right
thing.

With the patch below, we get =E2=80=98needed-modules=E2=80=99, and we could=
 simply do:

  (for-each (catch-ENOENT load-linux-module*)
            (needed-modules
             (known-module-aliases (string-append linux-module-directory
                                                  "/modules.alias"))))

and we can do away with kmod=E2=80=99s modprobe.

Thoughts?

Ludo=E2=80=99.


--=-=-=
Content-Type: text/x-patch
Content-Disposition: inline

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 4a6d4ff08..251095072 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -20,6 +20,7 @@
 (define-module (gnu build linux-modules)
   #:use-module (guix elf)
   #:use-module (guix glob)
+  #:use-module (guix build utils)
   #:use-module (guix build syscalls)
   #:use-module (rnrs io ports)
   #:use-module (rnrs bytevectors)
@@ -40,7 +41,8 @@
 
             device-module-aliases
             known-module-aliases
-            matching-modules))
+            matching-modules
+            needed-modules))
 
 ;;; Commentary:
 ;;;
@@ -370,4 +372,25 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                       module)))
               known-aliases))
 
+(define (system-device-aliases)
+  "Browse /sys/devices in search of \"modalias\" files and return the list of
+device aliases for the current system."
+  (let ((files (find-files "/sys/devices"
+                           (lambda (file stat)
+                             (and (eq? 'regular (stat:type stat))
+                                  (string=? "modalias" (basename file)))))))
+    (filter-map (lambda (file)
+                  (match (string-trim-right
+                          (call-with-input-file file get-string-all))
+                    ("" #f)
+                    (alias alias)))
+                files)))
+
+(define* (needed-modules #:optional (known-aliases (known-module-aliases)))
+  "Return the list of modules needed by devices on the current system.  This
+is achieved by browsing /sys/devices and returning the maching modules from
+KNOWN-ALIASES."
+  (append-map (cut matching-modules <> known-aliases)
+              (system-device-aliases)))
+
 ;;; linux-modules.scm ends here

--=-=-=--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:08:02 +0000
Resent-Message-ID: <handler.30604.B30604.15201256259749 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15201256259749
          (code B ref 30604); Sun, 04 Mar 2018 01:08:02 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:07:05 +0000
Received: from localhost ([127.0.0.1]:43340 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI7F-0002XB-1r
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:07:05 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38238)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI7D-0002Wy-96
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:07:03 -0500
Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 99A22336224E;
 Sun,  4 Mar 2018 02:07:01 +0100 (CET)
Date: Sun, 4 Mar 2018 02:06:43 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180304020643.6773e016@HIDDEN>
In-Reply-To: <87sh9g4vy1.fsf@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/2j+BS72XcrZBeirf3UmbMmD"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/2j+BS72XcrZBeirf3UmbMmD
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

On Sat, 03 Mar 2018 23:48:38 +0100
ludo@HIDDEN (Ludovic Court=C3=A8s) wrote:

> > +             (system* "/sbin/modprobe" "-q" "--" modalias)))) =20
>=20
> If we change =E2=80=98flat-linux-module-directory=E2=80=99 to produce a =
=E2=80=98modules.alias=E2=80=99
> file, here we could read =E2=80=98modules.aliases=E2=80=99 directly and l=
oad the right
> thing.
>=20
> With the patch below, we get =E2=80=98needed-modules=E2=80=99, and we cou=
ld simply do:
>=20
>   (for-each (catch-ENOENT load-linux-module*)
>             (needed-modules
>              (known-module-aliases (string-append linux-module-directory
>                                                   "/modules.alias"))))
>=20
> and we can do away with kmod=E2=80=99s modprobe.

It's not kmod's modprobe anymore.  It's our pure-Guile implementation.

Linux lazy-invokes modprobe (for example when mounting stuff), so
/sbin/modprobe is never going away - but it can be our implementation.

I doubt it will take the modules from the correct directory with your patch.
(Of course otherwise it looks much nicer - but I think it won't pass the te=
sts)

My newest version (v9) will use the same procedure for both computing the l=
ist
of modules for flat-linux-module-directory and the list of modules that are=
 to
be modprobed - I think it's nice to be able to keep those in sync so we don=
't
get nasty surprises.  Let's see how that goes...

--Sig_/2j+BS72XcrZBeirf3UmbMmD
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqbRqMACgkQ5xo1VCww
uqXDwQgAowI5zaIU+SBYbyZPcBgJoXZC0c5raPEdUouIjGTcIY3A0uIY9hLfuMDX
kX+Sg60ZEvxBtoJmsy9eMNKlvuzVduB8jNEouH1MQcUBLu6wSLvHhkQRHjamAHkN
oRKpLTj429itvdQ0jNewulqshW3xeeneepYDITKFD/sOAHt/ek0DFthYYxIJUEXY
PXLkJ+O2mCyspt4uoc+8L+4dtEO9gv3asmu4mhk8D5+bXZ0DgBVsNqmQrOe3XSkc
S0no3CafpSInmq+HuGAbFwnJcQbp1ISd3AoSMXEBAfaSVoaE/ZzKFKLgavNuvbpD
SQdW8dstK+ZyUiOP6KiaG3g5tn2AHg==
=Qtnk
-----END PGP SIGNATURE-----

--Sig_/2j+BS72XcrZBeirf3UmbMmD--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 0/7] Load Linux module only when supported hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:10:02 +0000
Resent-Message-ID: <handler.30604.B30604.15201257689950 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15201257689950
          (code B ref 30604); Sun, 04 Mar 2018 01:10:02 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:28 +0000
Received: from localhost ([127.0.0.1]:43344 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI9Y-0002aP-Ft
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:28 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38420)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI9W-0002aH-Iu
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:26 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 93D15336224E;
 Sun,  4 Mar 2018 02:09:25 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun,  4 Mar 2018 02:09:07 +0100
Message-Id: <20180304010914.1322-1-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180303135533.6112-1-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

Danny Milosavljevic (7):
  linux-modules: Add "modules.devname" and "modules.alias" writer.
  linux-modules: Add module-aliases->module-file-names.
  linux-initrd: Provide pure-Guile modprobe.
  linux-boot: Load kernel modules only when the hardware is present.
  vm: Allow qemu-image builder to load Linux kernel modules.
  vm: Make the virtio-blk uniquely identifiable in /sys.
  linux-initrd: Use module-aliases->module-file-names, too.

 gnu/build/linux-boot.scm    |  42 +++++++++++---
 gnu/build/linux-initrd.scm  |  13 ++++-
 gnu/build/linux-modules.scm | 114 +++++++++++++++++++++++++++++++++++++
 gnu/build/vm.scm            |   2 +-
 gnu/system/linux-initrd.scm | 136 +++++++++++++++++++++++++++++++++-----------
 gnu/system/vm.scm           |  34 +++++++++--
 6 files changed, 295 insertions(+), 46 deletions(-)





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 1/7] linux-modules: Add "modules.devname" and "modules.alias" writer.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:10:03 +0000
Resent-Message-ID: <handler.30604.B30604.15201257719970 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15201257719970
          (code B ref 30604); Sun, 04 Mar 2018 01:10:03 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:31 +0000
Received: from localhost ([127.0.0.1]:43348 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI9a-0002ak-Ng
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:30 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38428)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI9Z-0002aS-2c
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:29 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 12781336224E;
 Sun,  4 Mar 2018 02:09:27 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun,  4 Mar 2018 02:09:08 +0100
Message-Id: <20180304010914.1322-2-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (write-module-alias-database): New procedure.
(write-module-device-database): New procedure.
(%not-dash): New variable.
---
 gnu/build/linux-modules.scm | 58 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 4fe673cca..0aaf2ff6f 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -36,6 +36,8 @@
             modules-loaded
             module-loaded?
             load-linux-module*
+            write-module-alias-database
+            write-module-device-database
 
             current-module-debugging-port
 
@@ -380,4 +382,60 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                       module)))
               known-aliases))
 
+(define %not-dash
+  (char-set-complement (char-set #\-)))
+
+(define (write-module-alias-database aliases output)
+  "Install \"modules.alias\" for ALIASES to directory OUTPUT."
+  (call-with-output-file (string-append output "/modules.alias")
+    (lambda (port)
+      (format port
+              "# Aliases extracted from modules themselves.\n")
+      (for-each (match-lambda ((module . aliases)
+                               (for-each (lambda (alias)
+                                           (format port "alias ~a ~a\n" alias
+                                                   module))
+                                         aliases)))
+                aliases))))
+
+(define (write-module-device-database aliases output)
+  "Install \"modules.devname\" for ALIASES to directory OUTPUT."
+  (call-with-output-file (string-append output "/modules.devname")
+    (lambda (port)
+      (format port
+              "# Device nodes to trigger on-demand module loading.\n")
+      (for-each (match-lambda
+                 ((module . aliases)
+                  (let* ((interesting-aliases
+                          ;; Note: there's only one devname and then only one
+                          ;; (char-major|block-major).
+                          (filter-map
+                           (match-lambda
+                            ((? (cut string-prefix? "devname:" <>) alias)
+                             `(devname . ,(string-drop alias (string-length "devname:"))))
+                            ((? (cut string-prefix? "char-major-" <>) alias)
+                             `(char-major . ,(string-drop alias (string-length "char-major-"))))
+                            ((? (cut string-prefix? "block-major-" <>) alias)
+                             `(block-major . ,(string-drop alias (string-length "block-major-"))))
+                            (_ #f))
+                           aliases))
+                         (devname (assq-ref interesting-aliases
+                                            'devname))
+                         (char-major (assq-ref interesting-aliases
+                                               'char-major))
+                         (block-major (assq-ref interesting-aliases
+                                               'block-major)))
+                    (when (and devname char-major)
+                      (let ((parts (string-tokenize char-major %not-dash)))
+                        (match parts
+                         ((major minor)
+                          (format port "~a ~a ~a~a:~a\n" module devname
+                                       "c" major minor)))))
+                    (when (and devname block-major)
+                      (let ((parts (string-tokenize block-major %not-dash)))
+                        (match parts
+                         ((major minor)
+                          (format port "~a ~a ~a~a:~a\n" module devname
+                                       "b" major minor)))))))) aliases))))
+
 ;;; linux-modules.scm ends here




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 2/7] linux-modules: Add module-aliases->module-file-names.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:10:03 +0000
Resent-Message-ID: <handler.30604.B30604.15201257729984 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15201257729984
          (code B ref 30604); Sun, 04 Mar 2018 01:10:03 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:32 +0000
Received: from localhost ([127.0.0.1]:43350 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI9b-0002at-W1
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:32 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38438)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI9a-0002ad-78
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:30 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 483A83362AE1;
 Sun,  4 Mar 2018 02:09:29 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun,  4 Mar 2018 02:09:09 +0100
Message-Id: <20180304010914.1322-3-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-modules.scm (module-aliases->module-file-names): New
procedure.
---
 gnu/build/linux-modules.scm | 55 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 0aaf2ff6f..f6bb0512b 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -21,6 +21,7 @@
   #:use-module (guix elf)
   #:use-module (guix glob)
   #:use-module (guix build syscalls)
+  #:use-module (guix build utils) ; find-files
   #:use-module (rnrs io ports)
   #:use-module (rnrs bytevectors)
   #:use-module (srfi srfi-1)
@@ -28,9 +29,12 @@
   #:use-module (ice-9 vlist)
   #:use-module (ice-9 match)
   #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 regex)
+  #:use-module (ice-9 ftw)
   #:export (dot-ko
             ensure-dot-ko
             module-aliases
+            module-aliases->module-file-names
             module-dependencies
             recursive-module-dependencies
             modules-loaded
@@ -438,4 +442,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                           (format port "~a ~a ~a~a:~a\n" module devname
                                        "b" major minor)))))))) aliases))))
 
+(define (module-aliases->module-file-names linux aliases)
+  "Resolve ALIASES to module file names, including their dependencies (which will appear
+first).  Each alias will map to a list of module file names.
+LINUX is the directory containing \"lib\"."
+  (define (string->regexp str)
+    ;; Return a regexp that matches STR exactly.
+    (string-append "^" (regexp-quote str) "$"))
+
+  (define module-dir
+    (string-append linux "/lib/modules"))
+
+  (define (find-only-entry directory)
+    (match (scandir directory)
+     (("." ".." basename)
+      (string-append directory "/" basename))))
+
+  (define linux-release-module-directory
+    (find-only-entry module-dir))
+
+  (define known-module-aliases*
+    (known-module-aliases
+     (string-append linux-release-module-directory
+                    "/modules.alias")))
+  (define (resolve-alias alias)
+    "If possible, resolve ALIAS to a list of module names.
+Otherwise return just ALIAS as possible module names."
+    (match (delete-duplicates (matching-modules alias
+                                                known-module-aliases*))
+           (()
+            (list alias))
+           (items
+            items)))
+
+  (define (lookup module)
+    (let ((name (ensure-dot-ko module)))
+      (match (find-files module-dir (string->regexp name))
+             ((file)
+              file)
+             (()
+              (error "module not found" name module-dir))
+             ((_ ...)
+              (error "several modules by that name"
+                     name module-dir)))))
+  (append-map (lambda (alias)
+                (let ((modules (map lookup (resolve-alias alias))))
+                  (append (recursive-module-dependencies modules
+                                                         #:lookup-module
+                                                         lookup)
+                          modules)))
+              aliases))
+
 ;;; linux-modules.scm ends here




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 3/7] linux-initrd: Provide pure-Guile modprobe.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:10:04 +0000
Resent-Message-ID: <handler.30604.B30604.15201257739999 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15201257739999
          (code B ref 30604); Sun, 04 Mar 2018 01:10:04 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:33 +0000
Received: from localhost ([127.0.0.1]:43354 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI9d-0002bC-Bl
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:33 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38446)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI9b-0002ar-NV
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:32 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 5BBDC336224E;
 Sun,  4 Mar 2018 02:09:30 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun,  4 Mar 2018 02:09:10 +0100
Message-Id: <20180304010914.1322-4-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (%modprobe): New variable.
(expression->initrd): Add modprobe, LINUX-MODULE-DIRECTORY.
(raw-initrd): Pass KODIR as LINUX-MODULE-DIRECTORY.
* gnu/build/linux-initrd.scm (build-initrd): Add modprobe.
---
 gnu/build/linux-initrd.scm  | 13 ++++++++-
 gnu/system/linux-initrd.scm | 65 ++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 74 insertions(+), 4 deletions(-)

diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..d4cb5e2d8 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -107,7 +107,7 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init modprobe linux-module-directory
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
@@ -131,6 +131,17 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+     ;; Make modprobe available as /sbin/modprobe so the kernel finds it.
+    (when modprobe
+      (mkdir-p "sbin")
+      (symlink modprobe "sbin/modprobe")
+      (compile-to-cache "sbin/modprobe"))
+
+    ;; Make modules available as /lib/modules so modprobe finds them.
+    (mkdir-p "lib")
+    (symlink (string-append linux-module-directory "/lib/modules")
+             "lib/modules")
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index e0cb59c00..6ad6d75f7 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -46,7 +46,8 @@
             %base-initrd-modules
             raw-initrd
             file-system-packages
-            base-initrd))
+            base-initrd
+            %modprobe))
 
 
 ;;; Commentary:
@@ -56,11 +57,61 @@
 ;;;
 ;;; Code:
 
+(define* (%modprobe linux-module-directory #:key
+                    (guile %guile-static-stripped))
+  "Minimal implementation of modprobe for our initrd.
+LINUX-MODULE-DIRECTORY is the directory that contains \"lib\"."
+  (program-file "modprobe"
+    (with-imported-modules (source-module-closure
+                            '((gnu build linux-modules)))
+      #~(begin
+          (use-modules (gnu build linux-modules) (ice-9 getopt-long)
+                       (ice-9 match) (srfi srfi-1))
+          (define option-spec
+           '((quiet    (single-char #\q) (value #f))))
+          (define options
+            (getopt-long (command-line) option-spec))
+          (when (option-ref options 'quiet #f)
+            (current-error-port (%make-void-port "w"))
+            (current-output-port (%make-void-port "w")))
+          (let ((exit-status 0))
+            (for-each (match-lambda
+                        (('quiet . #t)
+                         #f)
+                        ((() aliases ...)
+                         (catch #t
+                           (lambda ()
+                             (let ((module-file-names
+                                    (module-aliases->module-file-names
+                                     #$linux-module-directory aliases)))
+                               (for-each (lambda (name)
+                                           (catch 'system-error
+                                             (lambda ()
+                                               (when (not (load-linux-module* name
+                                                                              #:recursive?
+                                                                              #f))
+                                                 (set! exit-status 1)))
+                                             (lambda (key . args)
+                                               (when (not (= EEXIST
+                                                             (system-error-errno
+                                                              (cons key args))))
+                                                 (print-exception (current-error-port)
+                                                                  #f key args)
+                                                 (set! exit-status 1)))))
+                                         module-file-names)))
+                           (lambda (key . args)
+                             (print-exception (current-error-port)
+                                              #f key args)
+                             (set! exit-status 1)))))
+                      options)
+            (exit exit-status))))
+  #:guile guile))
 
 (define* (expression->initrd exp
                              #:key
                              (guile %guile-static-stripped)
                              (gzip gzip)
+                             linux-module-directory
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
@@ -73,6 +124,9 @@ the derivations referenced by EXP are automatically copied to the initrd."
   (define init
     (program-file "init" exp #:guile guile))
 
+  (define modprobe
+    (%modprobe linux-module-directory #:guile guile))
+
   (define builder
     (with-imported-modules (source-module-closure
                             '((gnu build linux-initrd)))
@@ -96,12 +150,16 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
+                        #:modprobe #$modprobe
+                        #:linux-module-directory #$linux-module-directory
                         ;; Copy everything INIT refers to into the initrd.
-                        #:references-graphs '("closure")
+                        #:references-graphs '("init-closure"
+                                              "modprobe-closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
 
   (gexp->derivation name builder
-                    #:references-graphs `(("closure" ,init))))
+                    #:references-graphs `(("init-closure" ,init)
+                                          ("modprobe-closure" ,modprobe))))
 
 (define (flat-linux-module-directory linux modules)
   "Return a flat directory containing the Linux kernel modules listed in
@@ -225,6 +283,7 @@ upon error."
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:linux-module-directory kodir
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 4/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:10:04 +0000
Resent-Message-ID: <handler.30604.B30604.152012577410013 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152012577410013
          (code B ref 30604); Sun, 04 Mar 2018 01:10:04 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:34 +0000
Received: from localhost ([127.0.0.1]:43357 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI9e-0002bQ-Mk
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:34 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38456)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI9c-0002b6-W9
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:33 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id DACC533636F2;
 Sun,  4 Mar 2018 02:09:31 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun,  4 Mar 2018 02:09:11 +0100
Message-Id: <20180304010914.1322-5-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/linux-boot.scm (boot-system): Load kernel modules only when
the hardware is present.
* gnu/system/linux-initrd.scm (raw-initrd): Add imports.
---
 gnu/build/linux-boot.scm    | 42 +++++++++++++++++++++++++++++++++++-------
 gnu/system/linux-initrd.scm |  4 +++-
 2 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..2236d8971 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -469,9 +469,31 @@ upon error."
              mounts)
         "ext4"))
 
-  (define (lookup-module name)
-    (string-append linux-module-directory "/"
-                   (ensure-dot-ko name)))
+  (define (load-kernel-modules)
+    "Examine /sys/devices to find out which modules to load and load them."
+    (define enter?
+      (const #t))
+    (define (down! directory stat result)
+     ;; Note: modprobe mutates the tree starting with DIRECTORY.
+     (let ((modalias-name (string-append directory "/modalias")))
+       (if (file-exists? modalias-name)
+           (let ((modalias
+                 (string-trim-right (call-with-input-file modalias-name
+                                                          read-string)
+                                    #\newline)))
+             (system* "/sbin/modprobe" "-q" "--" modalias))))
+       #t)
+    (define up
+      (const #t))
+    (define skip
+      (const #t))
+    (define leaf
+      (const #t))
+    (define (error name stat errno result)
+      (format (current-error-port) "warning: ~a: ~a~%"
+              name (strerror errno))
+      result)
+    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
 
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
@@ -486,10 +508,16 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
-       (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (let* ((kernel-release
+               (utsname:release (uname)))
+              (directory
+               (string-append linux-module-directory "/lib/modules/"
+                              kernel-release))
+              (old-umask (umask #o022)))
+         (make-static-device-nodes directory)
+         (umask old-umask))
+
+       (load-kernel-modules)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 6ad6d75f7..339ecf754 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -266,7 +266,9 @@ upon error."
                       ;; this info via gexps.
                       ((gnu build file-systems)
                        #:select (find-partition-by-luks-uuid))
-                      (rnrs bytevectors))
+                      (rnrs bytevectors)
+                      (ice-9 ftw)
+                      (ice-9 rdelim))
 
          (with-output-to-port (%make-void-port "w")
            (lambda ()




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 5/7] vm: Allow qemu-image builder to load Linux kernel modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:10:05 +0000
Resent-Message-ID: <handler.30604.B30604.152012577610022 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152012577610022
          (code B ref 30604); Sun, 04 Mar 2018 01:10:05 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:36 +0000
Received: from localhost ([127.0.0.1]:43359 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI9f-0002bZ-UJ
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:36 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38464)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI9d-0002bD-Sj
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:34 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 0ACB03362AE1;
 Sun,  4 Mar 2018 02:09:32 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun,  4 Mar 2018 02:09:12 +0100
Message-Id: <20180304010914.1322-6-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/vm.scm (%modprobe-wrapper): New variable.
(qemu-image): Modify.
---
 gnu/system/vm.scm | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 91ff32ce9..cf1ec651a 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -246,6 +246,17 @@ INPUTS is a list of inputs (as for packages)."
    #:single-file-output? #t
    #:references-graphs inputs))
 
+(define (%modprobe-wrapper modprobe linux-module-directory)
+  ;; Wrapper for the 'modprobe' command that knows where modules live.
+  ;;
+  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
+  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
+  ;; environment variable is not set---hence the need for this wrapper.
+  (program-file "modprobe"
+    #~(begin
+        (setenv "LINUX_MODULE_DIRECTORY" #$linux-module-directory)
+        (apply execl #$modprobe (cons #$modprobe (cdr (command-line)))))))
+
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
@@ -275,20 +286,24 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (let ((modprobe-name (file-append os-drv "/profile/bin/modprobe"))
+        (linux-module-directory (file-append (file-append os-drv "/kernel/lib/modules"))))
   (expression->derivation-in-linux-vm
    name
-   (with-imported-modules (source-module-closure '((gnu build bootloader)
+   (with-imported-modules (source-module-closure '((gnu build activation)
+                                                   (gnu build bootloader)
                                                    (gnu build vm)
                                                    (guix build utils)))
      #~(begin
-         (use-modules (gnu build bootloader)
+         (use-modules (gnu build activation)
+                      (gnu build bootloader)
                       (gnu build vm)
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
          (let ((inputs
-                '#$(append (list qemu parted e2fsprogs dosfstools)
+                '#$(append (list qemu parted e2fsprogs dosfstools kmod)
                            (map canonical-package
                                 (list sed grep coreutils findutils gawk))
                            (if register-closures? (list guix) '())))
@@ -302,6 +317,14 @@ the image."
                         inputs)))
 
            (set-path-environment-variable "PATH" '("bin" "sbin") inputs)
+           ;; It's possible that we need to load nls modules in order to
+           ;; mount the new partition.
+           (if (file-exists? #$modprobe-name)
+               (activate-modprobe #$(%modprobe-wrapper modprobe-name
+                                     linux-module-directory))
+               (format (current-error-port)
+                "WARNING: No modprobe found in ~s.  \
+Loading kernel modules will be impossible.\n" #$modprobe-name))
 
            (let* ((graphs     '#$(match inputs
                                    (((names . _) ...)
@@ -364,7 +387,7 @@ the image."
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-   #:references-graphs inputs))
+   #:references-graphs inputs)))
 
 
 ;;;




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 6/7] vm: Make the virtio-blk uniquely identifiable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:10:05 +0000
Resent-Message-ID: <handler.30604.B30604.152012578110047 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152012578110047
          (code B ref 30604); Sun, 04 Mar 2018 01:10:05 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:41 +0000
Received: from localhost ([127.0.0.1]:43363 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI9l-0002bu-6h
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:41 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38478)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI9j-0002bm-Na
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:40 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id C5218336224E;
 Sun,  4 Mar 2018 02:09:35 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun,  4 Mar 2018 02:09:13 +0100
Message-Id: <20180304010914.1322-7-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.
---
 gnu/build/vm.scm  | 2 +-
 gnu/system/vm.scm | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..ebf9e9f6e 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,7 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index cf1ec651a..78cc8cad1 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -700,7 +700,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 7/7] linux-initrd: Use module-aliases->module-file-names, too.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:10:06 +0000
Resent-Message-ID: <handler.30604.B30604.152012578210056 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152012578210056
          (code B ref 30604); Sun, 04 Mar 2018 01:10:06 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:09:42 +0000
Received: from localhost ([127.0.0.1]:43365 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esI9m-0002c7-ES
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:42 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:38486)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esI9k-0002bt-Sr
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:09:41 -0500
Received: from dayas.3.home (77.118.252.91.wireless.dyn.drei.com
 [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id EDF6D3362AE1;
 Sun,  4 Mar 2018 02:09:39 +0100 (CET)
From: Danny Milosavljevic <dannym@HIDDEN>
Date: Sun,  4 Mar 2018 02:09:14 +0100
Message-Id: <20180304010914.1322-8-dannym@HIDDEN>
X-Mailer: git-send-email 2.15.1
In-Reply-To: <20180304010914.1322-1-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
Tags: patch
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

* gnu/system/linux-initrd.scm (flat-linux-module-directory): Use
module-aliases->module-file-names.
* gnu/build/linux-modules.scm (file-name->module-name): Export.
---
 gnu/build/linux-modules.scm |  1 +
 gnu/system/linux-initrd.scm | 67 ++++++++++++++++++++++++++-------------------
 2 files changed, 40 insertions(+), 28 deletions(-)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index f6bb0512b..81a4b15b1 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -35,6 +35,7 @@
             ensure-dot-ko
             module-aliases
             module-aliases->module-file-names
+            file-name->module-name
             module-dependencies
             recursive-module-dependencies
             modules-loaded
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 339ecf754..0b976afad 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -161,17 +161,17 @@ the derivations referenced by EXP are automatically copied to the initrd."
                     #:references-graphs `(("init-closure" ,init)
                                           ("modprobe-closure" ,modprobe))))
 
-(define (flat-linux-module-directory linux modules)
-  "Return a flat directory containing the Linux kernel modules listed in
-MODULES and taken from LINUX."
+(define (flat-linux-module-directory linux aliases)
+  "Return a flat directory containing the Linux kernel modules resolved by
+ALIASES and taken from LINUX."
   (define build-exp
     (with-imported-modules (source-module-closure
                             '((guix build utils)
                               (gnu build linux-modules)))
       #~(begin
-          (use-modules (ice-9 match) (ice-9 regex)
+          (use-modules (ice-9 match) (ice-9 ftw)
                        (srfi srfi-1)
-                       (guix build utils)
+                       (guix build utils) ; mkdir-p
                        (gnu build linux-modules))
 
           (define (string->regexp str)
@@ -181,31 +181,42 @@ MODULES and taken from LINUX."
           (define module-dir
             (string-append #$linux "/lib/modules"))
 
-          (define (lookup module)
-            (let ((name (ensure-dot-ko module)))
-              (match (find-files module-dir (string->regexp name))
-                ((file)
-                 file)
-                (()
-                 (error "module not found" name module-dir))
-                ((_ ...)
-                 (error "several modules by that name"
-                        name module-dir)))))
+          (define (find-only-entry directory)
+            (match (scandir directory)
+             (("." ".." basename)
+              (string-append directory "/" basename))))
 
-          (define modules
-            (let ((modules (map lookup '#$modules)))
-              (append modules
-                      (recursive-module-dependencies modules
-                                                     #:lookup-module lookup))))
-
-          (mkdir #$output)
-          (for-each (lambda (module)
-                      (format #t "copying '~a'...~%" module)
-                      (copy-file module
-                                 (string-append #$output "/"
-                                                (basename module))))
-                    (delete-duplicates modules)))))
+          (define linux-release-module-directory
+            (find-only-entry module-dir))
 
+          (define modules
+            (module-aliases->module-file-names #$linux '#$aliases))
+
+          (define version
+            (basename linux-release-module-directory))
+
+          (define (install-module-files module-files output)
+            "Install MODULE-FILES to OUTPUT.
+Precondition: OUTPUT is an empty directory except for \"modules.builtin\"."
+            (let ((aliases
+                   (map (lambda (module-file-name)
+                          (format #t "copying '~a'...~%" module-file-name)
+                          (copy-file module-file-name
+                           (string-append output "/"
+                                          (basename module-file-name)))
+                         `(,(file-name->module-name module-file-name) .
+                            ,(module-aliases module-file-name)))
+                     (sort module-files string<))))
+              (install-file (string-append linux-release-module-directory
+                                           "/modules.builtin")
+                            output)
+              (write-module-alias-database aliases output)
+              (write-module-device-database aliases output)))
+
+          (let ((output (string-append #$output "/lib/modules/" version)))
+            (mkdir-p output)
+            (install-module-files (delete-duplicates modules) output)
+            #t))))
   (computed-file "linux-modules" build-exp))
 
 (define* (raw-initrd file-systems




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 01:56:01 +0000
Resent-Message-ID: <handler.30604.B30604.152012851221540 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152012851221540
          (code B ref 30604); Sun, 04 Mar 2018 01:56:01 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 01:55:12 +0000
Received: from localhost ([127.0.0.1]:43392 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esIrn-0005bM-Vj
	for submit <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:55:12 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:42018)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esIrj-0005bB-Ov
 for 30604 <at> debbugs.gnu.org; Sat, 03 Mar 2018 20:55:08 -0500
Received: from localhost (77.118.252.91.wireless.dyn.drei.com [77.118.252.91])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 5E7C533602D9;
 Sun,  4 Mar 2018 02:55:06 +0100 (CET)
Date: Sun, 4 Mar 2018 02:54:54 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180304025454.791a2b87@HIDDEN>
In-Reply-To: <87sh9g4vy1.fsf@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/Bu7nXlkPzNj2tBNhO1bISAs"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/Bu7nXlkPzNj2tBNhO1bISAs
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

Ah, your attached patch is fine, just the proposed usage=20

  (for-each (catch-ENOENT load-linux-module*)
                          ^^^^^^^^^^^^^^^^^^
            (needed-modules
             (known-module-aliases (string-append linux-module-directory
                                                  "/modules.alias"))))

is probably not working.

--Sig_/Bu7nXlkPzNj2tBNhO1bISAs
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqbUe8ACgkQ5xo1VCww
uqXHyAf/ZSamYfxnytp+YzqCZ3ZmoZ/6vD+5H176T5CuMtS7ZtfrkFe4d/lvjB3R
QfAd5rBRzuJ5jO0Or75iGgUleXGO191Rqt/r/AoSeOCur+T3VUAOSrv689F9l/bU
bAOdnOJqNarX7oBrrqmySg0MINUdjaCpWW7B+HSCTuG81fSJl2vdJnUZvPjs25Zn
A+wLozvtzps+wOOrbiQNFspCvwTecMccsUbG+s022c/Ssr/hHxwE43SdUzApR1YZ
F3ugEM1G60KgfXgjTFS9DOKIMLVbfvTZy7J+cbbc9GTrbPhoLFEieUQj+MyjTMb6
oCT+/VZANgBc4YzfoMHEi3Pp1uGg6Q==
=54nz
-----END PGP SIGNATURE-----

--Sig_/Bu7nXlkPzNj2tBNhO1bISAs--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 12:35:01 +0000
Resent-Message-ID: <handler.30604.B30604.152016689722315 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152016689722315
          (code B ref 30604); Sun, 04 Mar 2018 12:35:01 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 12:34:57 +0000
Received: from localhost ([127.0.0.1]:43516 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esSqv-0005nq-KX
	for submit <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:34:57 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:35974)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esSqs-0005nh-VM
 for 30604 <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:34:55 -0500
Received: from localhost (77.118.231.171.wireless.dyn.drei.com
 [77.118.231.171])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id D0C543367616;
 Sun,  4 Mar 2018 13:34:52 +0100 (CET)
Date: Sun, 4 Mar 2018 13:34:44 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180304133444.4edceecd@HIDDEN>
In-Reply-To: <87sh9g4vy1.fsf@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/war/2NgU7F4a1M/YUNS3K5e"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/war/2NgU7F4a1M/YUNS3K5e
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

I've been thinking about it some more - I think it can be made to work "you=
r" way.

I'm trying to integrate it right now.

But!  The module-aliases->module-file-names way I've been pursuing (which a=
lso
returns the recursive dependencies) has the advantage of using exactly the =
same
procedure for both flat-linux-module-directory (which copies files) and for
our modprobe (which loads them later).

This means that it's very likely these two will match.

But if load-linux-module* recursively loads modules on its own it's easily
possible that these will diverge - what flat-linux-module-directory is doing
could (accidentially) differ in the future.

Maybe that's overly defensive programming.  What do you think?

My flat-linux-module-directory basically just returns a subset of the direc=
tory
tree it gets as parameter (and flattens it for no reason).

Also, I've been trying to use find-files for /sys before, like you do.
It doesn't work correctly - probably because of the mutation that modprobe =
does
(find-files sorts - not sure whether that's the whole story).

Integration tests just finished - even the basic system test fails because =
of it
now.

I tried only this:

   (define (load-kernel-modules)
     "Examine /sys/devices to find out which modules to load and load them."
-    (define enter?
-      (const #t))
-    (define (down! directory stat result)
-     ;; Note: modprobe mutates the tree starting with DIRECTORY.
-     (let ((modalias-name (string-append directory "/modalias")))
-       (if (file-exists? modalias-name)
-           (let ((modalias
-                 (string-trim-right (call-with-input-file modalias-name
-                                                          read-string)
-                                    #\newline)))
-             (system* "/sbin/modprobe" "-q" "--" modalias))))
-       #t)
-    (define up
-      (const #t))
-    (define skip
-      (const #t))
-    (define leaf
-      (const #t))
-    (define (error name stat errno result)
-      (format (current-error-port) "warning: ~a: ~a~%"
-              name (strerror errno))
-      result)
-    (file-system-fold enter? leaf down! up skip error #t "/sys/devices"))
+    (for-each (lambda (modalias)
+                (system* "/sbin/modprobe" "-q" "--" modalias))
+              (system-device-aliases)))

Doesn't work anymore...

ERROR: In procedure network-interface-flags:
In procedure network-interface-flags: No such device

(I've exported system-device-aliases)

--Sig_/war/2NgU7F4a1M/YUNS3K5e
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqb5+QACgkQ5xo1VCww
uqXJ9wf/UFzvHkvHtXvKpynbANSL48kLwGHYSKetR6r353nTtySJZV0kVrRf6aEk
eLZnfbjOFX1Y7cQYKPgiC4/lg5JbqxWkWNR0R1zNQvUgXByL8hxfkuZYtwWE7z5G
Buw/dZBJNdRcG8ZlaOw6r88bhD3CtnceI+XhcqH6sOGud2Bef3cn8HO2gLeA5vi9
DOmeXM1wlP45eYxZ+FNKRJ7WXQwsnGo3WTwowpttZQdA0p80BKmjy+7Jv2DOW3D9
z8lfZ/yHeOQkW1PE7vi0TsjTKy1ryFSBfI37MMcOfmFgenkMKG4K/+c9rMUPltGi
0rBPw7P1HKqxQAXWYaISS3MpQRrvpQ==
=uxOr
-----END PGP SIGNATURE-----

--Sig_/war/2NgU7F4a1M/YUNS3K5e--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 2/7] linux-modules: Add install-modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 12:46:01 +0000
Resent-Message-ID: <handler.30604.B30604.152016751323251 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152016751323251
          (code B ref 30604); Sun, 04 Mar 2018 12:46:01 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 12:45:13 +0000
Received: from localhost ([127.0.0.1]:43520 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esT0r-00062x-LN
	for submit <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:45:13 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:36744)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esT0q-00062p-8C
 for 30604 <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:45:12 -0500
Received: from localhost (77.118.231.171.wireless.dyn.drei.com
 [77.118.231.171])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 2D4963367616;
 Sun,  4 Mar 2018 13:45:11 +0100 (CET)
Date: Sun, 4 Mar 2018 13:45:04 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180304134504.0a15b26d@HIDDEN>
In-Reply-To: <87y3j84xtu.fsf@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-3-dannym@HIDDEN>
 <87y3j84xtu.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/4j2QMexvE7dYMZ.hPX8mPXg"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/4j2QMexvE7dYMZ.hPX8mPXg
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

>   (write-module-alias-database modules port)  ;for =E2=80=9Cmodules.alias=
=E2=80=9D
>   (write-module-device-database modules port) ;for =E2=80=9Cmodules.devna=
me=E2=80=9D

I'd prefer "install-" because their interface is somewhat like install-file
(caller provides output directory and callee adds "modules."* automatically=
).

But I used the names "write-module-"* in the patchset v9.

> I=E2=80=99m not sure we need =E2=80=98install-module-files=E2=80=99 itsel=
f.  Perhaps we can
> inline it at the call site?

Sure.  Did so now.

> For the devname code, please avoid =E2=80=98set!=E2=80=99.

I found an even better way to avoid both.

> The indentation of =E2=80=98match=E2=80=99 forms is wrong.  Would it be O=
K for you to
> pass it through ./etc/indent-code.el?  (It=E2=80=99s non interactive, you=
 don=E2=80=99t
> need to actually use Emacs.)

I'm actually trying to switch to emacs but when I press Tab it messes up
the stuff more.  Is there some kind of configuration for guile indentation?

Also, every time I open gnu/build/linux-modules.scm I get

"The local variables list .. may not be safe

* bug-reference-bug-repexp
* eval: (modify-syntax-entry 126 "'")
* eval: (modify-syntax-entry 36 "'")
* eval: (modify-syntax-entry 43 "'")"

???

--Sig_/4j2QMexvE7dYMZ.hPX8mPXg
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqb6lAACgkQ5xo1VCww
uqVseAf/VW2PLCgcY8nImiTi4YlI/BODnYJVCkVIzmA5x/hS3+5OxKXh1LnUjECD
p50Bhz9u8i6v3P6PFKYa7Om3aowsyKOH9E2nochuk8tGKkbBWTPA6ou2TZcJBE2G
SjswuTE7nUBBIjg8vEEzZ9ufF536jDzrzzsyFaVTHlfCHr/eTJ29fg9fR0wMPGgB
PVHZKSI5J0zrZycmSlO8+I1m/NQGzvUMDE2V01DGGIhbLQhcOSy/YL8hCYwbBF+G
lMznbEgw+ZjvoZCeRJfooZeuRU/myeAbJ1mAVUlTeDLLdZzFKOTqTyRR/e7B9jUT
hCsEiOUOX4Pino5+64dzLsfv16jBcg==
=wMFl
-----END PGP SIGNATURE-----

--Sig_/4j2QMexvE7dYMZ.hPX8mPXg--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 2/7] linux-modules: Add install-modules.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 04 Mar 2018 12:54:02 +0000
Resent-Message-ID: <handler.30604.B30604.152016801524019 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152016801524019
          (code B ref 30604); Sun, 04 Mar 2018 12:54:02 +0000
Received: (at 30604) by debbugs.gnu.org; 4 Mar 2018 12:53:35 +0000
Received: from localhost ([127.0.0.1]:43529 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1esT8w-0006FL-RR
	for submit <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:53:35 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:37396)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1esT8v-0006FD-52
 for 30604 <at> debbugs.gnu.org; Sun, 04 Mar 2018 07:53:33 -0500
Received: from localhost (77.118.231.171.wireless.dyn.drei.com
 [77.118.231.171])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 8A0403367616;
 Sun,  4 Mar 2018 13:53:31 +0100 (CET)
Date: Sun, 4 Mar 2018 13:53:27 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180304135327.0a103e57@HIDDEN>
In-Reply-To: <87y3j84xtu.fsf@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-3-dannym@HIDDEN>
 <87y3j84xtu.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/s3HhKKL0oZ8Y2bY0RkrWxz1"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/s3HhKKL0oZ8Y2bY0RkrWxz1
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

On Sat, 03 Mar 2018 23:07:57 +0100
ludo@HIDDEN (Ludovic Court=C3=A8s) wrote:

> We could reuse modules.alias and modules.devname from the =E2=80=98linux-=
libre=E2=80=99
> package (right?), but I guess it doesn=E2=80=99t hurt to generate custom =
ones.

Yes, but it would be somewhat dirty.  Here's why:

Linux-libre contains a superset of modules and also their modules.alias
and modules.devname contain a superset of modules compared to the initrd.

That means

(1) modules.alias would contain aliases which map to modules which
don't exist.  Since we don't for-each it, who cares.

(2) modules.devname would contain devnames for modules which don't
exist.  That means the boot code would create files in /dev which,
when someone accesses them, would try to load modules which don't
exist - and then the access would fail.

Technically both are not bad, but (2) is bad "UX" practise nowadays - and
not done in the Linux world any more since udev exists.

I can still remember the days of 8540 entries static /dev filesystem (as in,
really on the hard disk), 7000 of which didn't work (or even valid for this
system type :P).

If something goes wrong, good luck finding the needle in the haystack
(which /dev file you can use to boot).

--Sig_/s3HhKKL0oZ8Y2bY0RkrWxz1
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqb7EcACgkQ5xo1VCww
uqXPwAf+P1CjrHIU4Ewpz6ucWfrmOOxqL3oR5zvmf1xtQGitXspjCtfP7OQhEok4
NS43aa4Rcurf32znHZvciYwiTIvkziXGJS3aMh7RbbJc2M8VG13gYTLYr9+YRs28
GSGLIFlHKAjozMeyOHOv9zzpMVgTH0zVE0B1dlV+0ttGUxSXu00v9QX4aoWTh97p
p7HNT/yHvdhfYFUJDjiEk63eSvSkLyvWMxqChGU2iTOv3EDCRFREzKMYWHGBfjpu
5wQRUW5uivoX116X0iA2ipwJ6mb8C31yqInEVAFxt6GFzP5+AmwIrdVrGfG4N/we
NkQd9yJol2LXAPV4qI8pfU6h7aFkPQ==
=P/RW
-----END PGP SIGNATURE-----

--Sig_/s3HhKKL0oZ8Y2bY0RkrWxz1--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 09 Mar 2018 22:07:02 +0000
Resent-Message-ID: <handler.30604.B30604.152063321811141 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152063321811141
          (code B ref 30604); Fri, 09 Mar 2018 22:07:02 +0000
Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:06:58 +0000
Received: from localhost ([127.0.0.1]:52871 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1euQAD-0002tc-Nl
	for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:06:57 -0500
Received: from hera.aquilenet.fr ([185.233.100.1]:33794)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1euQAA-0002tT-Ed
 for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:06:56 -0500
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 790CD10FBA;
 Fri,  9 Mar 2018 23:06:53 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id VAI4MblhOCdW; Fri,  9 Mar 2018 23:06:52 +0100 (CET)
Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id ACD49FFCA;
 Fri,  9 Mar 2018 23:06:51 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN>
Date: Fri, 09 Mar 2018 23:06:50 +0100
In-Reply-To: <20180304133444.4edceecd@HIDDEN> (Danny Milosavljevic's
 message of "Sun, 4 Mar 2018 13:34:44 +0100")
Message-ID: <87muzgykcl.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Hello!

I=E2=80=99ve reworked this patch series a bit, but now I=E2=80=99m stuck on=
 this:

Danny Milosavljevic <dannym@HIDDEN> skribis:

> ERROR: In procedure network-interface-flags:
> In procedure network-interface-flags: No such device

When than happens, our modprobe gets called with the =E2=80=9Cnetdev-eth0=
=E2=80=9D
alias, which it cannot handle, leading to this error.

By explicitly loading =E2=80=9Cvirtio_net=E2=80=9D and sleeping a bit, we g=
et past that
point, but fail later on:

--8<---------------cut here---------------start------------->8---
loading '/gnu/store/n2zvdxp25kvg7wy5xr1y5n9r4502fw80-linux-vm-loader'...
environment variable `PATH' set to `/gnu/store/vxl918zb9brnrgaipzsykpy3mzca=
fvcr-qemu-minimal-2.11.1/bin:/gnu/store/lvkaf3xlvy57bvap51xlzb209ilbkgcv-pa=
rted-3.2/sbin:/gnu/store/nm305rpb2mvridkyj4l3636nc9ql4lf9-e2fsprogs-1.43.6/=
bin:/gnu/store/nm305rpb2mvridkyj4l3636nc9ql4lf9-e2fsprogs-1.43.6/sbin:/gnu/=
store/0sq2nflm42x0znkv44add0gk82khkcb6-dosfstools-4.1/sbin:/gnu/store/0hl51=
3mnpkhszm2hjai2w9cxmpxs0vgq-sed-4.4/bin:/gnu/store/1h44pkgdd7n6s3i2vjh54aws=
vfmc219j-grep-3.1/bin:/gnu/store/kgzvfby2ggi1xawsh5vjh4s93qk2dp9k-coreutils=
-8.28/bin:/gnu/store/k7r2m2wgj8x8jjhccwjsiimp0dlzxb7i-findutils-4.6.0/bin:/=
gnu/store/ahxc89r6npzf2bbl8yg5vdjicskzzjf3-gawk-4.1.4/bin'
creating partition table with 2 partitions (20.0 MiB, 40.0 MiB)...
Warning: The resulting partition is not properly aligned for best performan=
ce.
creating ext4 partition...
mke2fs 1.43.6 (29-Aug-2017)
ext2fs_check_if_mount: Can't check if filesystem is mounted due to missing =
mtab file while determining whether /dev/vda1 is mounted.
Creating filesystem with 20480 1k blocks and 5136 inodes
Filesystem UUID: 81a538e9-3efe-406b-bf67-fa153fa3c6a6
Superblock backups stored on blocks:=20
	8193

Allocating group tables: done=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20=20
Writing inode tables: done=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=
=20=20=20=20=20=20=20=20=20=20=20=20
Creating journal (1024 blocks): done
Writing superblocks and filesystem accounting information: done

[    3.190801] EXT4-fs (vda1): mounted filesystem with ordered data mode. O=
pts: (null)
populating...
clearing file timestamps...
creating FAT partition...
mkfs.fat 4.1 (2017-01-24)
[    3.235493] FAT-fs (vda2): IO charset iso8859-1 not found
ERROR: In procedure mount:
In procedure mount: Invalid argument
--8<---------------cut here---------------end--------------->8---

Here the nls_iso8859-1 module doesn=E2=80=99t get loaded and modprobe isn=
=E2=80=99t even
invoked, although my understanding is that it should (per =E2=80=98load_nls=
=E2=80=99 in
nls_base.c in the kernel, called from vfat/inode.c).

Similarly, it seems that virtio_blk has to be loaded explicitly: is not
reported by =E2=80=98needed-modules=E2=80=99 (i.e., not listed in /sys/=E2=
=80=A6/modalias), nor
do we get a modprobe query for it.

All in all on-demand loading seems more complicated that it seemed.

What are we missing here?

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 09 Mar 2018 22:14:02 +0000
Resent-Message-ID: <handler.30604.B30604.152063362611791 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152063362611791
          (code B ref 30604); Fri, 09 Mar 2018 22:14:02 +0000
Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:13:46 +0000
Received: from localhost ([127.0.0.1]:52876 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1euQGo-000345-Iu
	for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:13:46 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:49634)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1euQGm-00033w-QN
 for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:13:45 -0500
Received: from localhost (178.113.255.63.wireless.dyn.drei.com
 [178.113.255.63])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 2268033600C4;
 Fri,  9 Mar 2018 23:13:43 +0100 (CET)
Date: Fri, 9 Mar 2018 23:13:20 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180309231320.20a02822@HIDDEN>
In-Reply-To: <87muzgykcl.fsf@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN>
 <87muzgykcl.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/GnqWfEzZKnoi.SFxFgthD/Z"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/GnqWfEzZKnoi.SFxFgthD/Z
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

On Fri, 09 Mar 2018 23:06:50 +0100
ludo@HIDDEN (Ludovic Court=C3=A8s) wrote:

> When than happens, our modprobe gets called with the =E2=80=9Cnetdev-eth0=
=E2=80=9D
> alias, which it cannot handle, leading to this error.
>=20
> By explicitly loading =E2=80=9Cvirtio_net=E2=80=9D and


> sleeping a bit,=20

Uhhhhh no please don't.

> point, but fail later on:
...
> --8<---------------cut here---------------end--------------->8---
>=20
> Here the nls_iso8859-1 module doesn=E2=80=99t get loaded and modprobe isn=
=E2=80=99t even
> invoked, although my understanding is that it should (per =E2=80=98load_n=
ls=E2=80=99 in
> nls_base.c in the kernel, called from vfat/inode.c).
>=20
> Similarly, it seems that virtio_blk has to be loaded explicitly: is not
> reported by =E2=80=98needed-modules=E2=80=99 (i.e., not listed in /sys/=
=E2=80=A6/modalias), nor
> do we get a modprobe query for it.
>=20
> All in all on-demand loading seems more complicated that it seemed.
>=20
> What are we missing here?

As I said, modprobe mutates /sys - you cannot use find-files.  I haven't us=
ed
ftw just to be contrarian.  There's even a warning comment :-)

In order to find that out, try to print how /sys looked before modprobe - t=
hen
in the early guile recovery REPL print how /sys looks again - the alias it
was juuust complaining about will be there just fine.

My patch series works fine lazy-loading the IO charset, virtio_blk, virtio_=
net.

It took about 30 h to work out the correct minimal combination - just sayin=
g :-)

--Sig_/GnqWfEzZKnoi.SFxFgthD/Z
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjBwAACgkQ5xo1VCww
uqV8/Qf+J555Zoy+CZAq38ezF4hHwS5YbLy//BfK3/3lu2RwSu4h53vmvUqcFZrl
vk+Y1Q7b7SJUmzUKCj/doQ+VgjJgpWlBia0PM0H0kNdKYrz4qbCH3KMDmyKKxlUS
m0uMD7xiSef1evuBRttunzQIwv6zCUJn8kqyalkFQZ01lDXv7Mex0vpG/QkTTVJZ
aTregruimbDWlMnNfUfN9aq5tKlvZfBrzysXGVpZDZlbZrUBkGkd4R8Skq4WdAwv
OQcLkclyTwJOzEO7+ZCkw1b2uzKilS0K6kdoSAylcaXkc9wqjaV1feE9HrQkUHb3
OTPBJQScuFZ7VApDRwn6xCL/DfTvhg==
=uf4c
-----END PGP SIGNATURE-----

--Sig_/GnqWfEzZKnoi.SFxFgthD/Z--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 09 Mar 2018 22:20:01 +0000
Resent-Message-ID: <handler.30604.B30604.152063398912461 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152063398912461
          (code B ref 30604); Fri, 09 Mar 2018 22:20:01 +0000
Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:19:49 +0000
Received: from localhost ([127.0.0.1]:52891 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1euQMf-0003Eu-1p
	for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:19:49 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:50178)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1euQMd-0003En-TO
 for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:19:48 -0500
Received: from localhost (178.113.255.63.wireless.dyn.drei.com
 [178.113.255.63])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 8735133600C4;
 Fri,  9 Mar 2018 23:19:46 +0100 (CET)
Date: Fri, 9 Mar 2018 23:19:42 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180309231942.023f6655@HIDDEN>
In-Reply-To: <20180309231320.20a02822@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN>
 <87muzgykcl.fsf@HIDDEN> <20180309231320.20a02822@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/GgwLbqb0fXVNFjmMJIU7Cyj"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/GgwLbqb0fXVNFjmMJIU7Cyj
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

oops,

On Fri, 9 Mar 2018 23:13:20 +0100
Danny Milosavljevic <dannym@HIDDEN> wrote:

> As I said, modprobe mutates /sys - you cannot use find-files. =20

I guess technically it's the Linux kernel module that mutates it.

>I haven't used
> ftw just to be contrarian.  There's even a warning comment :-)
>=20
> In order to find that out, try to print how /sys looked before modprobe -=
 then
> in the early guile recovery REPL print how /sys looks again - the alias it
> was juuust complaining about will be there just fine.
>=20
> My patch series works fine lazy-loading the IO charset, virtio_blk, virti=
o_net.

(v9)

--Sig_/GgwLbqb0fXVNFjmMJIU7Cyj
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjCH4ACgkQ5xo1VCww
uqWLvwgAp6KezsUDCUjxB5czeSEyKuSBRy6gciJgiTDnedaerVSA4+yHafKUUKe1
1JY9TK5I6qJbSnkaBXFK1ajrYEcz69jODXPRbv7NS0NtK+PrJBpIeXXqpVfYhsll
KO2CKDWrZ9A7CXLURtSsRrf8vzhkuccoJs8xQnqqoUPYt6FTRYFm9G6XukWY5Wop
5nXX2it0JYFN2M47Eb99uMy3khSanLUY7iC6Ib9vMxBURVURXXFkteb4FRbYC24c
6P2SxkabRhOkc1SrWOXLaUvLl5FKozFO82elcohJCol4s/osEodG9vS8KNTFD0Ej
XkVhv/a5u7/+i/iqoyuXj4KEU9054A==
=ixMQ
-----END PGP SIGNATURE-----

--Sig_/GgwLbqb0fXVNFjmMJIU7Cyj--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 7/7] linux-initrd: Use module-aliases->module-file-names, too.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 09 Mar 2018 22:27:01 +0000
Resent-Message-ID: <handler.30604.B30604.152063441713210 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152063441713210
          (code B ref 30604); Fri, 09 Mar 2018 22:27:01 +0000
Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:26:57 +0000
Received: from localhost ([127.0.0.1]:52901 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1euQTY-0003R0-PE
	for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:26:56 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:50772)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1euQTX-0003Qs-AL
 for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:26:55 -0500
Received: from localhost (178.113.255.63.wireless.dyn.drei.com
 [178.113.255.63])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 26D5D33600C4
 for <30604 <at> debbugs.gnu.org>; Fri,  9 Mar 2018 23:26:54 +0100 (CET)
Date: Fri, 9 Mar 2018 23:26:50 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180309232650.0f37fb89@HIDDEN>
In-Reply-To: <20180304010914.1322-8-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
 <20180304010914.1322-8-dannym@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/Qg9Kzc.tiVe2MTnqVgF7R4i"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/Qg9Kzc.tiVe2MTnqVgF7R4i
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

On Sun,  4 Mar 2018 02:09:14 +0100
Danny Milosavljevic <dannym@HIDDEN> wrote:

> --- a/gnu/system/linux-initrd.scm
> +++ b/gnu/system/linux-initrd.scm
> @@ -161,17 +161,17 @@ the derivations referenced by EXP are automatically=
 copied to the initrd."
>                      #:references-graphs `(("init-closure" ,init)
>                                            ("modprobe-closure" ,modprobe)=
)))
> =20
> -(define (flat-linux-module-directory linux modules)
> -  "Return a flat directory containing the Linux kernel modules listed in
> -MODULES and taken from LINUX."
> +(define (flat-linux-module-directory linux aliases)
> +  "Return a flat directory containing the Linux kernel modules resolved =
by
> +ALIASES and taken from LINUX."
...
> +          (define (find-only-entry directory)
> +            (match (scandir directory)
> +             (("." ".." basename)
> +              (string-append directory "/" basename))))

Probably unsafe since the order is not guaranteed.

--Sig_/Qg9Kzc.tiVe2MTnqVgF7R4i
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjCioACgkQ5xo1VCww
uqXOZQgAkZgLnU86tFzMFoHikvaAZ41DEtYdjK+787F90a0+RSvTIMDMpFXvL40K
LjRBRv3k7Im8o/gw4v0h0Jx9DhfwKmL7zXOOFkaK4urXx80Gfp49kozLeAUJWutP
LRt3kn4hqw8PQzT/nDW46jH9GnNUyCAk2sANoQQWOdk+LpBc1EHs4Z571y6rQDb8
i6x9Ui3CNvDHYXjWsRDRS1+EIZaKTNpeTbD9/iyZOLltD6CXR37/6vgPyKP/kqE9
RHtHdwyrl6MVfPuomee2iiqC5z1HT+EXWjevXXVkIvP1azIGwM2mWxpJLynDO5Ld
0KYbk0UMDZ3/HFCSbcoODoMwvFeNEA==
=PIV0
-----END PGP SIGNATURE-----

--Sig_/Qg9Kzc.tiVe2MTnqVgF7R4i--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 09 Mar 2018 22:37:01 +0000
Resent-Message-ID: <handler.30604.B30604.152063501021691 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152063501021691
          (code B ref 30604); Fri, 09 Mar 2018 22:37:01 +0000
Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:36:50 +0000
Received: from localhost ([127.0.0.1]:52905 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1euQd7-0005dm-O1
	for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:36:49 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:51540)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1euQd6-0005de-FG
 for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:36:48 -0500
Received: from localhost (178.113.255.63.wireless.dyn.drei.com
 [178.113.255.63])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 352B933600C4;
 Fri,  9 Mar 2018 23:36:47 +0100 (CET)
Date: Fri, 9 Mar 2018 23:36:44 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180309233644.7dc53f8e@HIDDEN>
In-Reply-To: <87muzgykcl.fsf@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN>
 <87muzgykcl.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/Qcuacp5x8cg/Xqbkmau+X1e"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/Qcuacp5x8cg/Xqbkmau+X1e
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

> Similarly, it seems that virtio_blk has to be loaded explicitly: is not
> reported by =E2=80=98needed-modules=E2=80=99 (i.e., not listed in /sys/=
=E2=80=A6/modalias), nor
> do we get a modprobe query for it.

qemu seems to have a bug that it doesn't assign pci ids properly.

Patch v9 6/7 works around it by fixing the virtio-blk-pci address.

Nicer fixes welcome.

--Sig_/Qcuacp5x8cg/Xqbkmau+X1e
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjDHwACgkQ5xo1VCww
uqXulgf+OpolkwmELThupRx/W0t2WQJeFm+Ho+G6OdSRoHPG7pIg+Tcb24jtRVTD
87fYf2IRRJe2Vx+O0ASGZd1NfDjyVX+fXnhnvfPRFg9SB2zGRkoLSMuACEelx3Ir
v8qpPnm+CmqUlTBldzTwJ/TSNWHVGB1SH3W/tgGGK0yljFvHIfnPYssrgMT84tDo
+G1yVVtSxSU+5Y0DxkCjTeo4ZYkJ5fn/0lsL96iUSb4vJNlUqDJUo3ALJUa2aa5Z
dmw1zzum71yBzSH2QjPyqqEoxgo/apAA/rqZt1J0o0Yayd+ZETBtDjg0PdSxXl0n
d1cB0c6ejWpFsSxhcDRnjOmXC2Q5ig==
=4rsy
-----END PGP SIGNATURE-----

--Sig_/Qcuacp5x8cg/Xqbkmau+X1e--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 09 Mar 2018 22:45:02 +0000
Resent-Message-ID: <handler.30604.B30604.152063548122526 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152063548122526
          (code B ref 30604); Fri, 09 Mar 2018 22:45:02 +0000
Received: (at 30604) by debbugs.gnu.org; 9 Mar 2018 22:44:41 +0000
Received: from localhost ([127.0.0.1]:52918 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1euQkj-0005rG-5v
	for submit <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:44:41 -0500
Received: from dd26836.kasserver.com ([85.13.145.193]:52212)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1euQkh-0005r8-5N
 for 30604 <at> debbugs.gnu.org; Fri, 09 Mar 2018 17:44:39 -0500
Received: from localhost (178.113.255.63.wireless.dyn.drei.com
 [178.113.255.63])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 1329B3360156;
 Fri,  9 Mar 2018 23:44:37 +0100 (CET)
Date: Fri, 9 Mar 2018 23:44:34 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180309234434.2bf5e3ff@HIDDEN>
In-Reply-To: <20180309231320.20a02822@HIDDEN>
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN>
 <87muzgykcl.fsf@HIDDEN> <20180309231320.20a02822@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/ZpJsqZ5m19SZZ_H8+EhNO.v"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/ZpJsqZ5m19SZZ_H8+EhNO.v
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

sorry for the many e-mails - I'm recollecting all the workarounds :)

>--8<---------------cut here---------------start------------->8---
>loading '/gnu/store/n2zvdxp25kvg7wy5xr1y5n9r4502fw80-linux-vm-loader'...
>environment variable `PATH' set to `/gnu/store/vxl918zb9brnrgaipzsykpy3mzc=
afvcr-qemu-minimal-2.11.1/bin:/gnu/store/lvkaf3xlvy57bvap51xlzb209ilbkgcv-p=
arted-3.2/sbin:/>gnu/store/nm305rpb2mvridkyj4l3636nc9ql4lf9-e2fsprogs-1.43.=
6/bin:/gnu/store/nm305rpb2mvridkyj4l3636nc9ql4lf9-e2fsprogs-1.43.6/sbin:/gn=
u/>store/0sq2nflm42x0znkv44add0gk82khkcb6-dosfstools-4.1/sbin:/gnu/store/0h=
l513mnpkhszm2hjai2w9cxmpxs0vgq-sed-4.4/bin:/gnu/store/1h44pkgdd7n6s3i2vjh54=
awsvfmc219j->grep-3.1/bin:/gnu/store/kgzvfby2ggi1xawsh5vjh4s93qk2dp9k-coreu=
tils-8.28/bin:/gnu/store/k7r2m2wgj8x8jjhccwjsiimp0dlzxb7i-findutils-4.6.0/b=
in:/gnu/store/>ahxc89r6npzf2bbl8yg5vdjicskzzjf3-gawk-4.1.4/bin'
>creating partition table with 2 partitions (20.0 MiB, 40.0 MiB)...
>Warning: The resulting partition is not properly aligned for best performa=
nce.
>creating ext4 partition...
...
[    3.235493] FAT-fs (vda2): IO charset iso8859-1 not found
ERROR: In procedure mount:
In procedure mount: Invalid argument
--8<---------------cut here---------------end--------------->8---

>Here the nls_iso8859-1 module doesn=E2=80=99t get loaded and modprobe isn=
=E2=80=99t even
>invoked, although my understanding is that it should (per =E2=80=98load_nl=
s=E2=80=99 in
>nls_base.c in the kernel, called from vfat/inode.c).

Yeah, that was an evil problem.  There are two different ways linux-boot
can boot:
* Either it loads a full system in which case /run/booted-system will
contain kernel module files which can and will be loaded
* Or it loads a "--load" file only - in which case there's no system
modprobe, but switch-root just switched our pure-Guile modprobe away,
so now we are out of modprobes :)


--Sig_/ZpJsqZ5m19SZZ_H8+EhNO.v
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqjDlIACgkQ5xo1VCww
uqWZ7Qf+N2/hBERWip1Lvyq6ZzPc425T5v1Jrkahu3TEoHiSJd6IxXG4A/OzqR0h
CehvMgm1sIznAECajIe/4X9UFTi42yOWJZB5aauCVn11kkllTbiEJbbtkhNnScQZ
FNCdyFF8Jese+aUXTpWxY0TucI6xvLwgvU6UYrRHOgND5Ug+G5ilWYTca8sFHena
InbXiYP4GNOGKcPltMn/i05TMOHcnHHUg67jta8VnqEROxHFWwukWtujGxrPu548
Rgcr/o5Lu9EjKGn1zFi+WR4W1Jh2sExFh9hvdHHeox3gAfq+tivXd7vZBYnQNJ88
6v6YlrVDX9OZ7H6eCrmZmxaK1yc9Iw==
=sXjo
-----END PGP SIGNATURE-----

--Sig_/ZpJsqZ5m19SZZ_H8+EhNO.v--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 3/7] linux-initrd: Provide pure-Guile modprobe.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 11 Mar 2018 20:25:01 +0000
Resent-Message-ID: <handler.30604.B30604.152079988222262 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152079988222262
          (code B ref 30604); Sun, 11 Mar 2018 20:25:01 +0000
Received: (at 30604) by debbugs.gnu.org; 11 Mar 2018 20:24:42 +0000
Received: from localhost ([127.0.0.1]:55716 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ev7WM-0005n0-KT
	for submit <at> debbugs.gnu.org; Sun, 11 Mar 2018 16:24:42 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:35408)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ev7WL-0005mp-0p
 for 30604 <at> debbugs.gnu.org; Sun, 11 Mar 2018 16:24:41 -0400
Received: from localhost (178.113.255.63.wireless.dyn.drei.com
 [178.113.255.63])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 2F48B3360C78
 for <30604 <at> debbugs.gnu.org>; Sun, 11 Mar 2018 21:24:39 +0100 (CET)
Date: Sun, 11 Mar 2018 21:24:30 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180311212430.707ef0ea@HIDDEN>
In-Reply-To: <20180304010914.1322-4-dannym@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
 <20180304010914.1322-4-dannym@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/Cey6o_VYT6PJ=veW8WEpofZ"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/Cey6o_VYT6PJ=veW8WEpofZ
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

> +          (define option-spec
> +           '((quiet    (single-char #\q) (value #f))))

Would make sense to also support "-a" (used when invoking modprobe to load =
multiple
kernel modules at once).

--Sig_/Cey6o_VYT6PJ=veW8WEpofZ
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqlkH4ACgkQ5xo1VCww
uqWFsggAiePy7PVn0EvxcvzawT0U/UuWoHTaiMJZDwj5nSBhWHpNLnMGfYe2emd4
q10BZdapDN4FI+4iwRdene+8NbH2y4rsUpM1VMKG12Iq+hNE2v/D1hiBMFgozX1b
jPbvb1NIZXZDT+iHwo2no1fvylSySl4SjE+b68RQpeieKyodums5B9Dg1H7aavcU
B/qo0pkotTl11ChmZ0wAgj3HyZfGndP1b6BBTsUvz1fKFvcYTaH0tryh9oK2Ug1h
lpRdSRtugfCb2BQ9ajzC937gXUTzZ8gNMF8nQm76HPe/WeB+DkXUhMPic1pndz8h
JHTXjkmP8NUywJjnGkmi0N0sruquoA==
=hAM5
-----END PGP SIGNATURE-----

--Sig_/Cey6o_VYT6PJ=veW8WEpofZ--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v8 3/7] linux-boot: Load kernel modules only when the hardware is present.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 12:39:01 +0000
Resent-Message-ID: <handler.30604.B30604.152085833711330 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152085833711330
          (code B ref 30604); Mon, 12 Mar 2018 12:39:01 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:38:57 +0000
Received: from localhost ([127.0.0.1]:56069 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evMjA-0002wg-MJ
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:38:56 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:50622)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evMj8-0002wV-Et
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:38:55 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 60BE812382;
 Mon, 12 Mar 2018 13:38:53 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id g2xEDFGgJYeT; Mon, 12 Mar 2018 13:38:51 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 8A5E211CC1;
 Mon, 12 Mar 2018 13:38:51 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <20180302153408.14091-1-dannym@HIDDEN>
 <20180303135533.6112-1-dannym@HIDDEN>
 <20180303135533.6112-4-dannym@HIDDEN>
 <87sh9g4vy1.fsf@HIDDEN> <20180304133444.4edceecd@HIDDEN>
 <87muzgykcl.fsf@HIDDEN> <20180309231320.20a02822@HIDDEN>
Date: Mon, 12 Mar 2018 13:38:51 +0100
In-Reply-To: <20180309231320.20a02822@HIDDEN> (Danny Milosavljevic's
 message of "Fri, 9 Mar 2018 23:13:20 +0100")
Message-ID: <87ina1qxic.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Heya Danny,

Danny Milosavljevic <dannym@HIDDEN> skribis:

> As I said, modprobe mutates /sys - you cannot use find-files.  I haven't =
used
> ftw just to be contrarian.  There's even a warning comment :-)

I did see this comment, and I don=E2=80=99t doubt you=E2=80=99re acting in =
good faith!

> In order to find that out, try to print how /sys looked before modprobe -=
 then
> in the early guile recovery REPL print how /sys looks again - the alias it
> was juuust complaining about will be there just fine.

It wasn=E2=80=99t clear to me what =E2=80=9Cmodprobe mutates /sys=E2=80=9D =
meant, and I guess I
didn=E2=80=99t think it could lead to not seeing relevant =E2=80=9Cmodalias=
=E2=80=9D files.  Now
I=E2=80=99ve experienced first-hand that it does matter.  :-)

> It took about 30 h to work out the correct minimal combination - just say=
ing :-)

Yeah I can imagine (and it would have taken me much longer I guess.)

While reviewing this series I realized I didn=E2=80=99t understand everythi=
ng,
as in the example above, some things seemed unnecessary, and I thought
we could improve the style of a few things.

The patches that follow build upon your work with a few changes:

  =E2=80=A2 The =E2=80=9Cmodules.alias=E2=80=9D writer style is made more i=
diomatic and
    hopefully simpler.

  =E2=80=A2 The =E2=80=9Cmodules.devname=E2=80=9D writer is actually unnece=
ssary.  I changed it
    to a more functional style and with smaller functions.  It=E2=80=99s the
    last patch of this series; it=E2=80=99s completely optional since we do=
n=E2=80=99t
    use it currently, but we might want to keep it around for later.

  =E2=80=A2 The pure-Scheme modprobe uses SRFI-37 instead of (ice-9
    getopt-long), as in the rest of the code base.

  =E2=80=A2 /proc/sys/kernel/modprobe is set in =E2=80=98boot-system=E2=80=
=99 directly, so that
    we don=E2=80=99t have to special-case the =E2=80=9Cmodprobe=E2=80=9D cl=
osure in
    =E2=80=98build-initrd=E2=80=99.

  =E2=80=A2 =E2=80=98module-aliases->module-file-names=E2=80=99 is gone.  I=
nstead there=E2=80=99s
    =E2=80=98load-needed-linux-modules=E2=80=99, similar to the =E2=80=98lo=
ad-kernel-modules=E2=80=99
    you had, but a bit simpler.

  =E2=80=A2 I added comments here and there, especially about the
    virtio-blk-pci, which was far from obvious.  :-)

I didn=E2=80=99t add the =E2=80=98needed-modules=E2=80=99 and =E2=80=98syst=
em-device-aliases=E2=80=99 procedures
I posted earlier because we don=E2=80=99t need them currently.  If you think
they could be useful, we can always add them.

The following command succeeds:

  make check-system TESTS=3D"basic installed-os iso-image-installer"

WDYT?


I realize that makes for a not-so-efficient review process, though I
think the result is worth it.  I=E2=80=99m open to suggestions though.

Overall, these changes are mostly about (1) making self-contained
commits, (2) commenting code, and (3) coding style.  About #3, I think
the guidelines I applied were:

  1. Avoid imperative style.  When we do need side effects, try hard to
     move them separately.

  2. Keep functions short.

  3. Decompose functions in a way that allows them to be combined
     =E2=80=9Cnicely=E2=80=9D.

Some of that is a bit subjective, but overall we should be able to
converge.

Thanks for the great work, and sorry for the back-and-forth and delays!

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 1/6] linux-modules: Add "modules.alias" writer.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 12:40:01 +0000
Resent-Message-ID: <handler.30604.B30604.152085838511432 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152085838511432
          (code B ref 30604); Mon, 12 Mar 2018 12:40:01 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:45 +0000
Received: from localhost ([127.0.0.1]:56074 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evMjx-0002yK-1z
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:45 -0400
Received: from eggs.gnu.org ([208.118.235.92]:48099)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evMjv-0002y3-Nc
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:43 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evMjp-000637-K7
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:38 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56596)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evMjp-00062u-Fk; Mon, 12 Mar 2018 08:39:37 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evMjp-0003VE-0C; Mon, 12 Mar 2018 08:39:37 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 13:39:13 +0100
Message-Id: <20180312123918.22645-1-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <87ina1qxic.fsf@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

From: Danny Milosavljevic <dannym@HIDDEN>

* gnu/build/linux-modules.scm (write-module-alias-database): New
procedure.
(%not-dash): New variable.

Co-authored-by: Ludovic Courtès <ludo@HIDDEN>
---
 gnu/build/linux-modules.scm | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 4fe673cca..6101b8dc3 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2016, 2018 Ludovic Courtès <ludo@HIDDEN>
 ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@HIDDEN>
+;;; Copyright © 2018 Danny Milosavljevic <dannym@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +22,7 @@
   #:use-module (guix elf)
   #:use-module (guix glob)
   #:use-module (guix build syscalls)
+  #:use-module ((guix build utils) #:select (find-files))
   #:use-module (rnrs io ports)
   #:use-module (rnrs bytevectors)
   #:use-module (srfi srfi-1)
@@ -41,7 +43,8 @@
 
             device-module-aliases
             known-module-aliases
-            matching-modules))
+            matching-modules
+            write-module-alias-database))
 
 ;;; Commentary:
 ;;;
@@ -380,4 +383,25 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                       module)))
               known-aliases))
 
+(define %not-dash
+  (char-set-complement (char-set #\-)))
+
+(define (write-module-alias-database directory)
+  "Traverse the '.ko' files in DIRECTORY and create the corresponding
+'modules.alias' file."
+  (define aliases
+    (map (lambda (file)
+           (cons (file-name->module-name file) (module-aliases file)))
+         (find-files directory "\\.ko$")))
+
+  (call-with-output-file (string-append directory "/modules.alias")
+    (lambda (port)
+      (display "# Aliases extracted from modules themselves.\n" port)
+      (for-each (match-lambda
+                  ((module . aliases)
+                   (for-each (lambda (alias)
+                               (format port "alias ~a ~a\n" alias module))
+                             aliases)))
+                aliases))))
+
 ;;; linux-modules.scm ends here
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 2/6] linux-modules: Add 'load-linux-modules-from-directory'.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 12:40:02 +0000
Resent-Message-ID: <handler.30604.B30604.152085838711449 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152085838711449
          (code B ref 30604); Mon, 12 Mar 2018 12:40:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:47 +0000
Received: from localhost ([127.0.0.1]:56077 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evMjz-0002yb-B5
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:47 -0400
Received: from eggs.gnu.org ([208.118.235.92]:48138)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evMjy-0002y8-Qj
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:47 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evMjs-00069I-QV
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:41 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56597)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evMjq-00064l-Gi; Mon, 12 Mar 2018 08:39:38 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evMjq-0003VE-0n; Mon, 12 Mar 2018 08:39:38 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 13:39:14 +0100
Message-Id: <20180312123918.22645-2-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN>
 <20180312123918.22645-1-ludo@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

* gnu/build/linux-modules.scm (load-linux-modules-from-directory): New
procedure.
* gnu/build/linux-boot.scm (boot-system)[lookup-module]: Remove.
Use 'load-linux-modules-from-directory' instead.
---
 gnu/build/linux-boot.scm    |  9 ++-------
 gnu/build/linux-modules.scm | 12 ++++++++++++
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..df0b2b2d1 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -469,10 +469,6 @@ upon error."
              mounts)
         "ext4"))
 
-  (define (lookup-module name)
-    (string-append linux-module-directory "/"
-                   (ensure-dot-ko name)))
-
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
 
@@ -487,9 +483,8 @@ upon error."
          (start-repl))
 
        (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (load-linux-modules-from-directory linux-modules
+                                          linux-module-directory)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 6101b8dc3..1337b5e88 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -38,6 +38,7 @@
             modules-loaded
             module-loaded?
             load-linux-module*
+            load-linux-modules-from-directory
 
             current-module-debugging-port
 
@@ -232,6 +233,17 @@ appears in BLACK-LIST are not loaded."
              (or (and recursive? (= EEXIST (system-error-errno args)))
                  (apply throw args)))))))
 
+(define (load-linux-modules-from-directory modules directory)
+  "Load MODULES and their dependencies from DIRECTORY, a directory containing
+the '.ko' files.  The '.ko' suffix is automatically added to MODULES if
+needed."
+  (define (lookup-module name)
+    (string-append directory "/" (ensure-dot-ko name)))
+
+  (for-each (cut load-linux-module* <>
+                 #:lookup-module lookup-module)
+            (map lookup-module modules)))
+
 
 ;;;
 ;;; Device modules.
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 3/6] linux-modules: Add 'load-needed-linux-modules'.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 12:40:02 +0000
Resent-Message-ID: <handler.30604.B30604.152085839011469 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152085839011469
          (code B ref 30604); Mon, 12 Mar 2018 12:40:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:50 +0000
Received: from localhost ([127.0.0.1]:56081 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evMk2-0002yv-Ie
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:50 -0400
Received: from eggs.gnu.org ([208.118.235.92]:48145)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evMjz-0002yA-Ea
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:47 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evMjt-0006As-IG
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:42 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_40,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56599)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evMjr-00066x-JY; Mon, 12 Mar 2018 08:39:39 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evMjr-0003VE-1M; Mon, 12 Mar 2018 08:39:39 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 13:39:15 +0100
Message-Id: <20180312123918.22645-3-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN>
 <20180312123918.22645-1-ludo@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

Based on a patch by Danny Milosavljevic <dannym@HIDDEN>.

* gnu/build/linux-modules.scm (load-needed-linux-modules): New
procedure.
---
 gnu/build/linux-modules.scm | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 1337b5e88..9aabe6d37 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -30,6 +30,7 @@
   #:use-module (ice-9 vlist)
   #:use-module (ice-9 match)
   #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 ftw)
   #:export (dot-ko
             ensure-dot-ko
             module-aliases
@@ -45,7 +46,8 @@
             device-module-aliases
             known-module-aliases
             matching-modules
-            write-module-alias-database))
+            write-module-alias-database
+            load-needed-linux-modules))
 
 ;;; Commentary:
 ;;;
@@ -416,4 +418,34 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                              aliases)))
                 aliases))))
 
+(define (load-needed-linux-modules module-directory)
+  "Examine /sys/devices to find out which modules are needed and load those we
+have in MODULE-DIRECTORY.  Return the list of modules loaded, not including
+dependencies.
+
+Note: loading modules leads to the creation of new entries in /sys/devices,
+which is why we need traversal and loading to be interleaved.  If we walked
+/sys/devices and *then* loaded modules, we'd miss the entries added as a
+side-effect and would thus need to traverse /sys/devices again."
+  (define aliases
+    (known-module-aliases
+     (string-append module-directory "/modules.alias")))
+
+  (define (enter? director stat result) result)
+  (define (down directory stat result) result)
+  (define (up directory stat result) result)
+  (define (skip entry stat result) result)
+  (define (error name stat errno result) result)
+  (define (leaf file stat result)
+    (if (string=? (basename file) "modalias")
+        (let* ((alias   (string-trim-right
+                         (call-with-input-file file get-string-all)))
+               (modules (matching-modules alias aliases)))
+          (load-linux-modules-from-directory modules
+                                             module-directory)
+          (append modules result))
+        result))
+
+  (file-system-fold enter? leaf down up skip error #t "/sys/devices"))
+
 ;;; linux-modules.scm ends here
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 4/6] vm: Make the virtio-blk uniquely identifiable in /sys.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 12:40:03 +0000
Resent-Message-ID: <handler.30604.B30604.152085839411491 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>, Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152085839411491
          (code B ref 30604); Mon, 12 Mar 2018 12:40:03 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:54 +0000
Received: from localhost ([127.0.0.1]:56085 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evMk5-0002zG-RK
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:54 -0400
Received: from eggs.gnu.org ([208.118.235.92]:48164)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evMk0-0002yC-O3
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:50 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evMju-0006D8-Op
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:43 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56600)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evMjs-00069Q-Sj; Mon, 12 Mar 2018 08:39:40 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evMjs-0003VE-8p; Mon, 12 Mar 2018 08:39:40 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 13:39:16 +0100
Message-Id: <20180312123918.22645-4-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN>
 <20180312123918.22645-1-ludo@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

From: Danny Milosavljevic <dannym@HIDDEN>

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.

Signed-off-by: Ludovic Courtès <ludo@HIDDEN>
---
 gnu/build/vm.scm  | 6 +++++-
 gnu/system/vm.scm | 7 ++++++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..773b738ae 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,11 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+
+                       ;; QEMU seems to have a bug that it doesn't assign PCI
+                       ;; IDs properly, so force the address of our virtio-blk
+                       ;; device.
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 91ff32ce9..4360adf15 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -677,7 +677,12 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+
+     ;; QEMU seems to have a bug that it doesn't assign PCI IDs properly, so
+     ;; force the address of our virtio-blk device.
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 6/6] linux-modules: Add "modules.devname" writer.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 12:40:03 +0000
Resent-Message-ID: <handler.30604.B30604.152085839411498 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152085839411498
          (code B ref 30604); Mon, 12 Mar 2018 12:40:03 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:54 +0000
Received: from localhost ([127.0.0.1]:56087 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evMk6-0002zI-3O
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:54 -0400
Received: from eggs.gnu.org ([208.118.235.92]:48198)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evMk3-0002yT-21
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:51 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evMjx-0006HO-3V
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:46 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_40,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56603)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evMjv-0006Dh-2i; Mon, 12 Mar 2018 08:39:43 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evMju-0003VE-Iu; Mon, 12 Mar 2018 08:39:42 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 13:39:18 +0100
Message-Id: <20180312123918.22645-6-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN>
 <20180312123918.22645-1-ludo@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

* gnu/build/linux-modules.scm (aliases->device-tuple)
(write-module-device-database): New procedures.

Co-authored-by: Danny Milosavljevic <dannym@HIDDEN>.
---
 gnu/build/linux-modules.scm | 48 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 9aabe6d37..2ed04e5b4 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -47,6 +47,8 @@
             known-module-aliases
             matching-modules
             write-module-alias-database
+            write-module-device-database
+
             load-needed-linux-modules))
 
 ;;; Commentary:
@@ -418,6 +420,52 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                              aliases)))
                 aliases))))
 
+(define (aliases->device-tuple aliases)
+  "Traverse ALIASES, a list of module aliases, and search for
+\"char-major-M-N\", \"block-major-M-N\", or \"devname:\" aliases.  When they
+are found, return a tuple (DEVNAME TYPE MAJOR MINOR), otherwise return #f."
+  (define (char/block-major? alias)
+    (or (string-prefix? "char-major-" alias)
+        (string-prefix? "block-major-" alias)))
+
+  (define (char/block-major->tuple alias)
+    (match (string-tokenize alias %not-dash)
+      ((type "major" (= string->number major) (= string->number minor))
+       (list (match type
+               ("char" "c")
+               ("block" "b"))
+             major minor))))
+
+  (let* ((devname     (any (lambda (alias)
+                             (and (string-prefix? "devname:" alias)
+                                  (string-drop alias 8)))
+                           aliases))
+         (major/minor (match (find char/block-major? aliases)
+                        (#f #f)
+                        (str (char/block-major->tuple str)))))
+    (and devname major/minor
+         (cons devname major/minor))))
+
+(define (write-module-device-database directory)
+  "Traverse the '.ko' files in DIRECTORY and create the corresponding
+'modules.devname' file.  This file contains information about modules that can
+be loaded on-demand, such as file system modules."
+  (define aliases
+    (filter-map (lambda (file)
+                  (match (aliases->device-tuple (module-aliases file))
+                    (#f #f)
+                    (tuple (cons (file-name->module-name file) tuple))))
+                (find-files directory "\\.ko$")))
+
+  (call-with-output-file (string-append "/tmp" "/modules.devname")
+    (lambda (port)
+      (display "# Device nodes to trigger on-demand module loading.\n" port)
+      (for-each (match-lambda
+                  ((module devname type major minor)
+                   (format port "~a ~a ~a~a:~a~%"
+                           module devname type major minor)))
+                aliases))))
+
 (define (load-needed-linux-modules module-directory)
   "Examine /sys/devices to find out which modules are needed and load those we
 have in MODULE-DIRECTORY.  Return the list of modules loaded, not including
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 12:40:04 +0000
Resent-Message-ID: <handler.30604.B30604.152085839911513 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152085839911513
          (code B ref 30604); Mon, 12 Mar 2018 12:40:04 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 12:39:59 +0000
Received: from localhost ([127.0.0.1]:56089 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evMkA-0002zb-IU
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:58 -0400
Received: from eggs.gnu.org ([208.118.235.92]:48204)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evMk3-0002yV-Vi
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:53 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evMjx-0006HX-4I
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 08:39:46 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:56602)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evMju-0006Bp-2S; Mon, 12 Mar 2018 08:39:42 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:57474 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evMjt-0003VE-Cx; Mon, 12 Mar 2018 08:39:41 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 13:39:17 +0100
Message-Id: <20180312123918.22645-5-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN>
 <20180312123918.22645-1-ludo@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

This allows us to load modules on demand when the kernel asks for them.

* gnu/system/linux-initrd.scm (modprobe-program): New variable.
(flat-linux-module-directory): Call 'write-module-alias-database'.
(raw-initrd): Pass #:modprobe to 'boot-system'.
(expression->initrd): Copy "closure" to $out/references.
* gnu/build/linux-boot.scm (boot-system): Add #:modprobe and honor it.
Call 'load-needed-linux-modules'.
* gnu/system/vm.scm (qemu-image): Add #:linux parameter.  Define
'modprobe-wrapper' and pass it to 'activate-modprobe'.  Pass #:linux to
'expression->derivation-in-linux-vm'.

Co-authored-by: Danny Milosavljevic <dannym@HIDDEN>
---
 gnu/build/linux-boot.scm    | 13 +++++--
 gnu/system/linux-initrd.scm | 86 +++++++++++++++++++++++++++++++++++++++++----
 gnu/system/vm.scm           | 21 +++++++++++
 3 files changed, 111 insertions(+), 9 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index df0b2b2d1..eedc4bb9d 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -435,6 +435,7 @@ bailing out.~%root contents: ~s~%" (scandir "/"))
 
 
 (define* (boot-system #:key
+                      modprobe
                       (linux-modules '())
                       linux-module-directory
                       qemu-guest-networking?
@@ -449,6 +450,9 @@ QEMU-GUEST-NETWORKING? is true, calling PRE-MOUNT, mounting the file systems
 specified in MOUNTS, and finally booting into the new root if any.  The initrd
 supports kernel command-line options '--load', '--root', and '--repl'.
 
+MODPROBE must be #f or a program to install as the modprobe program that the
+kernel will invoke when it needs to load modules.
+
 Mount the root file system, specified by the '--root' command-line argument,
 if any.
 
@@ -482,9 +486,14 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
+       (when modprobe
+         ;; Tell the kernel to invoke MODPROBE.
+         (call-with-output-file "/proc/sys/kernel/modprobe"
+           (lambda (port)
+             (display modprobe port))))
+
        (display "loading kernel modules...\n")
-       (load-linux-modules-from-directory linux-modules
-                                          linux-module-directory)
+       (load-needed-linux-modules linux-module-directory)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 1eb5f5130..6b7883c2c 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -63,6 +63,75 @@
 ;;;
 ;;; Code:
 
+(define* (modprobe-program linux-module-directory #:key
+                           (guile %guile-static-stripped))
+  "Return a minimal implementation of 'modprobe' for our initrd that looks up
+modules in LINUX-MODULE-DIRECTORY.  This program will be invoked by the kernel
+when modules need to be loaded."
+  (define program
+    (with-imported-modules (source-module-closure
+                            '((gnu build linux-modules)))
+      #~(begin
+          (use-modules (gnu build linux-modules)
+                       (ice-9 match)
+                       (srfi srfi-1)
+                       (srfi srfi-26)
+                       (srfi srfi-37))
+
+          (define option-spec
+            (list (option '(#\q "quiet") #f #f
+                          (lambda (opt name arg result)
+                            (alist-cons 'quiet? #t result)))))
+
+          (define options
+            ;; Alist of options and non-option arguments.
+            (args-fold (cdr (program-arguments))
+                       option-spec
+                       (lambda (opt name arg result)
+                         (error "unrecognized option" name))
+                       (lambda (arg result)
+                         (alist-cons 'argument arg result))
+                       '()))
+
+          (define aliases
+            ;; The list of aliases we are asked to load.
+            (filter-map (match-lambda
+                          (('argument . alias) alias)
+                          (_ #f))
+                        options))
+
+          (define linux-module-directory
+            ;; The module directory.  Note: We expect a flat directory here.
+            #$linux-module-directory)
+
+          (define %known-aliases
+            ;; The alias database.
+            (known-module-aliases
+             (string-append linux-module-directory "/modules.alias")))
+
+          (define (device-aliases->module-names aliases)
+            ;; Return the list of module names for the subset of ALIASES that
+            ;; appears in %KNOWN-ALIASES.
+            (append-map (cut matching-modules <> %known-aliases)
+                        aliases))
+
+          (when (assq-ref options 'quiet?)
+            (current-error-port (%make-void-port "w"))
+            (current-output-port (%make-void-port "w")))
+
+          (let ((modules (device-aliases->module-names aliases)))
+            (call-with-output-file "/dev/kmsg"
+              (lambda (port)
+                (format port "modprobe[~a]: aliases ~s; modules ~s; args ~s~%"
+                        (getpid) aliases modules (program-arguments))))
+
+            (when (< (length modules) (length aliases))
+              (error "alias resolution failed" aliases))
+
+            (load-linux-modules-from-directory (reverse modules)
+                                               linux-module-directory)))))
+
+  (program-file "modprobe" program #:guile guile))
 
 (define* (expression->initrd exp
                              #:key
@@ -89,16 +158,16 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (mkdir #$output)
 
           ;; The guile used in the initrd must be present in the store, so
-          ;; that module loading works once the root is switched.
+          ;; that module loading works once the root is switched.  Similarly,
+          ;; the 'modprobe' program installed in /proc/sys/kernel/modprobe by
+          ;; the initrd, if any, must be present after switch root.
           ;;
           ;; To ensure that is the case, add an explicit reference to the
           ;; guile package used in the initrd to the output.
           ;;
-          ;; This fixes guix-patches bug #28399, "Fix mysql activation, and
+          ;; This fixes <https://bugs.gnu.org/28399>, "Fix mysql activation, and
           ;; add a basic test".
-          (call-with-output-file (string-append #$ output "/references")
-            (lambda (port)
-              (simple-format port "~A\n" #$guile)))
+          (copy-file "closure" (string-append #$output "/references"))
 
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
@@ -153,7 +222,9 @@ MODULES and taken from LINUX."
                       (copy-file module
                                  (string-append #$output "/"
                                                 (basename module))))
-                    (delete-duplicates modules)))))
+                    (delete-duplicates modules))
+
+          (write-module-alias-database #$output))))
 
   (computed-file "linux-modules" build-exp))
 
@@ -222,7 +293,8 @@ upon error."
              (set-path-environment-variable "PATH" '("bin" "sbin")
                                             '#$helper-packages)))
 
-         (boot-system #:mounts
+         (boot-system #:modprobe #$(modprobe-program kodir)
+                      #:mounts
                       (map spec->file-system
                            '#$(map file-system->spec file-systems))
                       #:pre-mount (lambda ()
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 4360adf15..ecb7ed506 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -249,6 +249,7 @@ INPUTS is a list of inputs (as for packages)."
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
+                     (linux linux-libre)
                      (qemu qemu-minimal)
                      (disk-image-size 'guess)
                      (disk-image-format "qcow2")
@@ -275,18 +276,37 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (define modprobe-wrapper
+    ;; Wrapper for the 'modprobe' command that knows where modules live.
+    (let ((modprobe (file-append kmod "/bin/modprobe")))
+      (program-file "modprobe"
+                    #~(begin
+                        (setenv "LINUX_MODULE_DIRECTORY"
+                                #$(file-append linux "/lib/modules"))
+                        (apply execl #$modprobe
+                               (cons #$modprobe (cdr (command-line))))))))
+
+
   (expression->derivation-in-linux-vm
    name
    (with-imported-modules (source-module-closure '((gnu build bootloader)
                                                    (gnu build vm)
+                                                   (gnu build activation)
                                                    (guix build utils)))
      #~(begin
          (use-modules (gnu build bootloader)
                       (gnu build vm)
+                      ((gnu build activation) #:select (activate-modprobe))
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
+         ;; We may need to lazy-load modules.  The initrd installs a
+         ;; 'modprobe' that can only search through the modules available in
+         ;; the initrd, but here we want to be able to use all the modules of
+         ;; LINUX.  Thus, install a real 'modprobe'.
+         (activate-modprobe #$modprobe-wrapper)
+
          (let ((inputs
                 '#$(append (list qemu parted e2fsprogs dosfstools)
                            (map canonical-package
@@ -361,6 +381,7 @@ the image."
                                    #$(bootloader-installer bootloader))
              (reboot)))))
    #:system system
+   #:linux linux
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 3/7] linux-initrd: Provide pure-Guile modprobe.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 14:46:01 +0000
Resent-Message-ID: <handler.30604.B30604.15208659337608 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15208659337608
          (code B ref 30604); Mon, 12 Mar 2018 14:46:01 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 14:45:33 +0000
Received: from localhost ([127.0.0.1]:57079 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evOhh-0001ye-0T
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 10:45:33 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:51766)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evOhf-0001yV-5q
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 10:45:31 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 9DD82123DD;
 Mon, 12 Mar 2018 15:45:30 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id 8zwWI3TA9VqT; Mon, 12 Mar 2018 15:45:29 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id C2940123CF;
 Mon, 12 Mar 2018 15:45:29 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
 <20180304010914.1322-4-dannym@HIDDEN>
 <20180311212430.707ef0ea@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 22 =?UTF-8?Q?Vent=C3=B4se?= an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Mon, 12 Mar 2018 15:45:29 +0100
In-Reply-To: <20180311212430.707ef0ea@HIDDEN> (Danny Milosavljevic's
 message of "Sun, 11 Mar 2018 21:24:30 +0100")
Message-ID: <878taxnyie.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Danny Milosavljevic <dannym@HIDDEN> skribis:

>> +          (define option-spec
>> +           '((quiet    (single-char #\q) (value #f))))
>
> Would make sense to also support "-a" (used when invoking modprobe to loa=
d multiple
> kernel modules at once).

I suppose we can do that later because the kernel doesn=E2=80=99t use it in
=E2=80=98call_modprobe=E2=80=99 and this thing is only ever invoked by the =
kernel.

WDYT?

Ludo=E2=80=99.





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v9 3/7] linux-initrd: Provide pure-Guile modprobe.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 17:53:02 +0000
Resent-Message-ID: <handler.30604.B30604.152087712527083 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152087712527083
          (code B ref 30604); Mon, 12 Mar 2018 17:53:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 17:52:05 +0000
Received: from localhost ([127.0.0.1]:57502 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evRcD-00072k-Hy
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 13:52:05 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:52574)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evRcC-00072Z-L8
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 13:52:05 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 6BBC73360290;
 Mon, 12 Mar 2018 18:52:02 +0100 (CET)
Date: Mon, 12 Mar 2018 18:51:55 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312183840.44e1b6c2@HIDDEN>
In-Reply-To: <878taxnyie.fsf@HIDDEN>
References: <20180303135533.6112-1-dannym@HIDDEN>
 <20180304010914.1322-1-dannym@HIDDEN>
 <20180304010914.1322-4-dannym@HIDDEN>
 <20180311212430.707ef0ea@HIDDEN> <878taxnyie.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/ofkgarPL=IPwfQpjLIc/DDS"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/ofkgarPL=IPwfQpjLIc/DDS
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

On Mon, 12 Mar 2018 15:45:29 +0100
ludo@HIDDEN (Ludovic Court=C3=A8s) wrote:

> > Would make sense to also support "-a" (used when invoking modprobe to l=
oad multiple
> > kernel modules at once). =20
>=20
> I suppose we can do that later because the kernel doesn=E2=80=99t use it =
in
> =E2=80=98call_modprobe=E2=80=99 and this thing is only ever invoked by th=
e kernel.

Sure.

I just wanted to comment because I noticed that kmod's

  modprobe a b c

doesn't load three modules a, b, c.  But my v9's pure-Guile modprobe was
implemented in a way that it did load three modules a, b, c - which it
definitely shouldn't be doing.

--Sig_/ofkgarPL=IPwfQpjLIc/DDS
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqmvjsACgkQ5xo1VCww
uqXeIwf/bWzHASgwuyDjDHnyky9v07N2HOiSCOKw02bU0cL1fq2XiqTMAOJ1aurg
yrijV9mfr6v27OKikXld/AoTPf4kSJR3DLRosyJeu1CoXHm4CdLnBpFm2Zbf4HSm
c+jBjo3x21qMmIj1O5KDtJQo22fbgTp29/2ndokOOrDLpShdKxCRNiihK9e3gRTM
eZdw10jhypvXZWLgfeWrOvLkxrBeLgR437UdWYXkal6SOZ1EY2jP3d1XqhxCi/BA
gGPAcEQYIc2SNVhf30MfaH6ssih+bcDeLxlBkTJ/U9vpXMJDPiKoC9kgpus7ncLN
Ph7AT+i7N1bp9JEbQfnDrNdGwqctKQ==
=bZwL
-----END PGP SIGNATURE-----

--Sig_/ofkgarPL=IPwfQpjLIc/DDS--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 2/6] linux-modules: Add 'load-linux-modules-from-directory'.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 19:28:02 +0000
Resent-Message-ID: <handler.30604.B30604.15208828253972 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15208828253972
          (code B ref 30604); Mon, 12 Mar 2018 19:28:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 19:27:05 +0000
Received: from localhost ([127.0.0.1]:57534 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evT69-00011z-4S
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:27:05 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:59714)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evT67-00011r-Qw
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:27:04 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 175F03360290;
 Mon, 12 Mar 2018 20:27:02 +0100 (CET)
Date: Mon, 12 Mar 2018 20:26:54 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312202654.43eaa5b1@HIDDEN>
In-Reply-To: <20180312123918.22645-2-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-2-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/8h1YRx+a/y.xMUaBt6U3YWB"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/8h1YRx+a/y.xMUaBt6U3YWB
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

LGTM!

--Sig_/8h1YRx+a/y.xMUaBt6U3YWB
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqm1H4ACgkQ5xo1VCww
uqUaDQgAoQZlq9m3ie+LFkr6iYXYrja7h9oMesSDWz5Prfd8ou8Y59JZnoGHPkMc
PucsWmIvytg4OgT7xqbJk7rmNFdwyM7EFqj/oizhKnwYBo0kObRfUXfA6jbE2GiG
JdLHMuiIbfJAe2S1B01PEMT2Wdkxb+2qTJJMCQaHR1DPQe6NgnSK2vI4567CYD/U
iU3ugZV6pTIWjoju//TvaiNbGFJiW65f1E3I3X79gIiY2UJJQiWeCDJjmBPAC24P
XzIGzhywgHcL/zItbRnp6LlVl8pjpg4soK+IIEu/Rlu/Pgfhx4RmSsHqE91c0V9h
pdzRqIfDXaqB0PbdF20hY3I1ZMfOHQ==
=8AKq
-----END PGP SIGNATURE-----

--Sig_/8h1YRx+a/y.xMUaBt6U3YWB--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 3/6] linux-modules: Add 'load-needed-linux-modules'.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 19:41:01 +0000
Resent-Message-ID: <handler.30604.B30604.15208836095264 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15208836095264
          (code B ref 30604); Mon, 12 Mar 2018 19:41:01 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 19:40:09 +0000
Received: from localhost ([127.0.0.1]:57542 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evTIm-0001Mq-Sc
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:40:09 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:60636)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evTIl-0001Mi-4p
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:40:07 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id E92F43360290;
 Mon, 12 Mar 2018 20:40:05 +0100 (CET)
Date: Mon, 12 Mar 2018 20:40:02 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312204002.09bfc72f@HIDDEN>
In-Reply-To: <20180312123918.22645-3-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-3-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

> +        (let* ((alias   (string-trim-right
> +                         (call-with-input-file file get-string-all)))

Hmm... doesn't this trim other things than newline?

A quick internet search shows that most people do that.  Huh.

LGTM!




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 1/6] linux-modules: Add "modules.alias" writer.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 19:55:02 +0000
Resent-Message-ID: <handler.30604.B30604.15208844946631 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15208844946631
          (code B ref 30604); Mon, 12 Mar 2018 19:55:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 19:54:54 +0000
Received: from localhost ([127.0.0.1]:57546 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evTX4-0001is-5y
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:54:54 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:33470)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evTX3-0001ij-8o
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 15:54:53 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id CC0583360290;
 Mon, 12 Mar 2018 20:54:51 +0100 (CET)
Date: Mon, 12 Mar 2018 20:54:44 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312205444.07c05f4c@HIDDEN>
In-Reply-To: <20180312123918.22645-1-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN>
	<20180312123918.22645-1-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/168_Ahi6oUnV_8ev6XJ61G8"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/168_Ahi6oUnV_8ev6XJ61G8
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

> +(define %not-dash
> +  (char-set-complement (char-set #\-)))

Is that used?


--Sig_/168_Ahi6oUnV_8ev6XJ61G8
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqm2wQACgkQ5xo1VCww
uqWAEggAoQSbJS4ZokiOPU19tL7sruZCtY+obW6fPybblMPoEGu4lvtpYgGS2LKJ
WM/BqQ47Gl+YsaHN0rtubgE/x6UR1QSgNT4u8YzKgUUndYDCnTE/IZeZxJpInCHm
vX/zZrABiPijn2XScY+CPIZhDSqc2clk0+9SwG0HuZ95YGmsR46fgBk7pxkgtwHi
tF2KGNgAvTY9ras70li10hgd8yhddjYV7hDzlD5V4NPUO0zUHq/bnLMvQUwvL8Vf
DbeqIeZo2LuEmC8/ndD8cOYD9abRswWxwiV5X6W2Mv/sM1ihgP1qFxXZsfXffq7e
IUSeM6PeZH9zXjm7zhULRhbu5jBFlQ==
=5l1S
-----END PGP SIGNATURE-----

--Sig_/168_Ahi6oUnV_8ev6XJ61G8--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 20:10:02 +0000
Resent-Message-ID: <handler.30604.B30604.15208853878111 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15208853878111
          (code B ref 30604); Mon, 12 Mar 2018 20:10:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 20:09:47 +0000
Received: from localhost ([127.0.0.1]:57550 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evTlT-00026l-GT
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 16:09:47 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:34672)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evTlS-00026d-4X
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 16:09:46 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id F0A0A3360163;
 Mon, 12 Mar 2018 21:09:44 +0100 (CET)
Date: Mon, 12 Mar 2018 21:09:36 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312210936.7f89a29c@HIDDEN>
In-Reply-To: <20180312123918.22645-5-ludo@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-5-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/+QfwEzIV806Sp6Lwi4U+ueu"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/+QfwEzIV806Sp6Lwi4U+ueu
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

On Mon, 12 Mar 2018 13:39:17 +0100
Ludovic Court=C3=A8s <ludo@HIDDEN> wrote:

> +       (when modprobe
> +         ;; Tell the kernel to invoke MODPROBE.
> +         (call-with-output-file "/proc/sys/kernel/modprobe"
> +           (lambda (port)
> +             (display modprobe port))))
> +
>         (display "loading kernel modules...\n")

There's a race because Linux could just start loading modules
immediately before boot-system even starts / executed far enough.

That was why earlier I kept /sbin/modprobe as the name (it's the
default Linux uses) and made sure that the file /sbin/modprobe is already
in the initrd (as opposed to created by boot-system).

The race didn't happen to me yet (and I doubt that Linux has modules
fine-grained enough that that's a problem in practise) - but I would prefer
it not to be possible.

WDYT?

> +          (define aliases
> +            ;; The list of aliases we are asked to load.
> +            (filter-map (match-lambda
> +                          (('argument . alias) alias)
> +                          (_ #f))
> +                        options))

Without "-a", it's not supposed to be a list of aliases.  It's supposed to =
be
one alias and the remainder are parameters supposed to be passed to that
kernel module.

(I didn't know that before).

When Linux invokes /sbin/modprobe, it doesn't pass "-a" but it doesn't
pass any module parameters either - it just passes one module alias.

For clarity and in order that we don't have weird problems later (trying to
load a module named "verbose=3D1" or something :) ), let's just accept one =
alias
for now.

>+(define* (modprobe-program linux-module-directory #:key
>+                           (guile %guile-static-stripped))
[...]
> +            (call-with-output-file "/dev/kmsg"
> +              (lambda (port)
> +                (format port "modprobe[~a]: aliases ~s; modules ~s; args=
 ~s~%"
> +                        (getpid) aliases modules (program-arguments))))

Hmm, logging is nice!

But with /dev/kmsg one write(2) syscall needs to pass the entire message.

What do you think about additionally calling setvbuf with 1024 ?  Because:

kernel/printk/printk.c: #define LOG_LINE_MAX         (1024 - PREFIX_MAX)

> +            (when (< (length modules) (length aliases))
> +              (error "alias resolution failed" aliases))

The original modprobe loads as many modules as it can and possibly sets an
(always the same) error flag (and continues loading the other modules).

Then modprobe's exit status is that error flag.

This is moot because we shouldn't accept more than one alias - see above.

> +          (write-module-alias-database #$output))))

One of the devnames created statically is the one for btrfs, so not writing=
 or
using devnames is not going to end well.

If it did work without it I'd be even more on guard :)

(I'd also copy the modules.builtin (from Linux).
 Also, what happens if we load a module which has as dependency a builtin?
 Will we try to load the builtin as a .ko file and fail the entire thing?)

> +         ;; We may need to lazy-load modules.  The initrd installs a

Nitpick: "kernel modules" (to clarify).

--Sig_/+QfwEzIV806Sp6Lwi4U+ueu
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqm3oAACgkQ5xo1VCww
uqVxHQf/SAsE6KJ/6f6BdakZaXlVHzpjRCqHAsBqgjysduzvcrFV8UCjlL+oHwbx
wSTlb3pX/UlqNI6URpKE2lAvroThzv4nrohwxTlIHCUM/Y1eYanCrT0F6v6Qwg6z
fr+AF1KUyJHeLU7I0vgu+Sl2KWEJwRvQkUCPoF4UnpkQnwreJFatjBa5jkJeRPYP
GRQe2vfBmOQUQetL2JjeqvOJ6FSfKV51A//8HoJFHpVgkktBD1mADHR4yiB+CWuD
9BiPndNOCm8FgF5szqQK+htdfm15kMF9yapqCVib12xZzUEji6zXPSN201q3V0uY
O0fbTWR4qYQL/2nlcZU+Tm/RMPfs5g==
=D7DW
-----END PGP SIGNATURE-----

--Sig_/+QfwEzIV806Sp6Lwi4U+ueu--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 3/6] linux-modules: Add 'load-needed-linux-modules'.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 21:11:02 +0000
Resent-Message-ID: <handler.30604.B30604.152088905314167 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152088905314167
          (code B ref 30604); Mon, 12 Mar 2018 21:11:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 21:10:53 +0000
Received: from localhost ([127.0.0.1]:57567 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evUia-0003gQ-Qg
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:10:53 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:54302)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evUiZ-0003gI-2H
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:10:51 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 96EFE12492;
 Mon, 12 Mar 2018 22:10:50 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id qlUQ7UOFFKjG; Mon, 12 Mar 2018 22:10:49 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 901B612029;
 Mon, 12 Mar 2018 22:10:49 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-3-ludo@HIDDEN>
 <20180312204002.09bfc72f@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 22 =?UTF-8?Q?Vent=C3=B4se?= an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Mon, 12 Mar 2018 22:10:39 +0100
In-Reply-To: <20180312204002.09bfc72f@HIDDEN> (Danny Milosavljevic's
 message of "Mon, 12 Mar 2018 20:40:02 +0100")
Message-ID: <87r2opknjk.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Danny Milosavljevic <dannym@HIDDEN> skribis:

>> +        (let* ((alias   (string-trim-right
>> +                         (call-with-input-file file get-string-all)))
>
> Hmm... doesn't this trim other things than newline?

Yes, it trims whitespace.

> A quick internet search shows that most people do that.  Huh.

Yeah I=E2=80=99d think that whitespace is non-significant in these files, b=
ut in
practice they=E2=80=99re always generated anyway.

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 21:13:01 +0000
Resent-Message-ID: <handler.30604.B30604.152088915414343 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152088915414343
          (code B ref 30604); Mon, 12 Mar 2018 21:13:01 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 21:12:34 +0000
Received: from localhost ([127.0.0.1]:57571 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evUkE-0003jG-7K
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:12:34 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:39716)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evUkD-0003j8-2F
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:12:33 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id E1F283360290;
 Mon, 12 Mar 2018 22:12:31 +0100 (CET)
Date: Mon, 12 Mar 2018 22:12:26 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312221226.72eb6cb7@HIDDEN>
In-Reply-To: <20180312210936.7f89a29c@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-5-ludo@HIDDEN>
 <20180312210936.7f89a29c@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/yqyUpe/VHoXpAgll993hj+C"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/yqyUpe/VHoXpAgll993hj+C
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

> That was why earlier I kept /sbin/modprobe as the name (it's the
> default Linux uses) and made sure that the file /sbin/modprobe is already
> in the initrd (as opposed to created by boot-system).

Note: The simplest change would be to keep this patch as-is but add=20

    ;; Make sure that Linux can modprobe even before boot-system started up.
    (when modprobe
      (mkdir-p "sbin")
      (symlink modprobe "sbin/modprobe")
      (compile-to-cache "sbin/modprobe")) ; Note: without this line booting=
 is dead slow. [Maybe in this case that wouldn't be so bad - since boot-sys=
tem switches away immediately anyway :)]

to gnu/build/linux-initrd.scm

--Sig_/yqyUpe/VHoXpAgll993hj+C
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqm7ToACgkQ5xo1VCww
uqXvXgf/SnwfDNtEZL1XSdFOuX/41Dp/eKf3g0roct+Yxfv1fjvliPoGPFfttKv+
Zx+vSHS1R//outrcrcXifpJJaNpsASsol1HxtuoPtzQ7nLXDIZKB4bG9aZYeVW1H
OnWOKL1Si9ozts4KJxfBSyovFyDqIs/J85BrSaYhsCI5qkpH3pmKx03bTuPPOlXH
kI5S5j4977ATl5IXiUdZ0Y2+QOun98k+a5XM4ujlfaID+gu+9PrEp4R9bg6V1nGZ
M3efWovUJeewL+nk4gB1pLx3bo5ISLeoqdq1Bso2HzYkfmZtiI5Ke5+k37zPpOg1
tfBGWBNxzKJLnS40yu6tbFDweZ/1sg==
=5MQy
-----END PGP SIGNATURE-----

--Sig_/yqyUpe/VHoXpAgll993hj+C--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 1/6] linux-modules: Add "modules.alias" writer.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 21:14:01 +0000
Resent-Message-ID: <handler.30604.B30604.152088921914457 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152088921914457
          (code B ref 30604); Mon, 12 Mar 2018 21:14:01 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 21:13:39 +0000
Received: from localhost ([127.0.0.1]:57575 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evUlH-0003l7-GY
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:13:39 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:54330)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evUlF-0003kz-Qg
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 17:13:38 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 64AD712492;
 Mon, 12 Mar 2018 22:13:37 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id iWL9Bwsjb6OD; Mon, 12 Mar 2018 22:13:36 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 7F0481245C;
 Mon, 12 Mar 2018 22:13:36 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312205444.07c05f4c@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 22 =?UTF-8?Q?Vent=C3=B4se?= an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Mon, 12 Mar 2018 22:13:26 +0100
In-Reply-To: <20180312205444.07c05f4c@HIDDEN> (Danny Milosavljevic's
 message of "Mon, 12 Mar 2018 20:54:44 +0100")
Message-ID: <87muzdknex.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Danny Milosavljevic <dannym@HIDDEN> skribis:

>> +(define %not-dash
>> +  (char-set-complement (char-set #\-)))
>
> Is that used?

Oops, not until patch 6/6.  I=E2=80=99ve moved it there.

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:16:02 +0000
Resent-Message-ID: <handler.30604.B30604.152089291320938 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089291320938
          (code B ref 30604); Mon, 12 Mar 2018 22:16:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:15:13 +0000
Received: from localhost ([127.0.0.1]:57764 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evVir-0005Rc-GU
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:15:13 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:54978)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evVio-0005RT-KP
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:15:11 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id B844B12478;
 Mon, 12 Mar 2018 23:15:09 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id PWm2jtYsnegY; Mon, 12 Mar 2018 23:15:08 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 1F0B212456;
 Mon, 12 Mar 2018 23:15:08 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-5-ludo@HIDDEN>
 <20180312210936.7f89a29c@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 22 =?UTF-8?Q?Vent=C3=B4se?= an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Mon, 12 Mar 2018 23:14:59 +0100
In-Reply-To: <20180312210936.7f89a29c@HIDDEN> (Danny Milosavljevic's
 message of "Mon, 12 Mar 2018 21:09:36 +0100")
Message-ID: <87h8plkkkc.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Howdy!

Danny Milosavljevic <dannym@HIDDEN> skribis:

> On Mon, 12 Mar 2018 13:39:17 +0100
> Ludovic Court=C3=A8s <ludo@HIDDEN> wrote:
>
>> +       (when modprobe
>> +         ;; Tell the kernel to invoke MODPROBE.
>> +         (call-with-output-file "/proc/sys/kernel/modprobe"
>> +           (lambda (port)
>> +             (display modprobe port))))
>> +
>>         (display "loading kernel modules...\n")
>
> There's a race because Linux could just start loading modules
> immediately before boot-system even starts / executed far enough.
>
> That was why earlier I kept /sbin/modprobe as the name (it's the
> default Linux uses) and made sure that the file /sbin/modprobe is already
> in the initrd (as opposed to created by boot-system).
>
> The race didn't happen to me yet (and I doubt that Linux has modules
> fine-grained enough that that's a problem in practise) - but I would pref=
er
> it not to be possible.
>
> WDYT?

You=E2=80=99re right, I wondered what would happen.  I=E2=80=99ve restored =
the
/sbin/modprobe symlink in v11.

>> +          (define aliases
>> +            ;; The list of aliases we are asked to load.
>> +            (filter-map (match-lambda
>> +                          (('argument . alias) alias)
>> +                          (_ #f))
>> +                        options))
>
> Without "-a", it's not supposed to be a list of aliases.  It's supposed t=
o be
> one alias and the remainder are parameters supposed to be passed to that
> kernel module.
>
> (I didn't know that before).
>
> When Linux invokes /sbin/modprobe, it doesn't pass "-a" but it doesn't
> pass any module parameters either - it just passes one module alias.
>
> For clarity and in order that we don't have weird problems later (trying =
to
> load a module named "verbose=3D1" or something :) ), let's just accept on=
e alias
> for now.

Indeed, done in v11.

>>+(define* (modprobe-program linux-module-directory #:key
>>+                           (guile %guile-static-stripped))
> [...]
>> +            (call-with-output-file "/dev/kmsg"
>> +              (lambda (port)
>> +                (format port "modprobe[~a]: aliases ~s; modules ~s; arg=
s ~s~%"
>> +                        (getpid) aliases modules (program-arguments))))
>
> Hmm, logging is nice!

I didn=E2=80=99t mean to leave it, but after all, it=E2=80=99s pretty usefu=
l.  :-)

> But with /dev/kmsg one write(2) syscall needs to pass the entire message.
>
> What do you think about additionally calling setvbuf with 1024 ?  Because:

Sure.

>> +          (write-module-alias-database #$output))))
>
> One of the devnames created statically is the one for btrfs, so not writi=
ng or
> using devnames is not going to end well.

We=E2=80=99re fine because btrfs, 9p, overlay, etc. all have an =E2=80=9Cfs=
-btrfs=E2=80=9D,
=E2=80=9Cfs-9p=E2=80=9D, etc. alias, which shows up in =E2=80=9Cmodules.ali=
as=E2=80=9D.  No need for
=E2=80=9Cmodules.devname=E2=80=9D AFAICS.

> (I'd also copy the modules.builtin (from Linux).
>  Also, what happens if we load a module which has as dependency a builtin?
>  Will we try to load the builtin as a .ko file and fail the entire thing?)

The dependency of a builtin is necessarily a builtin, and the kernel
won=E2=80=99t invoke modprobe for a builtin, will it?  IOW, I think there=
=E2=80=99s no
problem here.  :-)

>> +         ;; We may need to lazy-load modules.  The initrd installs a
>
> Nitpick: "kernel modules" (to clarify).

Fixed.

Thanks for the insightful review!

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 1/6] linux-modules: Add "modules.alias" writer.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:17:01 +0000
Resent-Message-ID: <handler.30604.B30604.152089298021075 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089298021075
          (code B ref 30604); Mon, 12 Mar 2018 22:17:01 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:20 +0000
Received: from localhost ([127.0.0.1]:57768 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evVjv-0005Tr-Sr
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:20 -0400
Received: from eggs.gnu.org ([208.118.235.92]:39068)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evVju-0005Tb-N5
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:18 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evVjo-0004Oo-O8
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:13 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40056)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evVjo-0004OC-Jn; Mon, 12 Mar 2018 18:16:12 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evVjo-0001Ef-0P; Mon, 12 Mar 2018 18:16:12 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 23:15:36 +0100
Message-Id: <20180312221541.1886-1-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <87h8plkkkc.fsf@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

From: Danny Milosavljevic <dannym@HIDDEN>

* gnu/build/linux-modules.scm (write-module-alias-database): New
procedure.
(%not-dash): New variable.

Co-authored-by: Ludovic Courtès <ludo@HIDDEN>
---
 gnu/build/linux-modules.scm | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 4fe673cca..b444e6f90 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2014, 2016, 2018 Ludovic Courtès <ludo@HIDDEN>
 ;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@HIDDEN>
+;;; Copyright © 2018 Danny Milosavljevic <dannym@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +22,7 @@
   #:use-module (guix elf)
   #:use-module (guix glob)
   #:use-module (guix build syscalls)
+  #:use-module ((guix build utils) #:select (find-files))
   #:use-module (rnrs io ports)
   #:use-module (rnrs bytevectors)
   #:use-module (srfi srfi-1)
@@ -41,7 +43,8 @@
 
             device-module-aliases
             known-module-aliases
-            matching-modules))
+            matching-modules
+            write-module-alias-database))
 
 ;;; Commentary:
 ;;;
@@ -380,4 +383,22 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                       module)))
               known-aliases))
 
+(define (write-module-alias-database directory)
+  "Traverse the '.ko' files in DIRECTORY and create the corresponding
+'modules.alias' file."
+  (define aliases
+    (map (lambda (file)
+           (cons (file-name->module-name file) (module-aliases file)))
+         (find-files directory "\\.ko$")))
+
+  (call-with-output-file (string-append directory "/modules.alias")
+    (lambda (port)
+      (display "# Aliases extracted from modules themselves.\n" port)
+      (for-each (match-lambda
+                  ((module . aliases)
+                   (for-each (lambda (alias)
+                               (format port "alias ~a ~a\n" alias module))
+                             aliases)))
+                aliases))))
+
 ;;; linux-modules.scm ends here
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 2/6] linux-modules: Add 'load-linux-modules-from-directory'.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:17:02 +0000
Resent-Message-ID: <handler.30604.B30604.152089298321098 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089298321098
          (code B ref 30604); Mon, 12 Mar 2018 22:17:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:23 +0000
Received: from localhost ([127.0.0.1]:57772 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evVjz-0005U9-4X
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:23 -0400
Received: from eggs.gnu.org ([208.118.235.92]:39097)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evVjx-0005Tf-NH
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:21 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evVjr-0004Rf-Pr
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:16 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40057)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evVjp-0004Qj-Ra; Mon, 12 Mar 2018 18:16:13 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evVjp-0001Ef-8P; Mon, 12 Mar 2018 18:16:13 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 23:15:37 +0100
Message-Id: <20180312221541.1886-2-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN>
 <20180312221541.1886-1-ludo@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

* gnu/build/linux-modules.scm (load-linux-modules-from-directory): New
procedure.
* gnu/build/linux-boot.scm (boot-system)[lookup-module]: Remove.
Use 'load-linux-modules-from-directory' instead.
---
 gnu/build/linux-boot.scm    |  9 ++-------
 gnu/build/linux-modules.scm | 12 ++++++++++++
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index 18d87260a..df0b2b2d1 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -469,10 +469,6 @@ upon error."
              mounts)
         "ext4"))
 
-  (define (lookup-module name)
-    (string-append linux-module-directory "/"
-                   (ensure-dot-ko name)))
-
   (display "Welcome, this is GNU's early boot Guile.\n")
   (display "Use '--repl' for an initrd REPL.\n\n")
 
@@ -487,9 +483,8 @@ upon error."
          (start-repl))
 
        (display "loading kernel modules...\n")
-       (for-each (cut load-linux-module* <>
-                      #:lookup-module lookup-module)
-                 (map lookup-module linux-modules))
+       (load-linux-modules-from-directory linux-modules
+                                          linux-module-directory)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index b444e6f90..0084f972b 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -38,6 +38,7 @@
             modules-loaded
             module-loaded?
             load-linux-module*
+            load-linux-modules-from-directory
 
             current-module-debugging-port
 
@@ -232,6 +233,17 @@ appears in BLACK-LIST are not loaded."
              (or (and recursive? (= EEXIST (system-error-errno args)))
                  (apply throw args)))))))
 
+(define (load-linux-modules-from-directory modules directory)
+  "Load MODULES and their dependencies from DIRECTORY, a directory containing
+the '.ko' files.  The '.ko' suffix is automatically added to MODULES if
+needed."
+  (define (lookup-module name)
+    (string-append directory "/" (ensure-dot-ko name)))
+
+  (for-each (cut load-linux-module* <>
+                 #:lookup-module lookup-module)
+            (map lookup-module modules)))
+
 
 ;;;
 ;;; Device modules.
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 3/6] linux-modules: Add 'load-needed-linux-modules'.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:17:02 +0000
Resent-Message-ID: <handler.30604.B30604.152089298521113 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089298521113
          (code B ref 30604); Mon, 12 Mar 2018 22:17:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:25 +0000
Received: from localhost ([127.0.0.1]:57776 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evVk1-0005US-Ek
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:25 -0400
Received: from eggs.gnu.org ([208.118.235.92]:39109)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evVjy-0005Ti-UI
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:23 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evVjt-0004SJ-0F
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:17 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-0.0 required=5.0 tests=BAYES_40,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40059)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evVjr-0004RG-0g; Mon, 12 Mar 2018 18:16:15 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evVjq-0001Ef-FX; Mon, 12 Mar 2018 18:16:14 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 23:15:38 +0100
Message-Id: <20180312221541.1886-3-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN>
 <20180312221541.1886-1-ludo@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

Based on a patch by Danny Milosavljevic <dannym@HIDDEN>.

* gnu/build/linux-modules.scm (load-needed-linux-modules): New
procedure.
---
 gnu/build/linux-modules.scm | 34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 0084f972b..55161e026 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -30,6 +30,7 @@
   #:use-module (ice-9 vlist)
   #:use-module (ice-9 match)
   #:use-module (ice-9 rdelim)
+  #:use-module (ice-9 ftw)
   #:export (dot-ko
             ensure-dot-ko
             module-aliases
@@ -45,7 +46,8 @@
             device-module-aliases
             known-module-aliases
             matching-modules
-            write-module-alias-database))
+            write-module-alias-database
+            load-needed-linux-modules))
 
 ;;; Commentary:
 ;;;
@@ -413,4 +415,34 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                              aliases)))
                 aliases))))
 
+(define (load-needed-linux-modules module-directory)
+  "Examine /sys/devices to find out which modules are needed and load those we
+have in MODULE-DIRECTORY.  Return the list of modules loaded, not including
+dependencies.
+
+Note: loading modules leads to the creation of new entries in /sys/devices,
+which is why we need traversal and loading to be interleaved.  If we walked
+/sys/devices and *then* loaded modules, we'd miss the entries added as a
+side-effect and would thus need to traverse /sys/devices again."
+  (define aliases
+    (known-module-aliases
+     (string-append module-directory "/modules.alias")))
+
+  (define (enter? director stat result) result)
+  (define (down directory stat result) result)
+  (define (up directory stat result) result)
+  (define (skip entry stat result) result)
+  (define (error name stat errno result) result)
+  (define (leaf file stat result)
+    (if (string=? (basename file) "modalias")
+        (let* ((alias   (string-trim-right
+                         (call-with-input-file file get-string-all)))
+               (modules (matching-modules alias aliases)))
+          (load-linux-modules-from-directory modules
+                                             module-directory)
+          (append modules result))
+        result))
+
+  (file-system-fold enter? leaf down up skip error #t "/sys/devices"))
+
 ;;; linux-modules.scm ends here
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 4/6] vm: Make the virtio-blk uniquely identifiable in /sys.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:17:03 +0000
Resent-Message-ID: <handler.30604.B30604.152089298621125 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>, Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089298621125
          (code B ref 30604); Mon, 12 Mar 2018 22:17:03 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:26 +0000
Received: from localhost ([127.0.0.1]:57778 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evVk1-0005UU-Mu
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:26 -0400
Received: from eggs.gnu.org ([208.118.235.92]:39129)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evVk0-0005Tq-GX
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:24 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evVju-0004Sv-I4
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:19 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40060)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evVjs-0004S4-Hb; Mon, 12 Mar 2018 18:16:16 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evVjr-0001Ef-RW; Mon, 12 Mar 2018 18:16:16 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 23:15:39 +0100
Message-Id: <20180312221541.1886-4-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN>
 <20180312221541.1886-1-ludo@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

From: Danny Milosavljevic <dannym@HIDDEN>

* gnu/build/vm.scm (load-in-linux-vm): Set virtio-blk pci addr to 0x10.
* gnu/system/vm.scm (common-qemu-options): Set virtio-blk pci addr to 0x10.

Signed-off-by: Ludovic Courtès <ludo@HIDDEN>
---
 gnu/build/vm.scm  | 6 +++++-
 gnu/system/vm.scm | 7 ++++++-
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index fe003ea45..773b738ae 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -154,7 +154,11 @@ the #:references-graphs parameter of 'derivation'."
                                            builder)
                   (append
                    (if make-disk-image?
-                       `("-device" "virtio-blk,drive=myhd"
+
+                       ;; QEMU seems to have a bug that it doesn't assign PCI
+                       ;; IDs properly, so force the address of our virtio-blk
+                       ;; device.
+                       `("-device" "virtio-blk-pci,addr=0x10,drive=myhd"
                          "-drive" ,(string-append "if=none,file=" output
                                                   ",format=" disk-image-format
                                                   ",id=myhd"))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 91ff32ce9..4360adf15 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -677,7 +677,12 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
 
      #$@(map virtfs-option shared-fs)
      "-vga std"
-     (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly"
+
+     ;; QEMU seems to have a bug that it doesn't assign PCI IDs properly, so
+     ;; force the address of our virtio-blk device.
+     "-device" "virtio-blk-pci,addr=0x10,drive=myhd"
+
+     (format #f "-drive id=myhd,file=~a,if=none,cache=writeback,werror=report,readonly"
              #$image)))
 
 (define* (system-qemu-image/shared-store-script os
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:17:03 +0000
Resent-Message-ID: <handler.30604.B30604.152089299321152 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089299321152
          (code B ref 30604); Mon, 12 Mar 2018 22:17:03 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:33 +0000
Received: from localhost ([127.0.0.1]:57781 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evVk7-0005V1-2o
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:31 -0400
Received: from eggs.gnu.org ([208.118.235.92]:39141)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evVk1-0005Tz-An
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:25 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evVju-0004T0-Hv
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:20 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40061)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evVju-0004Sp-Co; Mon, 12 Mar 2018 18:16:18 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evVjt-0001Ef-6R; Mon, 12 Mar 2018 18:16:18 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 23:15:40 +0100
Message-Id: <20180312221541.1886-5-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN>
 <20180312221541.1886-1-ludo@HIDDEN>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

From: Danny Milosavljevic <dannym@HIDDEN>

This allows us to load modules on demand when the kernel asks for them.

* gnu/system/linux-initrd.scm (modprobe-program): New variable.
(flat-linux-module-directory): Call 'write-module-alias-database'.
(raw-initrd): Pass #:modprobe to 'boot-system' and to 'expression->initrd'.
(expression->initrd): Copy "closure" to $out/references.  Add #:modprobe
and pass it to 'build-initrd'.
* gnu/build/linux-initrd.scm (build-initrd): Add #:modprobe and honor
it.
* gnu/build/linux-boot.scm (boot-system): Add #:modprobe and honor it.
Call 'load-needed-linux-modules'.
* gnu/system/vm.scm (qemu-image): Add #:linux parameter.  Define
'modprobe-wrapper' and pass it to 'activate-modprobe'.  Pass #:linux to
'expression->derivation-in-linux-vm'.

Co-authored-by: Ludovic Courtès <ludo@HIDDEN>
---
 gnu/build/linux-boot.scm    | 13 +++++-
 gnu/build/linux-initrd.scm  | 16 ++++++--
 gnu/system/linux-initrd.scm | 97 ++++++++++++++++++++++++++++++++++++++++-----
 gnu/system/vm.scm           | 21 ++++++++++
 4 files changed, 133 insertions(+), 14 deletions(-)

diff --git a/gnu/build/linux-boot.scm b/gnu/build/linux-boot.scm
index df0b2b2d1..eedc4bb9d 100644
--- a/gnu/build/linux-boot.scm
+++ b/gnu/build/linux-boot.scm
@@ -435,6 +435,7 @@ bailing out.~%root contents: ~s~%" (scandir "/"))
 
 
 (define* (boot-system #:key
+                      modprobe
                       (linux-modules '())
                       linux-module-directory
                       qemu-guest-networking?
@@ -449,6 +450,9 @@ QEMU-GUEST-NETWORKING? is true, calling PRE-MOUNT, mounting the file systems
 specified in MOUNTS, and finally booting into the new root if any.  The initrd
 supports kernel command-line options '--load', '--root', and '--repl'.
 
+MODPROBE must be #f or a program to install as the modprobe program that the
+kernel will invoke when it needs to load modules.
+
 Mount the root file system, specified by the '--root' command-line argument,
 if any.
 
@@ -482,9 +486,14 @@ upon error."
        (when (member "--repl" args)
          (start-repl))
 
+       (when modprobe
+         ;; Tell the kernel to invoke MODPROBE.
+         (call-with-output-file "/proc/sys/kernel/modprobe"
+           (lambda (port)
+             (display modprobe port))))
+
        (display "loading kernel modules...\n")
-       (load-linux-modules-from-directory linux-modules
-                                          linux-module-directory)
+       (load-needed-linux-modules linux-module-directory)
 
        (when qemu-guest-networking?
          (unless (configure-qemu-networking)
diff --git a/gnu/build/linux-initrd.scm b/gnu/build/linux-initrd.scm
index c65b5aacf..4fa2bee7d 100644
--- a/gnu/build/linux-initrd.scm
+++ b/gnu/build/linux-initrd.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@HIDDEN>
+;;; Copyright © 2013, 2014, 2015, 2018 Ludovic Courtès <ludo@HIDDEN>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -107,12 +107,18 @@ This is similar to what 'compiled-file-name' in (system base compile) does."
 
 (define* (build-initrd output
                        #:key
-                       guile init
+                       guile init modprobe
                        (references-graphs '())
                        (gzip "gzip"))
   "Write an initial RAM disk (initrd) to OUTPUT.  The initrd starts the script
 at INIT, running GUILE.  It contains all the items referred to by
-REFERENCES-GRAPHS."
+REFERENCES-GRAPHS.
+
+When MODPROBE is true, make /sbin/modprobe a symlink to it.  This is useful
+because Linux invokes 'modprobe' when it needs to load a module and its
+default file name is '/sbin/modprobe' (see 'call_modprobe' in kernel/kmod.c).
+Creating this symlink allows us to make sure there's no time window during
+which 'modprobe' is unavailable."
   (mkdir "contents")
 
   ;; Copy the closures of all the items referenced in REFERENCES-GRAPHS.
@@ -131,6 +137,10 @@ REFERENCES-GRAPHS."
     (symlink (string-append guile "/bin/guile") "proc/self/exe")
     (readlink "proc/self/exe")
 
+    (when modprobe
+      (mkdir-p "sbin")
+      (symlink modprobe "sbin/modprobe"))
+
     ;; Reset the timestamps of all the files that will make it in the initrd.
     (for-each (lambda (file)
                 (unless (eq? 'symlink (stat:type (lstat file)))
diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 1eb5f5130..7a167146f 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -63,16 +63,87 @@
 ;;;
 ;;; Code:
 
+(define* (modprobe-program linux-module-directory #:key
+                           (guile %guile-static-stripped))
+  "Return a minimal implementation of 'modprobe' for our initrd that looks up
+modules in LINUX-MODULE-DIRECTORY.  This program will be invoked by the kernel
+when modules need to be loaded."
+  (define program
+    (with-imported-modules (source-module-closure
+                            '((gnu build linux-modules)))
+      #~(begin
+          (use-modules (gnu build linux-modules)
+                       (ice-9 match)
+                       (srfi srfi-1)
+                       (srfi srfi-26)
+                       (srfi srfi-37))
+
+          (define option-spec
+            (list (option '(#\q "quiet") #f #f
+                          (lambda (opt name arg result)
+                            (alist-cons 'quiet? #t result)))))
+
+          (define options
+            ;; Alist of options and non-option arguments.
+            (args-fold (cdr (program-arguments))
+                       option-spec
+                       (lambda (opt name arg result)
+                         (error "unrecognized option" name))
+                       (lambda (arg result)
+                         (alist-cons 'argument arg result))
+                       '()))
+
+          (define alias
+            ;; The alias we are asked to load.  The remaining arguments are
+            ;; module parameters.  In practice the kernel doesn't pass module
+            ;; parameters so we ignore them here.
+            (any (match-lambda
+                   (('argument . alias) alias)
+                   (_ #f))
+                 options))
+
+          (define linux-module-directory
+            ;; The module directory.  Note: We expect a flat directory here.
+            #$linux-module-directory)
+
+          (define %known-aliases
+            ;; The alias database.
+            (known-module-aliases
+             (string-append linux-module-directory "/modules.alias")))
+
+          (when (assq-ref options 'quiet?)
+            (current-error-port (%make-void-port "w"))
+            (current-output-port (%make-void-port "w")))
+
+          (let ((modules (matching-modules alias %known-aliases)))
+            (call-with-output-file "/dev/kmsg"
+              (lambda (port)
+                (setvbuf port 'block 1024)
+                (format port "modprobe[~a]: alias ~s; modules ~s; args ~s~%"
+                        (getpid) alias modules (program-arguments))))
+
+            (when (null? modules)
+              (error "alias resolution failed" alias))
+
+            (load-linux-modules-from-directory modules
+                                               linux-module-directory)))))
+
+  (program-file "modprobe" program #:guile guile))
 
 (define* (expression->initrd exp
                              #:key
+                             modprobe
                              (guile %guile-static-stripped)
                              (gzip gzip)
                              (name "guile-initrd")
                              (system (%current-system)))
   "Return a derivation that builds a Linux initrd (a gzipped cpio archive)
 containing GUILE and that evaluates EXP, a G-expression, upon booting.  All
-the derivations referenced by EXP are automatically copied to the initrd."
+the derivations referenced by EXP are automatically copied to the initrd.
+
+When MODPROBE is true, '/sbin/modprobe' is created as a symlink pointing to
+it.  This allows Linux to call out to MODPROBE as soon as it boots if it needs
+to load modules."
 
   ;; General Linux overview in `Documentation/early-userspace/README' and
   ;; `Documentation/filesystems/ramfs-rootfs-initramfs.txt'.
@@ -89,20 +160,21 @@ the derivations referenced by EXP are automatically copied to the initrd."
           (mkdir #$output)
 
           ;; The guile used in the initrd must be present in the store, so
-          ;; that module loading works once the root is switched.
+          ;; that module loading works once the root is switched.  Similarly,
+          ;; the 'modprobe' program installed in /proc/sys/kernel/modprobe by
+          ;; the initrd, if any, must be present after switch root.
           ;;
-          ;; To ensure that is the case, add an explicit reference to the
-          ;; guile package used in the initrd to the output.
+          ;; To ensure that is the case, add an explicit reference to these in
+          ;; the output.
           ;;
-          ;; This fixes guix-patches bug #28399, "Fix mysql activation, and
+          ;; This fixes <https://bugs.gnu.org/28399>, "Fix mysql activation, and
           ;; add a basic test".
-          (call-with-output-file (string-append #$ output "/references")
-            (lambda (port)
-              (simple-format port "~A\n" #$guile)))
+          (copy-file "closure" (string-append #$output "/references"))
 
           (build-initrd (string-append #$output "/initrd")
                         #:guile #$guile
                         #:init #$init
+                        #:modprobe #$modprobe
                         ;; Copy everything INIT refers to into the initrd.
                         #:references-graphs '("closure")
                         #:gzip (string-append #$gzip "/bin/gzip")))))
@@ -153,7 +225,9 @@ MODULES and taken from LINUX."
                       (copy-file module
                                  (string-append #$output "/"
                                                 (basename module))))
-                    (delete-duplicates modules)))))
+                    (delete-duplicates modules))
+
+          (write-module-alias-database #$output))))
 
   (computed-file "linux-modules" build-exp))
 
@@ -196,6 +270,9 @@ upon error."
   (define kodir
     (flat-linux-module-directory linux linux-modules))
 
+  (define modprobe
+    (modprobe-program kodir))
+
   (expression->initrd
    (with-imported-modules (source-module-closure
                            '((gnu build linux-boot)
@@ -229,9 +306,11 @@ upon error."
                                     (and #$@device-mapping-commands))
                       #:linux-modules '#$linux-modules
                       #:linux-module-directory '#$kodir
+                      #:modprobe #$modprobe
                       #:qemu-guest-networking? #$qemu-networking?
                       #:volatile-root? '#$volatile-root?
                       #:on-error '#$on-error)))
+   #:modprobe modprobe
    #:name "raw-initrd"))
 
 (define* (file-system-packages file-systems #:key (volatile-root? #f))
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 4360adf15..7f552bef8 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -249,6 +249,7 @@ INPUTS is a list of inputs (as for packages)."
 (define* (qemu-image #:key
                      (name "qemu-image")
                      (system (%current-system))
+                     (linux linux-libre)
                      (qemu qemu-minimal)
                      (disk-image-size 'guess)
                      (disk-image-format "qcow2")
@@ -275,18 +276,37 @@ INPUTS is a list of inputs (as for packages).  When COPY-INPUTS? is true, copy
 all of INPUTS into the image being built.  When REGISTER-CLOSURES? is true,
 register INPUTS in the store database of the image so that Guix can be used in
 the image."
+  (define modprobe-wrapper
+    ;; Wrapper for the 'modprobe' command that knows where modules live.
+    (let ((modprobe (file-append kmod "/bin/modprobe")))
+      (program-file "modprobe"
+                    #~(begin
+                        (setenv "LINUX_MODULE_DIRECTORY"
+                                #$(file-append linux "/lib/modules"))
+                        (apply execl #$modprobe
+                               (cons #$modprobe (cdr (command-line))))))))
+
+
   (expression->derivation-in-linux-vm
    name
    (with-imported-modules (source-module-closure '((gnu build bootloader)
                                                    (gnu build vm)
+                                                   (gnu build activation)
                                                    (guix build utils)))
      #~(begin
          (use-modules (gnu build bootloader)
                       (gnu build vm)
+                      ((gnu build activation) #:select (activate-modprobe))
                       (guix build utils)
                       (srfi srfi-26)
                       (ice-9 binary-ports))
 
+         ;; We may need to lazy-load Linux modules.  The initrd installs a
+         ;; 'modprobe' that can only search through the modules available in
+         ;; the initrd, but here we want to be able to use all the modules of
+         ;; LINUX.  Thus, install a real 'modprobe'.
+         (activate-modprobe #$modprobe-wrapper)
+
          (let ((inputs
                 '#$(append (list qemu parted e2fsprogs dosfstools)
                            (map canonical-package
@@ -361,6 +381,7 @@ the image."
                                    #$(bootloader-installer bootloader))
              (reboot)))))
    #:system system
+   #:linux linux
    #:make-disk-image? #t
    #:disk-image-size disk-image-size
    #:disk-image-format disk-image-format
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 6/6] linux-modules: Add "modules.devname" writer.
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:17:04 +0000
Resent-Message-ID: <handler.30604.B30604.152089299321158 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089299321158
          (code B ref 30604); Mon, 12 Mar 2018 22:17:04 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:16:33 +0000
Received: from localhost ([127.0.0.1]:57783 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evVk8-0005V7-UR
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:33 -0400
Received: from eggs.gnu.org ([208.118.235.92]:39157)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evVk3-0005U8-O4
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:27 -0400
Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
 (envelope-from <ludo@HIDDEN>) id 1evVjx-0004U0-K1
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:16:22 -0400
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org
X-Spam-Level: 
X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,T_RP_MATCHES_RCVD
 autolearn=disabled version=3.3.2
Received: from fencepost.gnu.org ([2001:4830:134:3::e]:40062)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1evVjv-0004TL-J6; Mon, 12 Mar 2018 18:16:19 -0400
Received: from vpn-0-27.aquilenet.fr ([2a0c:e300:4:27::]:48406 helo=gnu.org)
 by fencepost.gnu.org with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1evVjv-0001Ef-1U; Mon, 12 Mar 2018 18:16:19 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Date: Mon, 12 Mar 2018 23:15:41 +0100
Message-Id: <20180312221541.1886-6-ludo@HIDDEN>
X-Mailer: git-send-email 2.16.2
In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN>
 <20180312221541.1886-1-ludo@HIDDEN>
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Received-From: 2001:4830:134:3::e
X-Spam-Score: -5.0 (-----)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -5.0 (-----)

* gnu/build/linux-modules.scm (aliases->device-tuple)
(write-module-device-database): New procedures.

Co-authored-by: Danny Milosavljevic <dannym@HIDDEN>.
---
 gnu/build/linux-modules.scm | 51 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 55161e026..d3ba2c60a 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -47,6 +47,8 @@
             known-module-aliases
             matching-modules
             write-module-alias-database
+            write-module-device-database
+
             load-needed-linux-modules))
 
 ;;; Commentary:
@@ -415,6 +417,55 @@ ALIAS is a string like \"scsi:t-0x00\" as returned by
                              aliases)))
                 aliases))))
 
+(define (aliases->device-tuple aliases)
+  "Traverse ALIASES, a list of module aliases, and search for
+\"char-major-M-N\", \"block-major-M-N\", or \"devname:\" aliases.  When they
+are found, return a tuple (DEVNAME TYPE MAJOR MINOR), otherwise return #f."
+  (define (char/block-major? alias)
+    (or (string-prefix? "char-major-" alias)
+        (string-prefix? "block-major-" alias)))
+
+  (define (char/block-major->tuple alias)
+    (match (string-tokenize alias %not-dash)
+      ((type "major" (= string->number major) (= string->number minor))
+       (list (match type
+               ("char" "c")
+               ("block" "b"))
+             major minor))))
+
+  (let* ((devname     (any (lambda (alias)
+                             (and (string-prefix? "devname:" alias)
+                                  (string-drop alias 8)))
+                           aliases))
+         (major/minor (match (find char/block-major? aliases)
+                        (#f #f)
+                        (str (char/block-major->tuple str)))))
+    (and devname major/minor
+         (cons devname major/minor))))
+
+(define %not-dash
+  (char-set-complement (char-set #\-)))
+
+(define (write-module-device-database directory)
+  "Traverse the '.ko' files in DIRECTORY and create the corresponding
+'modules.devname' file.  This file contains information about modules that can
+be loaded on-demand, such as file system modules."
+  (define aliases
+    (filter-map (lambda (file)
+                  (match (aliases->device-tuple (module-aliases file))
+                    (#f #f)
+                    (tuple (cons (file-name->module-name file) tuple))))
+                (find-files directory "\\.ko$")))
+
+  (call-with-output-file (string-append "/tmp" "/modules.devname")
+    (lambda (port)
+      (display "# Device nodes to trigger on-demand module loading.\n" port)
+      (for-each (match-lambda
+                  ((module devname type major minor)
+                   (format port "~a ~a ~a~a:~a~%"
+                           module devname type major minor)))
+                aliases))))
+
 (define (load-needed-linux-modules module-directory)
   "Examine /sys/devices to find out which modules are needed and load those we
 have in MODULE-DIRECTORY.  Return the list of modules loaded, not including
-- 
2.16.2





Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 1/6] linux-modules: Add "modules.alias" writer.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:49:02 +0000
Resent-Message-ID: <handler.30604.B30604.152089490424506 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089490424506
          (code B ref 30604); Mon, 12 Mar 2018 22:49:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:48:24 +0000
Received: from localhost ([127.0.0.1]:57798 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evWEx-0006NC-WE
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:48:24 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:46992)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evWEw-0006N4-PG
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:48:23 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 1253233600C4;
 Mon, 12 Mar 2018 23:48:20 +0100 (CET)
Date: Mon, 12 Mar 2018 23:48:14 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312234814.6b89aecc@HIDDEN>
In-Reply-To: <20180312221541.1886-1-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN>
	<20180312221541.1886-1-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/0frEtQHqINaKL5_ykn_CP8K"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/0frEtQHqINaKL5_ykn_CP8K
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

On Mon, 12 Mar 2018 23:15:36 +0100
Ludovic Court=C3=A8s <ludo@HIDDEN> wrote:

> (%not-dash): New variable.

Old commit message?

Otherwise LGTM!

--Sig_/0frEtQHqINaKL5_ykn_CP8K
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnA64ACgkQ5xo1VCww
uqVHgwf7BoMySgvE89KaihiVsydHIYT6X+ewGMl4O+hJqVk/qLunMnIp9bEwSoOt
HzwIRt1iZwVPVkZUKkvnb3KDrL5OiDPGhTMOxntfdjHCnxU9WnCo/5K5SJEu5QJA
H0Bnr16fHa9O8e5Po+1fCbS8lASoNVRuod7/7MaHOy5Q8h/8k7smwXL5m4oNPxKL
Dc8CtM2bCOmr/WimkMqkdyWbEswZRQ/ZpX2qbKhGdaYkhvydQhxPmskSpkyWPga6
blmVj1z/7ylLux0YNGPB0Eg1Gatga+enCQlJmP8DqDKgCj1OXS2r58HQWKGCj4ZR
183Umm1tGLdgSgY49SGmEVEs9y2pXw==
=vuYP
-----END PGP SIGNATURE-----

--Sig_/0frEtQHqINaKL5_ykn_CP8K--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 2/6] linux-modules: Add 'load-linux-modules-from-directory'.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:49:02 +0000
Resent-Message-ID: <handler.30604.B30604.152089492324560 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089492324560
          (code B ref 30604); Mon, 12 Mar 2018 22:49:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:48:43 +0000
Received: from localhost ([127.0.0.1]:57801 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evWFH-0006O4-8k
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:48:43 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:47014)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evWFF-0006Nt-Th
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:48:42 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id D7FF533600C4;
 Mon, 12 Mar 2018 23:48:40 +0100 (CET)
Date: Mon, 12 Mar 2018 23:48:36 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312234836.106e2eb0@HIDDEN>
In-Reply-To: <20180312221541.1886-2-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-2-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/qThaS.wj._AuZt.lYG_5z10"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/qThaS.wj._AuZt.lYG_5z10
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

LGTM!

--Sig_/qThaS.wj._AuZt.lYG_5z10
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnA8QACgkQ5xo1VCww
uqU5RAf/RcXh3olPJFZykEZMmUHATzkHioRJD3XilWmU0row0mm1LZR4PzN/tuRm
ASvxkAvXbTc/FeoFU22rLJAv5vY8WfXCFk3NS2PDI7eNyVaeW3wt/qZE4FYiIi9C
oHFzAh+q1v+AHyxly4FhNpGID4XGoCPPDU4/FcRHDvVjBaDR7wjebBluZAxz7/DC
z9CYLPGLTdaxHeNIvW+BRaKfAQrj3tEtKim3RIQbE8rSWFEtj0wYZ/zEwB1IQBRA
oV4X40vz1FG1JkGSNWO/mDD8yJQ8m4XJfOIhfWK2pLWTgknh1X0ShfYUPQY7PbHk
PvMjaWU1xpdu2mOtnivV5Dr5NqkbHA==
=4f2L
-----END PGP SIGNATURE-----

--Sig_/qThaS.wj._AuZt.lYG_5z10--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 4/6] vm: Make the virtio-blk uniquely identifiable in /sys.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:50:02 +0000
Resent-Message-ID: <handler.30604.B30604.152089496624669 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089496624669
          (code B ref 30604); Mon, 12 Mar 2018 22:50:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:49:26 +0000
Received: from localhost ([127.0.0.1]:57806 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evWFy-0006Pp-G5
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:49:26 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:47088)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evWFx-0006Pi-D7
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:49:25 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 56AA933600C4;
 Mon, 12 Mar 2018 23:49:24 +0100 (CET)
Date: Mon, 12 Mar 2018 23:49:22 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312234922.14fc6425@HIDDEN>
In-Reply-To: <20180312221541.1886-4-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-4-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/MUUK7.39GCW=rUC2B8yCdwu"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/MUUK7.39GCW=rUC2B8yCdwu
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

LGTM!

--Sig_/MUUK7.39GCW=rUC2B8yCdwu
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnA/IACgkQ5xo1VCww
uqUC9Qf9GftT17RdFjms1zaPaJXnpZKbClxAvlZD1xLNy3muQXYcznwdEl+rZs6s
YSeDaUhblppXsORQBjcuNJkgp0/dx6hsdZGmjgChwxNyGxcBHQgGUmf6BuUYwt//
2q4EFmcA/rjXGUj9BdX6n5tdPFXHFZtXA0dUNiWx95j+/6gY+8BqLuovn7vlxrBR
32MpR9o5gapDgRABtI+OYxwuPofwIAnSscyxnVFHkm/PA5Bh62KDyLuJYP6eMqpi
xdCEWuzaGpZw3TarvjTuqwsAoPdWsJ15kHeEU6I5cfH8/W9bqt/kJQt/Z3wERaQN
4WLepIiJ917ijx54RtGtMuUyj/Pkww==
=4Olm
-----END PGP SIGNATURE-----

--Sig_/MUUK7.39GCW=rUC2B8yCdwu--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 6/6] linux-modules: Add "modules.devname" writer.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 22:56:02 +0000
Resent-Message-ID: <handler.30604.B30604.152089535625302 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089535625302
          (code B ref 30604); Mon, 12 Mar 2018 22:56:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 22:55:56 +0000
Received: from localhost ([127.0.0.1]:57811 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evWMG-0006a2-8o
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:55:56 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:47486)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evWME-0006Zu-7B
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 18:55:54 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 3E53833600C4;
 Mon, 12 Mar 2018 23:55:52 +0100 (CET)
Date: Mon, 12 Mar 2018 23:55:46 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180312235547.6ac0af0a@HIDDEN>
In-Reply-To: <20180312221541.1886-6-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-6-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/bBw2Tipy.+Q3VfgtMZPEXBM"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/bBw2Tipy.+Q3VfgtMZPEXBM
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

> +  (call-with-output-file (string-append "/tmp" "/modules.devname")
                                           ^^^^^^ directory

Otherwise LGTM!

--Sig_/bBw2Tipy.+Q3VfgtMZPEXBM
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnBXMACgkQ5xo1VCww
uqUZ3Qf+MApqVj/sHxKgauy8+bnT5EbH1jEqXkqa/BGsD95wRG5WodT0AZi0iRBv
wv8mIC8vOl4VS9pcmQSPBvdkIX21RB29Bqrf8CtaThTDqYI8Z5N5izWJLqP2uFan
MJC6ckHcokY/WpTXB+kNZUCfyqvQgqLEaAWb/5JtuPNRQl8ogcX2ccpQosr16f7D
EUplZLt61zHZj90BJBmqmfUk7oWw/PMUw+A2+yNUk4PgQnDQ0R8it+tNDs20ahQX
6Gs2YkDOYtwteWXQnKQOL4cgy7lp9Xck5GnTDpJU21wSYxnePg1CwNjRdfJsGft0
kMS7X1UKiFxrZwg8TUNWxWGuMDLzGA==
=2nsk
-----END PGP SIGNATURE-----

--Sig_/bBw2Tipy.+Q3VfgtMZPEXBM--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 3/6] linux-modules: Add 'load-needed-linux-modules'.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 12 Mar 2018 23:01:02 +0000
Resent-Message-ID: <handler.30604.B30604.152089563925830 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152089563925830
          (code B ref 30604); Mon, 12 Mar 2018 23:01:02 +0000
Received: (at 30604) by debbugs.gnu.org; 12 Mar 2018 23:00:39 +0000
Received: from localhost ([127.0.0.1]:57815 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evWQo-0006iX-P2
	for submit <at> debbugs.gnu.org; Mon, 12 Mar 2018 19:00:38 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:47852)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evWQm-0006iP-P9
 for 30604 <at> debbugs.gnu.org; Mon, 12 Mar 2018 19:00:37 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id AE84C3360290;
 Tue, 13 Mar 2018 00:00:35 +0100 (CET)
Date: Tue, 13 Mar 2018 00:00:31 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180313000031.06767edf@HIDDEN>
In-Reply-To: <20180312221541.1886-3-ludo@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-3-ludo@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/DIw3c_UiGS0K62uF_LkfGGo"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/DIw3c_UiGS0K62uF_LkfGGo
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

> +(define (load-needed-linux-modules module-directory)
[...]
> +  (file-system-fold enter? leaf down up skip error #t "/sys/devices"))

Isn't #t a strange initial value?  Shouldn't it be '() ?

--Sig_/DIw3c_UiGS0K62uF_LkfGGo
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnBo8ACgkQ5xo1VCww
uqUgxAgAjg3Z/ieFvl0Up29vWcWFDgAx7wbEyTmyPlzbcJv6Y64smPzrWawa05vJ
OUi80fg9cnoANXuEdVKslegj48YbpsYtcPC08hUS+Ccjl8KJc7frPtZHUXZ8mPzA
v4V0wUxvaT+SW5BxCI6ancAZJdRutQVh9Nxztb2bLqnnagxAVXn/Aeqy5tLQUYjR
HulvVPHEKyI7RwDAjhm8IFSvuks3IUp5yOnh36GxhQaqdwvuhW5o6iZHjS7R8LER
BXo8NiAK3/RhOiUx7I/i72avNHqp4tnAPDpSRGm2O1fSS3WD+ZCf1vdEvdq5u+E4
oUVZalTFyual5SDiC4ZsvDxtrM/00A==
=tBne
-----END PGP SIGNATURE-----

--Sig_/DIw3c_UiGS0K62uF_LkfGGo--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 08:51:01 +0000
Resent-Message-ID: <handler.30604.B30604.152093104619533 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152093104619533
          (code B ref 30604); Tue, 13 Mar 2018 08:51:01 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 08:50:46 +0000
Received: from localhost ([127.0.0.1]:57993 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evfdt-00054z-VV
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:50:46 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:58012)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evfdr-00054p-Pe
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:50:44 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 96753125AF;
 Tue, 13 Mar 2018 09:50:42 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id NcE1BZd0W6ME; Tue, 13 Mar 2018 09:50:41 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 66D1F12572;
 Tue, 13 Mar 2018 09:50:41 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-5-ludo@HIDDEN>
Date: Tue, 13 Mar 2018 09:50:40 +0100
In-Reply-To: <20180312221541.1886-5-ludo@HIDDEN> ("Ludovic
 \=\?utf-8\?Q\?Cour\?\= \=\?utf-8\?Q\?t\=C3\=A8s\=22's\?\= message
 of "Mon, 12 Mar 2018 23:15:40 +0100")
Message-ID: <87fu54fjfj.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hello!

I=E2=80=99m using this on the bare metal.  \o/

I had to make this change so that dm-crypt would be loaded once I=E2=80=99ve
entered my passphrase:


--=-=-=
Content-Type: text/x-patch
Content-Disposition: inline

diff --git a/gnu/system/linux-initrd.scm b/gnu/system/linux-initrd.scm
index 7a167146f..ef81fe718 100644
--- a/gnu/system/linux-initrd.scm
+++ b/gnu/system/linux-initrd.scm
@@ -115,16 +115,19 @@ when modules need to be loaded."
             (current-error-port (%make-void-port "w"))
             (current-output-port (%make-void-port "w")))
 
-          (let ((modules (matching-modules alias %known-aliases)))
+          ;; Look up ALIAS in %KNOWN-ALIASES first, and then, if it fails,
+          ;; assume that ALIAS is a module name (some modules such as
+          ;; 'dm-crypt' don't have an alias.)  Note that
+          ;; 'kmod_module_new_from_lookup' uses a different search order.
+          (let ((modules (match (matching-modules alias %known-aliases)
+                           (()  (list alias))
+                           (lst lst))))
             (call-with-output-file "/dev/kmsg"
               (lambda (port)
                 (setvbuf port 'block 1024)
                 (format port "modprobe[~a]: alias ~s; modules ~s; args ~s~%"
                         (getpid) alias modules (program-arguments))))
 
-            (when (null? modules)
-              (error "alias resolution failed" alias))
-
             (load-linux-modules-from-directory modules
                                                linux-module-directory)))))
 

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable


FWIW I have:

--8<---------------cut here---------------start------------->8---
modprobe[146]: alias "net-pf-38"; modules ("net-pf-38"); args ("/gnu/store/=
v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "net-pf-38")
modprobe[152]: alias "dm-crypt"; modules ("dm-crypt"); args ("/gnu/store/v0=
ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "dm-crypt")
modprobe[157]: alias "crypto-xts(aes)"; modules ("crypto-xts(aes)"); args (=
"/gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-xt=
s(aes)")
modprobe[162]: alias "crypto-xts(aes)-all"; modules ("crypto-xts(aes)-all")=
; args ("/gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "c=
rypto-xts(aes)-all")
modprobe[168]: alias "crypto-xts"; modules ("xts"); args ("/gnu/store/v0ay3=
02yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-xts")
nfo>  [1520929735.4127] manager[0x12950c0]: monitoring kernel firmware dire=
ctory '/lib/firmware'.
modprobe[173]: alias "crypto-aes"; modules ("crypto-aes"); args ("/gnu/stor=
e/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-aes")
modprobe[178]: alias "crypto-aes-all"; modules ("crypto-aes-all"); args ("/=
gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-aes-=
all")
modprobe[183]: alias "crypto-ecb(aes)"; modules ("crypto-ecb(aes)"); args (=
"/gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "crypto-ec=
b(aes)")
modprobe[188]: alias "crypto-ecb(aes)-all"; modules ("crypto-ecb(aes)-all")=
; args ("/gnu/store/v0ay302yib6j6ysr0pd1yphm00nlzkxh-modprobe" "-q" "--" "c=
rypto-ecb(aes)-all")
--8<---------------cut here---------------end--------------->8---

Something annoying is that my external USB keyboard doesn=E2=80=99t work wh=
ile
in the initrd (when I type my passphrase).  I can see that it=E2=80=99s det=
ected
early on, before I type my passphrase:

--8<---------------cut here---------------start------------->8---
[    1.532237] usb 1-4.2: new low-speed USB device number 4 using xhci_hcd
[    1.648836] usb 1-4.2: New USB device found, idVendor=3D413c, idProduct=
=3D2105
[    1.649189] usb 1-4.2: New USB device strings: Mfr=3D1, Product=3D2, Ser=
ialNumber=3D0
[    1.649533] usb 1-4.2: Product: Dell USB Keyboard
[    1.649882] usb 1-4.2: Manufacturer: Dell
--8<---------------cut here---------------end--------------->8---

but its modules don=E2=80=99t get loaded until after eudev has been started=
, and
there=E2=80=99s no trace of a modprobe invocation for it.

--8<---------------cut here---------------start------------->8---
[   20.968938] input: Dell Dell USB Keyboard as /devices/pci0000:00/0000:00=
:14.0/usb1/1-4/1-4.2/1-4.2:1.0/0003:413C:2105.0001/input/input16
--8<---------------cut here---------------end--------------->8---

Any idea what we=E2=80=99re missing?

Thanks,
Ludo=E2=80=99.

--=-=-=--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 08:55:02 +0000
Resent-Message-ID: <handler.30604.B30604.152093130119929 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152093130119929
          (code B ref 30604); Tue, 13 Mar 2018 08:55:02 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 08:55:01 +0000
Received: from localhost ([127.0.0.1]:57997 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evfhz-0005BM-Mc
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:55:01 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:58044)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evfhx-0005BC-7W
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:54:57 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 7A097125B1;
 Tue, 13 Mar 2018 09:54:56 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id koZNniL82WHx; Tue, 13 Mar 2018 09:54:55 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 7BEC712572;
 Tue, 13 Mar 2018 09:54:55 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-5-ludo@HIDDEN>
 <20180312210936.7f89a29c@HIDDEN>
 <20180312221226.72eb6cb7@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 23 =?UTF-8?Q?Vent=C3=B4se?= an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Tue, 13 Mar 2018 09:54:55 +0100
In-Reply-To: <20180312221226.72eb6cb7@HIDDEN> (Danny Milosavljevic's
 message of "Mon, 12 Mar 2018 22:12:26 +0100")
Message-ID: <87bmfsfj8g.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Danny Milosavljevic <dannym@HIDDEN> skribis:

>> That was why earlier I kept /sbin/modprobe as the name (it's the
>> default Linux uses) and made sure that the file /sbin/modprobe is already
>> in the initrd (as opposed to created by boot-system).
>
> Note: The simplest change would be to keep this patch as-is but add=20
>
>     ;; Make sure that Linux can modprobe even before boot-system started =
up.
>     (when modprobe
>       (mkdir-p "sbin")
>       (symlink modprobe "sbin/modprobe")
>       (compile-to-cache "sbin/modprobe")) ; Note: without this line booti=
ng is dead slow. [Maybe in this case that wouldn't be so bad - since boot-s=
ystem switches away immediately anyway :)]
>
> to gnu/build/linux-initrd.scm

Yeah, done.  Ideally =E2=80=98program-file=E2=80=99 would take care of this=
.  Future
work!

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 3/6] linux-modules: Add 'load-needed-linux-modules'.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 08:56:02 +0000
Resent-Message-ID: <handler.30604.B30604.152093135820038 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152093135820038
          (code B ref 30604); Tue, 13 Mar 2018 08:56:02 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 08:55:58 +0000
Received: from localhost ([127.0.0.1]:58001 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evfiw-0005D8-J6
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:55:58 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:58064)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evfiv-0005Cz-5Q
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:55:57 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 3E3D2125B2;
 Tue, 13 Mar 2018 09:55:56 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id xeXLrwfJREpr; Tue, 13 Mar 2018 09:55:55 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 5B20F125B1;
 Tue, 13 Mar 2018 09:55:55 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-3-ludo@HIDDEN>
 <20180313000031.06767edf@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 23 =?UTF-8?Q?Vent=C3=B4se?= an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Tue, 13 Mar 2018 09:55:54 +0100
In-Reply-To: <20180313000031.06767edf@HIDDEN> (Danny Milosavljevic's
 message of "Tue, 13 Mar 2018 00:00:31 +0100")
Message-ID: <877eqgfj6t.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Danny Milosavljevic <dannym@HIDDEN> skribis:

>> +(define (load-needed-linux-modules module-directory)
> [...]
>> +  (file-system-fold enter? leaf down up skip error #t "/sys/devices"))
>
> Isn't #t a strange initial value?  Shouldn't it be '() ?

Indeed!  Fixed, thanks.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 6/6] linux-modules: Add "modules.devname" writer.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 08:57:02 +0000
Resent-Message-ID: <handler.30604.B30604.152093140320129 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152093140320129
          (code B ref 30604); Tue, 13 Mar 2018 08:57:02 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 08:56:43 +0000
Received: from localhost ([127.0.0.1]:58005 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evfje-0005Eb-VS
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:56:43 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:58080)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evfjc-0005ET-Tn
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 04:56:41 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 62704125B2;
 Tue, 13 Mar 2018 09:56:40 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id jQWiA658I8Bs; Tue, 13 Mar 2018 09:56:39 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 7303D125B1;
 Tue, 13 Mar 2018 09:56:39 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-6-ludo@HIDDEN>
 <20180312235547.6ac0af0a@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 23 =?UTF-8?Q?Vent=C3=B4se?= an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Tue, 13 Mar 2018 09:56:39 +0100
In-Reply-To: <20180312235547.6ac0af0a@HIDDEN> (Danny Milosavljevic's
 message of "Mon, 12 Mar 2018 23:55:46 +0100")
Message-ID: <873714fj5k.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Danny Milosavljevic <dannym@HIDDEN> skribis:

>> +  (call-with-output-file (string-append "/tmp" "/modules.devname")
>                                            ^^^^^^ directory
>
> Otherwise LGTM!

Oops, fixed!




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 09:28:02 +0000
Resent-Message-ID: <handler.30604.B30604.152093323523472 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152093323523472
          (code B ref 30604); Tue, 13 Mar 2018 09:28:02 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 09:27:15 +0000
Received: from localhost ([127.0.0.1]:58073 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evgDC-00066U-VX
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:27:15 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:36556)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evgDB-00066M-1F
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:27:13 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id E6B2D33613E9;
 Tue, 13 Mar 2018 10:27:10 +0100 (CET)
Date: Tue, 13 Mar 2018 10:27:06 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180313100539.442c4aa9@HIDDEN>
In-Reply-To: <87h8plkkkc.fsf@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-5-ludo@HIDDEN>
 <20180312210936.7f89a29c@HIDDEN> <87h8plkkkc.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/sH6RIRsnItffXX8vE6x800c"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/sH6RIRsnItffXX8vE6x800c
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

On Mon, 12 Mar 2018 23:14:59 +0100
ludo@HIDDEN (Ludovic Court=C3=A8s) wrote:

> > One of the devnames created statically is the one for btrfs, so not wri=
ting or
> > using devnames is not going to end well. =20
>=20
> We=E2=80=99re fine because btrfs, 9p, overlay, etc. all have an =E2=80=9C=
fs-btrfs=E2=80=9D,
> =E2=80=9Cfs-9p=E2=80=9D, etc. alias, which shows up in =E2=80=9Cmodules.a=
lias=E2=80=9D.  No need for
> =E2=80=9Cmodules.devname=E2=80=9D AFAICS.

The other filesystems are not such a problem - but BTRFS has its own snapsh=
otting/
multivolume functionality - and it's possible that someone accesses /dev/bt=
rfs-control
"too early" for that.

I applied your patches to a fresh clone of guix master now, ran the btrfs-r=
oot-os
system check, and indeed I get (tried two rounds, happened both times):

$ make TESTS=3Dbtrfs-root-os check-system
[...]
Scanning for Btrfs filesystems
WARNING: failed to open /dev/btrfs-control, skipping device registration: N=
o suy
ERROR: there are 1 errors while registering devices
File system check on /dev/vda2 failed; spawning Bourne-like REPL
GNU Guile 2.2.3
Copyright (C) 1995-2017 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
(can't evaluate anything here)

> > (I'd also copy the modules.builtin (from Linux).
> >  Also, what happens if we load a module which has as dependency a built=
in?
> >  Will we try to load the builtin as a .ko file and fail the entire thin=
g?) =20
>=20
> The dependency of a builtin is necessarily a builtin,=20

Yes.

>and the kernel won=E2=80=99t invoke modprobe for a builtin, will it? =20

I've read Linux's __request_module and I can't find where they
pre-check anything - neither whether there's already a builtin
nor whether it's loaded already.

They probably don't check.  But I'll read it again, more carefully...

(request_module isn't that popular so it makes sense for them not to compli=
cate
the kernel by these checks when there are like 8 callers in total - and all=
 on init)

>Thanks for the insightful review!

You're welcome :)

--Sig_/sH6RIRsnItffXX8vE6x800c
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnmWoACgkQ5xo1VCww
uqWYNQf+JldN8uxgw6yQsYw8jQ9KKV5ilkDItpc6iw+L5Sl3JsYovJ/ABc6JX5m6
nOuQHU4f1rjqJS5kqpFW/qOJbk+3tJSNfRuleJUdKjHfzp3qtTLLYOsN3fTF7OSI
fqN2zqS0y5o/C/T1Ienr7Qx+oC6u56smD1FyoLELJDmL8vGj0qUjNytilqavqxwR
cwtlGxaREEHmuIB2UjNCXUTUdgw5SDS8Dga/x53AvOEIBsc61Cjyd+j/jzoH3NYC
g/reldxXWMPq/DlSkil2293jbnK11+5K/6do+bf5a7uoEdE8E5gKZFqrze7ZiwRS
rfgNmo0u7rv146A2b1bNEw1XgZ9tPw==
=fti+
-----END PGP SIGNATURE-----

--Sig_/sH6RIRsnItffXX8vE6x800c--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 09:29:01 +0000
Resent-Message-ID: <handler.30604.B30604.152093333623635 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152093333623635
          (code B ref 30604); Tue, 13 Mar 2018 09:29:01 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 09:28:56 +0000
Received: from localhost ([127.0.0.1]:58078 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evgEq-000698-B7
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:28:56 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:58300)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evgEo-000690-QT
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:28:55 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 453C9125CD;
 Tue, 13 Mar 2018 10:28:54 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id Yx1kwIue8iEg; Tue, 13 Mar 2018 10:28:53 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 6900D12592;
 Tue, 13 Mar 2018 10:28:53 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN>
Date: Tue, 13 Mar 2018 10:28:52 +0100
In-Reply-To: <87fu54fjfj.fsf@HIDDEN> ("Ludovic
 \=\?utf-8\?Q\?Court\=C3\=A8s\=22'\?\=
 \=\?utf-8\?Q\?s\?\= message of "Tue, 13 Mar 2018 09:50:40 +0100")
Message-ID: <876060qq7f.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="=-=-="
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

ludo@HIDDEN (Ludovic Court=C3=A8s) skribis:

> Something annoying is that my external USB keyboard doesn=E2=80=99t work =
while
> in the initrd (when I type my passphrase).  I can see that it=E2=80=99s d=
etected
> early on, before I type my passphrase:

I tried looking up =E2=80=9Cmodalias=E2=80=9D right when entering a /sys/de=
vices
directory, like you did in the initial patch, but that didn=E2=80=99t help:


--=-=-=
Content-Type: text/x-patch
Content-Disposition: inline

diff --git a/gnu/build/linux-modules.scm b/gnu/build/linux-modules.scm
index 4515839e9..213a8bbb9 100644
--- a/gnu/build/linux-modules.scm
+++ b/gnu/build/linux-modules.scm
@@ -480,19 +480,22 @@ side-effect and would thus need to traverse /sys/devices again."
      (string-append module-directory "/modules.alias")))
 
   (define (enter? director stat result) result)
-  (define (down directory stat result) result)
-  (define (up directory stat result) result)
-  (define (skip entry stat result) result)
-  (define (error name stat errno result) result)
-  (define (leaf file stat result)
-    (if (string=? (basename file) "modalias")
+  (define (down directory stat result)
+    ;; Check for "modalias" right when entering DIRECTORY instead of waiting
+    ;; for LEAF to be called.  XXX: Doesn't help!
+    (let ((modalias (string-append directory "/modalias")))
+      (if (file-exists? modalias)
           (let* ((alias   (string-trim-right
-                         (call-with-input-file file get-string-all)))
+                           (call-with-input-file modalias get-string-all)))
                  (modules (matching-modules alias aliases)))
             (load-linux-modules-from-directory modules
                                                module-directory)
             (append modules result))
-        result))
+          result)))
+  (define (up directory stat result) result)
+  (define (skip entry stat result) result)
+  (define (error name stat errno result) result)
+  (define (leaf file stat result) file stat result)
 
   (file-system-fold enter? leaf down up skip error '() "/sys/devices"))
 

--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64

DQpMdWRv4oCZLg0K
--=-=-=--




Message received at control <at> debbugs.gnu.org:


Received: (at control) by debbugs.gnu.org; 13 Mar 2018 09:29:09 +0000
From debbugs-submit-bounces <at> debbugs.gnu.org Tue Mar 13 05:29:08 2018
Received: from localhost ([127.0.0.1]:58082 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evgF2-00069z-LI
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:29:08 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:58304)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evgF1-00069r-3J
 for control <at> debbugs.gnu.org; Tue, 13 Mar 2018 05:29:07 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 9B9B5125CD
 for <control <at> debbugs.gnu.org>; Tue, 13 Mar 2018 10:29:06 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id OqLQSxxRHR_T for <control <at> debbugs.gnu.org>;
 Tue, 13 Mar 2018 10:29:06 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id F041512592
 for <control <at> debbugs.gnu.org>; Tue, 13 Mar 2018 10:29:05 +0100 (CET)
Date: Tue, 13 Mar 2018 10:29:05 +0100
Message-Id: <874llkqq72.fsf@HIDDEN>
To: control <at> debbugs.gnu.org
From: ludo@HIDDEN (Ludovic =?utf-8?Q?Court=C3=A8s?=)
Subject: control message for bug #30604
MIME-version: 1.0
Content-type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Spam-Score: 1.0 (+)
X-Debbugs-Envelope-To: control
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

severity 30604 important




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 10:52:02 +0000
Resent-Message-ID: <handler.30604.B30604.152093830714779 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152093830714779
          (code B ref 30604); Tue, 13 Mar 2018 10:52:02 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 10:51:47 +0000
Received: from localhost ([127.0.0.1]:58132 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evhX1-0003qJ-EI
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 06:51:47 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:58830)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1evhWz-0003q9-FD
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 06:51:46 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 33E53125F4;
 Tue, 13 Mar 2018 11:51:44 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id JmJFb8LwayUe; Tue, 13 Mar 2018 11:51:43 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 1D0A01128C;
 Tue, 13 Mar 2018 11:51:43 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-5-ludo@HIDDEN>
 <20180312210936.7f89a29c@HIDDEN> <87h8plkkkc.fsf@HIDDEN>
 <20180313100539.442c4aa9@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 23 =?UTF-8?Q?Vent=C3=B4se?= an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Tue, 13 Mar 2018 11:51:42 +0100
In-Reply-To: <20180313100539.442c4aa9@HIDDEN> (Danny Milosavljevic's
 message of "Tue, 13 Mar 2018 10:27:06 +0100")
Message-ID: <87zi3cp7sx.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Hello,

Danny Milosavljevic <dannym@HIDDEN> skribis:

> On Mon, 12 Mar 2018 23:14:59 +0100
> ludo@HIDDEN (Ludovic Court=C3=A8s) wrote:
>
>> > One of the devnames created statically is the one for btrfs, so not wr=
iting or
>> > using devnames is not going to end well.=20=20
>>=20
>> We=E2=80=99re fine because btrfs, 9p, overlay, etc. all have an =E2=80=
=9Cfs-btrfs=E2=80=9D,
>> =E2=80=9Cfs-9p=E2=80=9D, etc. alias, which shows up in =E2=80=9Cmodules.=
alias=E2=80=9D.  No need for
>> =E2=80=9Cmodules.devname=E2=80=9D AFAICS.
>
> The other filesystems are not such a problem - but BTRFS has its own snap=
shotting/
> multivolume functionality - and it's possible that someone accesses /dev/=
btrfs-control
> "too early" for that.
>
> I applied your patches to a fresh clone of guix master now, ran the btrfs=
-root-os
> system check, and indeed I get (tried two rounds, happened both times):
>
> $ make TESTS=3Dbtrfs-root-os check-system
> [...]
> Scanning for Btrfs filesystems
> WARNING: failed to open /dev/btrfs-control, skipping device registration:=
 No suy
> ERROR: there are 1 errors while registering devices
> File system check on /dev/vda2 failed; spawning Bourne-like REPL
> GNU Guile 2.2.3
> Copyright (C) 1995-2017 Free Software Foundation, Inc.
>
> Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
> This program is free software, and you are welcome to redistribute it
> under certain conditions; type `,show c' for details.
>
> Enter `,help' for help.

Do you see a modprobe invocation for =E2=80=9Cfs-btrfs=E2=80=9D or =E2=80=
=9Cblock-major-xxx=E2=80=9D
before?

>> > (I'd also copy the modules.builtin (from Linux).
>> >  Also, what happens if we load a module which has as dependency a buil=
tin?
>> >  Will we try to load the builtin as a .ko file and fail the entire thi=
ng?)=20=20
>>=20
>> The dependency of a builtin is necessarily a builtin,=20
>
> Yes.
>
>>and the kernel won=E2=80=99t invoke modprobe for a builtin, will it?=20=20
>
> I've read Linux's __request_module and I can't find where they
> pre-check anything - neither whether there's already a builtin
> nor whether it's loaded already.
>
> They probably don't check.  But I'll read it again, more carefully...
>
> (request_module isn't that popular so it makes sense for them not to comp=
licate
> the kernel by these checks when there are like 8 callers in total - and a=
ll on init)

Right, and the worst that can happen is that modprobe will fail, but
that=E2=80=99s fine because the functionality is already there anyway.

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 12:07:01 +0000
Resent-Message-ID: <handler.30604.B30604.152094276929475 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152094276929475
          (code B ref 30604); Tue, 13 Mar 2018 12:07:01 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 12:06:09 +0000
Received: from localhost ([127.0.0.1]:58165 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evigy-0007fL-Mo
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 08:06:08 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:49300)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evigx-0007fC-D5
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 08:06:07 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 907A43360129;
 Tue, 13 Mar 2018 13:06:05 +0100 (CET)
Date: Tue, 13 Mar 2018 13:05:57 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180313130557.247b02c6@HIDDEN>
In-Reply-To: <87zi3cp7sx.fsf@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-5-ludo@HIDDEN>
 <20180312210936.7f89a29c@HIDDEN> <87h8plkkkc.fsf@HIDDEN>
 <20180313100539.442c4aa9@HIDDEN> <87zi3cp7sx.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/AmXGoZ.8o4AP.J/b1Wof8r9"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/AmXGoZ.8o4AP.J/b1Wof8r9
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

On Tue, 13 Mar 2018 11:51:42 +0100
ludo@HIDDEN (Ludovic Court=C3=A8s) wrote:

> Right, and the worst that can happen is that modprobe will fail, but
> that=E2=80=99s fine because the functionality is already there anyway.

Yeah - but what does the kernel do when we return a non-zero exit code for =
something he wants to use? :)

./fs/filesystems.c:     if (!fs && (request_module("%.*s", len, name) =3D=
=3D 0))
                                                                      ^^^^ =
uh oh




--Sig_/AmXGoZ.8o4AP.J/b1Wof8r9
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnvqUACgkQ5xo1VCww
uqWuFgf+K8xlYmtgpo26Gl7ucp1qTzN8oeZNOe778AXvoFD3KkBL0rTrd0+yWLJ+
f7Jmtm0H7lSwa8TvsRdm6deyXxcIggqJXyBStEG2tp13UB0ox1RLfpQJTX0atV6z
HRe8AR83nLQDf6GEWoFDvg0yzt2BXH1vuBQ27mkXrzvugzqNcw7a3ME7dqR1y2ub
ry7HYBmrXCy/3grvqJL8O4D4QsZ5iNaKAS9xwdNbt7DsjAw0ZzCkpivNl0zERR8/
sN9bCGBlT4Qei5b2vL97OCgn2Ts6ULo7jyVTuWWao68KG6GhOqX6ODPAl1SBa9Jn
Hq2JRrfrCqLMrQrBAbwqMnn7r97LJw==
=xN11
-----END PGP SIGNATURE-----

--Sig_/AmXGoZ.8o4AP.J/b1Wof8r9--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v11 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 12:29:02 +0000
Resent-Message-ID: <handler.30604.B30604.152094408931766 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152094408931766
          (code B ref 30604); Tue, 13 Mar 2018 12:29:02 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 12:28:09 +0000
Received: from localhost ([127.0.0.1]:58177 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evj2G-0008GI-Qs
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 08:28:08 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:50922)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evj2F-0008GB-IT
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 08:28:07 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 4A1DD33613E9;
 Tue, 13 Mar 2018 13:28:06 +0100 (CET)
Date: Tue, 13 Mar 2018 13:28:02 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180313132154.212a1b92@HIDDEN>
In-Reply-To: <87fu54fjfj.fsf@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/jsGxhjTxmRKxa6Rn/AyYHxV"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/jsGxhjTxmRKxa6Rn/AyYHxV
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

> I=E2=80=99m using this on the bare metal.  \o/

Hehe nice!

> -          (let ((modules (matching-modules alias %known-aliases)))
> +          ;; Look up ALIAS in %KNOWN-ALIASES first, and then, if it fail=
s,
> +          ;; assume that ALIAS is a module name (some modules such as
> +          ;; 'dm-crypt' don't have an alias.)  Note that
> +          ;; 'kmod_module_new_from_lookup' uses a different search order.

I also wondered about the resolution order :)

At least module dependencies can't be aliases.

> +          (let ((modules (match (matching-modules alias %known-aliases)
> +                           (()  (list alias))
> +                           (lst lst))))

Yeah, same happened to me.  Did the same (back then in "resolve-alias").

So should be fine.

> Something annoying is that my external USB keyboard doesn=E2=80=99t work =
while
> in the initrd (when I type my passphrase).

Did it work before?  I remember that Andreas had a similar problem before a=
ll this.

Did you implement globs with [0-9] yet?  I remember there were some USB dev=
ices
using those :)

What's the modalias of your usb keyboard?

Does your initrd's modules.alias contain any patterns that are supposed to =
match?

(You can look into those via=20
  cat initrd | gunzip -cd |cpio -i

- it will unpack)

--Sig_/jsGxhjTxmRKxa6Rn/AyYHxV
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqnw9IACgkQ5xo1VCww
uqUxygf+MRub2zk/V+bjGnAET899eTQrpa+rL2ailthjXeEgBXkGti9xump0cNde
6rgUm2sRFyzz1bnCbqyklaG5B3cefP7FHcQqQsr9rC+fAwBOcWLsCHLY1skv1OeC
6E8yvaZ60VzsUXGK6HzFWmTGSITquor6iwwkMtx1MnTBqKuELfqZG1DB3amVsAVz
4SN4b6ZQSdIicm1uI4JCrxYBYfNSEBHIEyE0mxtfCZUCSLN5lg/vRmAdN3zaERb9
WN9CCPLTIPMPWftAzX3Xd3eeHGRfcX3lumerD285mIX1w6k//CRJynxWPu90fCeP
f1EdHUu05t/7fUZm35j22zDQD8Hwkw==
=GJWH
-----END PGP SIGNATURE-----

--Sig_/jsGxhjTxmRKxa6Rn/AyYHxV--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] [PATCH v10 5/6] linux-initrd: Provide our own 'modprobe' program.
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Tue, 13 Mar 2018 19:18:01 +0000
Resent-Message-ID: <handler.30604.B30604.15209686379413 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.15209686379413
          (code B ref 30604); Tue, 13 Mar 2018 19:18:01 +0000
Received: (at 30604) by debbugs.gnu.org; 13 Mar 2018 19:17:17 +0000
Received: from localhost ([127.0.0.1]:59878 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1evpQD-0002Rl-EY
	for submit <at> debbugs.gnu.org; Tue, 13 Mar 2018 15:17:17 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:54748)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1evpQA-0002RZ-9D
 for 30604 <at> debbugs.gnu.org; Tue, 13 Mar 2018 15:17:15 -0400
Received: from localhost (178.113.188.221.wireless.dyn.drei.com
 [178.113.188.221])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 356623360249;
 Tue, 13 Mar 2018 20:17:06 +0100 (CET)
Date: Tue, 13 Mar 2018 20:17:02 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180313201702.259bccd0@HIDDEN>
In-Reply-To: <87zi3cp7sx.fsf@HIDDEN>
References: <87ina1qxic.fsf@HIDDEN> <20180312123918.22645-1-ludo@HIDDEN>
 <20180312123918.22645-5-ludo@HIDDEN>
 <20180312210936.7f89a29c@HIDDEN> <87h8plkkkc.fsf@HIDDEN>
 <20180313100539.442c4aa9@HIDDEN> <87zi3cp7sx.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/3aNY3EucdUCEh31=b3MEVzY"; protocol="application/pgp-signature"
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>

--Sig_/3aNY3EucdUCEh31=b3MEVzY
Content-Type: multipart/mixed; boundary="MP_/ByHHwKh/.YaHjmiFc8hQDt/"

--MP_/ByHHwKh/.YaHjmiFc8hQDt/
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi Ludo,

> Do you see a modprobe invocation for =E2=80=9Cfs-btrfs=E2=80=9D or =E2=80=
=9Cblock-major-xxx=E2=80=9D
> before?

I can't get the logfile to show any modprobe log message in this case
(which is "make TESTS=3Dbtrfs-root-os check-system").

I had that problem before and I think it's because guix is
using some special /tmp/repl pipe for qemu here[1] and so the message
vanishes somewhere where I can't see it (that is, the guest does
everything correctly but the host loses it somewhere).=20

The usual trick I use in this case which is "steal the cmdline and
the files from /proc/<qemu> and invoke it myself" doesn't work
either because of the pipe... hrmmmm...

I tried both /dev/kmsg and just not closing current-output-port etc.

I've double-checked that I've applied all v11 patches, including
the resolve-alias one (which I think is necessary anyway).

Help?

Log file attached.

[1] When it uses the VM to create the root fs.

--MP_/ByHHwKh/.YaHjmiFc8hQDt/
Content-Type: application/x-bzip
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=L.bz2

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
YWlqnS1etTfNXtb0rkKrLXyBISauS0XQLrqtIrkXBqEiyDkFAXsAB35z3tvTb1ohq+p8e8XxfZdX
ZZZIJHy2WWOIhDMt9pKRttttuJKRttvsiJKqNwiJKqNtuBEElG87g7uO9AAABtNp553dwAAAAAAA
AAAPIRttttttttttt4AAAAAAAecbbbI222RttsjbbZHkbbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADbMAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAA8uo22222222AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAANttttttttttttvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAPNt54AAAAAAAAAAAAAAAAAAPxvwbtdr639D7t6713m7ZSdeucpJJJJJJJJJJLy/1PTtR
YkMK77NECEIoB/8yIq0SBImTluvJPY9L0vSu3btXo3ngAAAAAAAAe389/Trl0rySk2ltNa1ZLakr
JqlKWa1XNtdLbJpNSW0mySrJTClU3txiQWxBYSybpNzixjdiKCDYlUSRyLKFizdsxjVbfGv/J/Wb
/sf6f/x/6+f+39j+x/r/P76+2+rNXjX13mGbyvKm88AAAAAAAAPLd3V8vT0vSSSSS9K8u55mSSSS
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSZkkkkk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkmZJmSSSSZmZJJJJJJJJJJJJJJJJJJJJJJJJJmSZmZmZmZmZmZJJJJJJJJJJJJJmZmZmZmZ
mZmZmZkkkkkkkkkkmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmSSSSSSSSSSSSSSSSSSSSSSSSS
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSZkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkkkkkmZJJJJJJJJJJJJJLzbypm5bzdvKvKebzMzMzMzN3bszMzMzMzMzMzMzdvNKk3nnXll
uvn+jbfR9HkbbbbfTeteed3gAAAPLzXnnd4PW288AAAAAAAA+K6vtbbbbbbauvb3fZ7dtr+SrUtt
5t6VyERHt7d4xDIoXCQknzIjc+a0ANhcChqA6jAT9wFRDYUUWIqKQUQCvwz+OdVt+2MMYY1TSkuj
WR0oGGJWop8St5kyWTJvJum67bt++8rt5H/EDxGwu8u72xiQs6JRq3u2NoH2NUdWvD6YaormW223
J8JIQkkrttttttttgAAAAAAAAD5bzXnnd4AAAAAAAAAAAAAAAAADyvNXnnXeA8rzV5513gAgey88
8HleeeAD+r117K9avXrrvZd688AA9V5q8867wAAA9Xnnj27bzwAAAAAAAD1555sAAABwkjbbcrC0
XdVd4krtttttttxJSAAAAPNt55sAAAAAAAAAAHm288AAHq888ett54A4ABuySQknyfPugHAGgSFV
B/UA/oPtEknd0QVvnstr9AAHrV2219i2wXBaVuBdphsBwLOKw2OwqFFEKKhRa0mJBH8qnDfgJqSE
YSHaLjkxYHWUpSlKUpSlKUpSpSlKUpSlKUpSlKFKUpSlKUpSlKUopSlKUpSlKUpSlJSilKUpSlKU
pSlFKUpSlKUpSlKUpKUopRSilKUpSlKUpSlKUpSlKUpSilKUpSlKUpSlKUlKUpSlKYhod9MSaSRY
OzOzbb7r7trfZa8vsklprAAAAAAAAAAbYAAAAAAFSoAAqAAAADb5X97LV/Q/irL+h0NGhlh0tz+Z
hqqstX9DgnKTpHOQYSdJ4qVjHaZGUdkkJo8dNMYAAD5NV81Od1tVrV18V27tMDsglCrREpDFYKmA
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
rC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsL
WFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYW
sLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawt
YWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC27WFrC1hawtYWsLW
FrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWs
LWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtY
WsLWFrC1hawtYWsLWFrO6Tu6tERERERERERERERERERERERERERERERERERERERERERERERERERE
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE
RERERERERERERERFERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER
ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERET
WsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1haw
tYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1h
awtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWFrC
1hawtYWsLWFrC1hawtYWsLWFrC1hawtYWsLWF2sLWFrC1hawtYWsLWFrC1hawtYWsLWFrC1hawtY
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
ZcUVVVZVmqKPuUyGGAAQOxQiqLARWbiTbbYqQ228XAmrgPQYZRgUZGpqZSUPy3GR78BqMkn/sAQr
sU2GqOwyyKfWkwKSTUqTQUMimSpJTlbbbdDKMnAwkNCWRpUklYDCAg8DRvtsNsssQiTxSbLLO12k
kkkkkkvC2Xbk5bctlzk5bJcrZXLkuW2JJJJJJJJJJJJJJJJJJJJJJJJWYkkkkkkkkkkkkkllkkkk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
lJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJZlVZJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJJJJJJJd/l/jbqSSSSSSSSSSXsW6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAQAAAAAAA25m825OcA3l/r10AHW6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAbugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAB1boH27tzh1boAAAA
AAAAG7bJJJJbupJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJCSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SSSSSSSSSSSSSSSSSSSSSSQkJJJJAkkkkkkkkkkkkiSSSSSSSSSSSQkAACSSSSSSSSSSSSQAAAJJ
JJJJJJJJAAAAAAAAAkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJCSSSSSSSSSSSSSQG2boAbboAA
AAAAAAAAAAAAAAAAAAABtducO+76zxtl48nLZJJJJJJLlsucnLZJJJJJJJJJJJJJJJFVrI62220m
p1MJPMQqGTQwttWrZGCj0KknzSnqmGBwKYKfRXuke7D5iSIdZAklREIqQgTluvFwVTKubqYOCk/o
kVkpqqbuDmjZE6MqqqqlVVWSSSSSSSSSSSSSSSSSSSSSS6tl5+Tlskkkkkkkkkkkkkkkkkkkkkkk
kkkkkkkkkkklytRXM5M5bJcy0Vy4M5bJJJFVVVVVVVzYYfSJqZU1aKyxJJJJcq5XLkkkkkkkpJJJ
JJJJJJJJJJJJJJJdpbJJJJLbbZJJJJLq2XXJy2SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SSSSSS6ttliSSSS8bxuYwwrVhyfDgNg9xeyqsOZYna223QYSOipGpqYSaDQkmKqnAani8GqsFK1G
SVTRsqlVl5DjqZO5SlKUpSlKUopSlKUpSlKUpSlKUpSlKUpSlKUpShSlKUpSlKUpSlKKUpSlSlKU
pSlKUKUpSlKUpSlKUpSlKUpSilFKKUpSpSlKUpSlKUpSlKFKUpSlKUpSlKUpSlKUpSlKUphJqKZW
szxszzVbXhlAAAAAGUAAADJkAZAFtttpTI7u7DYkmg1OKlfZwYCwO7bbbbbqqo8NhghFCKQWCAIi
ZmowZqRaSZUqSqVU6JSpSpSpSlKlKUqUqUqKWKUpSlililililililililililililiiUqUqUqUq
UqUqUqUqKWKWKWKUpYpSlKUlKUpSlKUpSUVKVKlilililililililiiUpSlKUpSlKUpSlKUpSlKm
Ek6o/AkiHyQkIyBUVAcyonccxhJzkYoADas2qVSldXVsklFI0GBTiRDwiaE0FkSbW221spqkk8Ek
m5sNjUmHqqqqqphBuUaFam4wRu8X5MpsbHUcEfTVMFKKiRxWokpgwwSclSlSqSeJkwVSblNBUjgW
M2225GDZSangUpSlKUtKUpSlKVtmZ1UvWkkBFZXq7gFZVZmXfXK+HeUmIheiMiSEcAlRzLA2ttt4
jCJxKU5j1GZJgenAZShRWikmIq3ElJLukkBPKvhcszy8QNAeVW1bSzyWWeFYtsxV2AZWbWSrvqVl
ymVmdwCNRrgskEQ5amUaFMGpllVcmGJVpRKKkijgjAmRTKqVVI5DUkmD3CuJ3KUpUpSlKUpSlKUp
SlClKUpSlKUpSlKUpSlKUpSlKUpWEnEqRhgxI1ttt3HVJMjTI1ZUwGChSes8nDy+GqG6SVuOByMo
7GpwTAwYMDBiMEwYSlKVMEwYTBgwYGDCYCYVWGFYKmBMGClKUpTBgwmDBgpWbW1tbVtbW1yzJToB
ZXUzi227OyqqqrbQdnZVVVVGHmRDYbnE9x3d34VhmREiKgIipFRhUmWVSYUpUpUUlFKilIpUUpKU
UqqYYIZEpwDtbYdXRhhhhjCsLh8hlJ2REI/veCSSQjJKp2FEwpVHr7Ayj5FjIe5A5MGYYYQwRgjD
MIGY8zIZjzMmLBGGYQxFlFCD94KpCnIpSlKUpSlKUpSlKUpSlKUpSlKUUpSlKUpSlKUpSoUpSlKU
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
YpOFPR2aaU2ts4YqmjWW0qncx2aYqqpwrGm7SaaViKrY8mKVXI4Tc2OBTA3MbI0//xBEGmPuxyVV
eStmisUaaNE2VPciJJ+bGIkklKpw+WGFMf9zw8hsbPJK6mnKxKllSvjarVfS3Ld+/yBqzn1AAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAANV7SWVdr4V/qw2V4Yj6KJztscMY7vQkiGSRCNPyOCSCkjE9GyeFV
ctpWmzYpior0GDDdhsVpu2GhJFaTccHbmqrw4OEYxiq5NIcEg05t1USSD5PVOyJiaN2rLMtX3SSS
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSUkkkkkkkkkkkkkkkklJSUkkkkkkkkkkkkkkkkkkVVVVVV
VVVh9Xk5t1Yxwx2RzbOEKbsVjHI1ls0+6aeZzNMYqlYxiFVUxJKMSIjExGKkjCRVKmKQVUwxiqSU
qSqxiMSqmMTCYmGKKxUxQqoKk/IwmFJ/qJJKkbNJjFExUjFTClVTAkl3t0mFSaKYlViVimKkFVi2
2TCpGKMYrBVMKqTErCUoqqJFSYpUpgqqlVUxjFYrFTBWKwYqW21KxMVSpUkRVUmMRiMURMVKMUYV
jEYlMYrCpOHkdvvbXJWxDg7Oaad3DFP2fnV0kpp2JpyKaMRjCqSvI6qwNJo2KcmGxUrYqpUqYr8n
gbGn/seTTDR4TTDCpipN0kmJIknypCK0x8no+7c3T/BzJwREkpJJJ7kkQqGJFFFSkpKJ8DSMSNB7
ICiMRSUhUpFSo00kxPIlBycndB/ukGyTuKknRPDoaKxhGit0hU0qPkSSYdFaExUn1cMRioqoqoqo
qoqoxSSVsEkxJI5ipI3fVW371bJ9i/TbMuWJG5h7HVU+6hiqoxU5bW8fa3TTZKbOSq2NOzZltkkS
sRER+Rj6tjkpwbsbqmxjCqVXNMTk0hUnEb2221sbKinVR+Tk2T8lTYqVXJWJVemW1mLU5cZmZJ0U
2VRJCR2fg0mldXNw0nm3kGbXMqvDoGkkqfYJJjzU8yugcObTmYmyT9lSFVVVVVJsaRWxWGlYcFbK
6FTZsU1ZfGSSSSSSSSWbrfuNxhXyiQeiQ0ezZgpz1bs0KQbKTqoTHMSnN1TZ9A05Ju6nNyGw+Uki
RiYcyuhyVmKtuKxkcrcYVWk6uysbJsqqzrbicn0bNOjYRjRSq9DGEppVSck0wjTFKVMYwxJMdhse
2raSpVVKqVUVRVKTHrxbVPAk1ltNmLbZsTTSqmiVK00aaTo8InBs2VwFcKqjSq7nZJPo9HhW70cm
LV0dzEiaVXjPTMzySSTZubIKcmJEweDEKpscst8HVODGlVucEd2NNiUYwpujTCrTM3Sy98iksSkp
JJJKSkl2tWLitSVLOkzNC59QXz8rbbY3bG+W10c2NJ+Enqch8Ikj6UhJzEkg3VBVFVVVUq2JYliS
WSSkkliSUVVVVNxBJHI5KJbbFWJ27ZmZbfcxs9lY92MeR7sOxsYlVF0xtgMRZoZ6AeRgaV5kOMeZ
kxWCE5nNhpUp6qoVSqSSqklVmUvaSSSSSSSSSSSSSSSSSSSSSSSkkkkkpKSSSSSR0bGnIc2DUts7
GMKKUoUpZdZmYxYW2KU+8IIgrYeDyNcW8Po0mS1bUocinI0YngqdGnZVVVVVVSqSqo3NjPUBVllr
DCkvnMtMKVzJJSSSSSSSSSSSSUkkkkkkkkkkkiqqqqqqqqqqsdkiST0SYUno3aaMQ6qelt02KRH2
dWJNlmZmWZJcRPyleEkkkkkj6vBzcN3JiY2VVaEaK7MbNsLjEmFTZWDBhsxsbNmzGHQx5GhNDQkn
CRpjdWk0VJJSsVBJh6tGW33zyuXLpRJw8wxqKvJiMKr1Mdrbpist6VmbHsps2d0YfJU+C7WWvfyt
01bVXkwqn6JpJ5qmlOTGcVbWMKxXc0eiqkk0w2YxWN2JqrRatKm6qr3JJJJJJK3SSXnXasssyaaU
xQEORNNmmK8HQxGnqobAhiICKQMRTP/h+m/z5/h+abdNXeRfbWvs19VN299yMk0WlZatXutRmMxR
VNnHcZTAdoSwYLzLSaEsvzeGo0ZapBIRCZTaCZBoUJ2XbSWW3KFVgRLtwQtLGxkzs25aa1w2lCSJ
TbRkJCIta5bXxrUlbWlSl7aOQ0SyRMlFMTwcPKJeaapBKBJUM0RqozQSLG3dsXcOYTKXlC5YU6UI
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
NlQbipMYlf7HIxPy5t2iNNNnY6tyEhREw/pjSJRyTS23RRUpycm6bm53MMENClbt1eonQk5JJPu5
EnMrmpSuFE0623BSmylVEpyObo3bjxOpoaTsf/ESRIGwiabjoIYaYTqSnR3OHCtxjhK0kePQAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAC2223JlSvE4KQcHmR1aEJtpR8bLGo2sxptVuo2yzZWSWSqk80NWqq0TuT5MPYp
xeCR5vESRDgEkkdDuVKVKVVKpVK3eA7DUwMDR1TzVubHo9GzgT3PyEOiEDr9f7FVVfIPUgeQfAdh
CB3I7D6JJ+fK1bVtW3ZPJDs8uFu6DGLZzNlMDKq7DRHoUpSlKVKUpSlKUpSlKUpQpSlKUpSlKUpS
lFKUpSlKUpSlKUpKUpSlKUpSilKUopSlKUpSlKUpSlJSlKUpSlKUopRSilKUpSlKUpSlKUUpSlKU
pSlKUpSlKUpSlKUpSlKUpQ0NR6miT0VOScFerdD7KSMvgfAyPgVNmTRXRUOiBO9JFJGp6ojU0Ekm
j6vyn2GQkkMKTCVJOKUJhgIwNkklHA+D2HR1diR81eiT0xVuo87attUfQaPmYEXN0rFxWLdGXgqp
HFHgybbW4T4GgYRwcEwioJWzZlPUI0K8RVFUZYYFUVRlkkyQVNWWCKqSVHNRhI0SUQ2zbrjGMYqs
ieJSlKUpSlKUqUpSlKUpSlKUpShSlKUpSlKUpSlKKUpSlKUpSlKUpSlKUpSlKUpSlKUoUpSlKUpS
lKUpSlFFKUpSlKUpSlKKUpSlKUpSlKUpSUpSlKUpSlKUpq3SNWx9RqhPQSRD2I2RlGSeyPY9UmCN
CNEex5I7BwZRhGCNUhJuN24w1TZxN24TVqOPa22223AAAAAAAAAAAAADsNlwbX5qy6sqw8SlVPFU
eKmip7K1UScxJJTRUaph5O9obKyphU1TRhqqKknFhorVU0FOBQwJGRI9mEykJKlHu3HN2HoMjdN1
TkqzMyu937Act0DLxK/F2v2u950huOZk8kpSVJVSpUipSpRKlJSUipUqQlSpKiopRSgqiUKlRUqV
KkqUKlSoUVKSgqUhUpzd/RaykZPNJxavMjmchxdyVq1VVVVVVVHRwcUjzatVVswwqtmhllVYMMKq
qqqqq4sNnN2cGpcDGMAYxhwMAHr+Pq3Hz+I/spKqqqoqK/LW2s29f2RdvbXdvd2reru73qd73t9x
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
KSlYpFEqEIJMTKMUCjBqtwIMICeUOLakv2XFoAPZZtWy6SSxpuQXWVbMClK4utxcStu5yVuri0YZ
VybMMqr+jzNG7c3ZRXcElZcWrDKuLipVZMqVVUMYmQoyhSF724Q9xwX2N5rlJLg+RxeFdLvcX13x
ub8gBAAAAAAAAAAAAEAAAAAAAAAAAAAA4ul0ku9eTqjRowww2ZREexUlfo1atGGGCaOjLdqwyrPZ
boZVVV/I3ZZYSHEyyYYYZHe0Pa1aqrV4OT4etvuYbNG7DdHk73arIeqjzFN27grCssMO4hDCkNw0
CwpClKeHIe4U2IQ3KR/2kAhaWuDkuNqwqa1CS9eqmWSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SVVl3lnxvdycXtvZ7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOb43urmc3Bg6tGHtENBDkOrRuqtECZc2HaVq1Vg2Y
ZVWUbio3OrA1asHewyrLqwSHgh70RGWWWOltdjxV2uCYdHRzclV3OrDVyVqrgnFUMtVVWGjDLImV
ZaNmrQw82AiJyENB1R2IlRhAglYSu0dj3o6iVGUeap4OxxdrRHNXRW6p2CQyqIVQk8HcNEcXF4sM
N27DCCGytGVVVVhFVyVJBBhJBBSsuDrbaw1RxPE3bmqlVVVh7H4K0O9Wh0eTqZTRwYc1ZVHR3vc0
NlVqTDDZsyy0ex3tGjRwbDMMKvBvCDGdDbTbNjkLDDcpTobHuPAw0bhBmjkYcGjRTkENFKUpuJUy
0c2XgBBNGVVVVVVVVVJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJSSSXNtskkkkkuba2
SSSSSSSSSSSSSS222SSSSSSUkkkkkkkkkkkkkkkkkkkkkkkkkkkkuLZbbJLi2tkkkkkkkkkkkkkk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkuLbZJJJJJJLi2tkkkkkkkkkkkkkkkkuLbZJJIqqwyyqq
qq4NUcSaNEBKqqqqqqqu02Msqqqw6ssuTDYlZVVVVVXYy4Fc2rV0djVzatZLveUvO863SRcV0lxL
m54NzyOOLc5trKpU1bPJ3uKCIaGjRoyyqjKlVVq1aPzXLlkkga3Fkb21RqXsXB4DsZRStEiIhWiq
qqqlIk6OR1ej2uomUQ1VowkyUpRSlKSlKSpSlKUlEqlKUpKUpRSiqKWlJJSpSpSlKUpShSlKUpSl
STZVUMqYKkw2YZKZVVYVVVTCgwIJgwwkqUUwpSlVJhRVbKGVVUqjRSMNGFAg0QiKSNU0NVTAqK2I
iIeDtVxbqqq5Js8mWBDKSRoyw5lZZaq6oZYVWjDDD2qTi0cFNWjsaK0NGXxiQCFc3Jo2NjDVowy5
tn9XYSTSE5i5nYKsGC5giSiq5coxbnBJllhzIdjk5uDdyN2HB1cVZZbt2WytFVo0eho0cWGGrVs5
ux7XBXQyy0OLi8HY4pho0VWUdjJlibr2KrRoqqVVbtWjVXVzcnY5JOTkqqrRSJEmFYYYUrLm4NDR
0bPTNswdXN2stmrscGHNo59lvPW2TRqj0bKbuTVs2OSpIiIZYeWlsy0bMsJCRh2AwwqsqqqwJzYR
Ikz0twwK0IDATId4UEIQg9Yf7h+uv9ZP9y2ySlxEteWyWu2zEkIPeMKJCBi/x3TcFAFhYf3CD4Rz
jglFb2T9MtHicADTSlSlv/lJk5Ns5TCU+MXrIAznIycnJyRk5OTk5IREQsNAWAsAEAogxdKvWZyc
Ki1UtU3u0EkCheiUFwsMYVVnRu/2ZEiIcU1xaq/7lRmfkVOpmPuREM7oERrWmV7iPZ92R5NjxaCx
/t5tLMkREMr8KqLnyUac3Pv6GSyy5mZg67bljzMzMz/mM6kEhCEGD2IiGRZESZn5LnBufB8Gd6MF
7sbxBfzPYeg7SHeU950PzPwBHzOPp9oSSpSVxx1Opi4rDoIvRCWvNaiEsQhGRn1/V2O6AQhHuOvr
+fHXz6I9V3e2+++6N9p3N+wXYIkSHqqpUQqqkqpKqqiqlUqpUqRVVJClVKSEEqVRVSKSiJVIKoiS
gJSSUiESpVKqKqqkKRIkoqVUlFRIkqeXfbbb8nEcx3PNIiIf6v5vY4cbVt/xxt9p9mutttvm516r
QJ3qJterA/4wUZmhH5ngkJF5eyEcGCxzqKLQ0PRlXPo4iREPBRYoYB/KR2AiIfouamt9GtqFyiil
Uqq+D6HNIh2ux9nXtX7X6Ns3S400zMwzMtLaYWy5mZhiSBIp+R+h5mjsP1OLeqvdaSToR2PZvRCf
FRvAl5HhESZWhnbz4o+LARHQueL3vBveflVWtq1bbS2laV+oiMoiRyBEQ3MWL4+1aVrwAAsB92VT
ivoyE6Hb5uzySUEzVJWhwLAAcD0719iIq05NiSd9nQfppK5+yqqLVVLU1XPVOq267Yd9Tayhtttd
a57+i2W94cb9kkgwYKDEku8lSTwEKmFSiUJQRWBCpJO98NdKTKbjI3iREKml/2vWDzNui1V6kaPy
R/u9G21ttvgrcCbj/JTOtd7PG69oHjf4V8LOeQPy3essy3iCkVSIiGQsPBnSQSSS0eqqREPB71jn
IP+jUmZOKREXFjpeqiRDR9zkbX7+MvptuXMyvHKZJcuZl/UAEIQ1sz9Dc9khI6XstMXUeDKyNxpd
Rgo4uDubpJOrkCIh+3atlXqN1e9+5P4HXoNtvY3O0+wkCRD9/rJJysskuNuAj9P8dfcsuj4/4D/I
EkhIot+/08VWQvLk3c7JJ3HBNiSRI9H8ONs8GHtO1vG9s/BWrGFp4NSRDBocWd0qKNTSvVdZEQ3s
yxlZUd65zsVpmdhcMCh3vgZlje0o4LGQ+Z8Txvcd/SOZcmUzJblz1ngJJfY/c7zvOR0FERD8mdpI
iGZFVGUiIamK57nBISMQREPNkerY1JJOkyOD0bGUtPUbHvNzY7fp9JJSWyTxMEJCXpEeZGxv6EQn
3wWmyRDx/Vcvn057s4wzoxeOLj8CnJETg/De34qrj6Wqve1Zzbbbwex7HxaXKUpSlVTgyOx4PJld
aITA1PR72tYiE+TW1CI6W4zGtlXszza3c+DvZ9NODBWyytW3ObjGcXZoREMOj6vuqPe+TtiJNHO5
Ee9g1PB+TiiE4IiLno2HM5mkRPDyW23Dq4v2fERO5zbtHudQJxbPm3e9xfl+Vttvg/B+jogkhokk
oKBBKRCVBBKiIkeH6f4/8txn9Evy9u+bbrbW8tvM/Ah2AAIBM7xfnybSwDR8yhE1atQdEpE5JEMA
T7NGgYUBgIjFIiIVG5Y6kiIh5Itcne8FiLjxZ1gjQkREPF/RsTwIiFj3ATvcWR6MrZo8a1qrWlK6
3c8HBVa0OQiZkiIhqYNsRJlegE4F65ISPF5ODYyNCjERPeqzmDWyLUkmtqcG9wm3z8qU8rbbbaUt
tchEaGRqc7ISIv8KUqCSJJ7vl/1i4934vdcWY3fVPs++ls83PdbbeDV9wREPrpquMXGLji0aHqp7
35v4n7okSX/a2/f6/jnGM5NFPu5sHxdGzo9jo+phpAl7qR93m95EO9V7zpFUSJM657XtfMj6Nsrb
b8GWjYiIfJ+6ST83MiIYPJ2gTQ9URPERG8ERD1czKST4vVEJ0dXcdrk8T8Ddoy/P9P1txcW9H/f8
l+bx9Lc6Lq4IH4N3672+xX+yeJGvqvRvbgREPV2Gpver8j3CJYysWDko2u0iIbHiUahIiHuaGB0s
oiLCIha6nm73vd7oIiHi9654ohLHyeajiBN5EKkQ9BEXxEmRoERlbmVHi7HuYLVjtb0a3Y7FjqeX
p7qUrStKd6eSIS0RI1KAS1IiFufhK1ra2fLnv7nZc0JLY/j54SXk+TjnYfqCEL7gxgMAE4GCP14W
z/Di1Oq/laq7pCRl+6aaWqv0fq1fsej8Gx5I/V9Ha562228nifqyd56MrUiRJaaSxRU0vunMsL2R
Y2PFcaUj2NboewE2KpCR5tzg6mfNSiimYERD4KiREPeInUalrWq5iIZiIWsrS4Mz1aDUkkwXuTpI
4tb1ennbbb8nk8Xf9LfwSRHv8V00t7X30twr4MNnVeYpEKpERDNESdjc9zrSSf0ZG4ERCjoIiHO9
7a2M8RJniJLWUCdDrXtLmSIiFr1SScW1atTvewic7c1NbsiJKgTuERuXMHYkJGqIkwYODKtWNDcx
XJCR9n+mdo8aUj/Sh+7k/s/orYuV0TLP/GWWM/Ns2av+3VJu/i4pNWy+ixhIyfF2OhqfHa3bP+Vu
MxHcsGyxRcVWMGd/lJ/bKvvxpStExH8NL6rl8ly/iuF8XLHZi40ZVs6urZls7SnJW6zS3Di7HV5k
mrtbp93g46LqcmzVrMdcWsUvK3qzyXyDDq827mywbKnRoVu8Whxc8b4uMq32WmDo9jZl2E5Ox2Di
2VhNGFaKdHuP1bo6O5zTKmHY4FSqzheTDCqNbbkpy0tkHcqMkyww6sAdyLC1YoYsW9Vcsa3BVYow
Zm1paPY5HNk3NmXB2GrI4ZWJJo1dHmy1RK3dzzaMmzkaMu9o9BwRtvb37W6Oo3e14NGrTCoqwrkX
muUsbrGXGn3HfG82adPA408HGxCNENwMEuWNpB5MvYymymXe6Mns1XB0aNmpoqnerDLqwYtsV10W
SsvLe3zI2ejvV4M727AuCDPEAYcFMOZteO7fkZrNapDQw0exTm5PF107VxWjyYcXM4ZXsdzPJep4
NXrfGSaNBDkFGUZCDIUhSkIYYUhacFVVi5cc7pQiSPikAh9n3fv8/atx6fsvj648borTTTThbHxf
IZf6qfd9U4EhLH8FVSj/gdyxRIRrfg3rX8kkipVJUf8kxm3tMByGrCMW222Eg9WWDIqT3ssIIiqh
+afBWDUpJK+qsa20qqokwUkmCjQVCST37rgkTUp5f/S14KVn4W/8vbp/3/6u0H095+Hpe9XNQb1c
3VibUCCLhBY2SkRLEk2ALa2zRxcXElsktcbu8XlSstxzbhMnUdWA71VUlVMlIp+WUXKWpa82WEqq
ruNSMElKiMqKqqVUlRX7FJKpMKj/ZUaFEyqDtxbcW1UolTCYMUExgMYmDEe0+P0hJJIST4rtH3n+
x5MvHczw1j0GGnrP69pvyhbVgQYxgmEJbXaSxbSkksSkslJZ1uJ/5bjBfQ1Q4vYh3MEle3Nv4Pam
R+R5N3YlO5v7l0T4H4tkOgUbdbcIyqPaMMAhatRHD7rVlXA37Fq1awT2IIfMwPtwXFtjDCVUSfqr
Cp8sLi2xhhI+6iSlGFFVfxq24lvUpIo/RhNEpNmGkmVkoGEikEoUvhS3DFlsYUpUxJKSyyWSlLEk
vHbW7ubpaRhUpSVSWTsXEYsXmZZSqqiqkqiqlKSqNihgoKAwTjbjaPQnvJIfA9oH2NC/ln2cUieG
KxhMibp5PuZcR6NE5nZ6LbbbbwL593EnFbtttveHMDkCYgYMBd4mL0n9ba/m5mmF+iV0lzL6rbaq
fMtNkFUVRVcCmFRVKpDRTCqqqkc/H7YxbcY+buaPgbNGSqVStFRhIikDDBMJk3VPB/4YOJRufmfm
ZfiSErm5khMHtU9PtpxzbSy22/A0MGAwYkHiNJfk222wXeV/QqIMKpT+BYmLaVUqhCVVUkqJ+ysI
qqqqqo/BKRJKVhVU73VVKdGj41dVq9CebDCTKVowkctLVXA4oqNFQqpL91ttk9sQ+jU1m5xucbmw
atllSKpIyoKrBUqKVFYKKrVPewZKkVCkVTik/kwMqkfYkJUQfVlhJwKkhhUwYbZl+GjQEtlYllxS
zM2SWSqlVKqqlU7yvRlhl8hTD1GFMILrBkHCAmME+vh96SxW4TJZCvBlAUIJcwgQBo1r/J2VvMdt
RRNFKrZUYUqk2KjCpgphSVFSKqMFMKqipX6HZyq3o7V1tta1idtylqRanFFyO0a3ewGCwom5XsXw
twuF+T0e9OhKkRR3mjZXe2/VnVkVt3ggllZLKVZzLMyCPuUoxgJgxL/UGeRA7A7fKNySSRL4i2Qf
u2wELmMSR8wYJHP9v0clLJHKwneYYVVVVVX1E2ZZLKtSNCviVDKiive95llVZBhrlaMFJCqmCn6K
TBQ/Y7ngk/2VJo+z1VMlTycOS7W2phRD6KTJQplhBVT3vSi9q5frjueu2dV01uuv0sbbYznBnsfZ
6tDURD+an/amVUqR1UVRVSpRVSlSSbKfZlhVSTJ+jvNGibDGbc22KlUqowYMGfb0ff+fvHMyTLkz
MzY2PiQICEg4GGFB/ZUe0lHM/iepyae24XF1MN1Fp0PVed5mVT7lqeiCdRQaSQlw/M7BEEuAZ+vx
/VtyEo5XCQjFAgGFzSSSSSSSSSSSSqqqqqqdD9kYR9hB3Hk2aPET5hKIy82jtMMIjKkor2JGGElR
SaHvyrK0YVPgP9zAamz/RkgyVE+Zd7aSKqX7WXFstJMJJVVVVVVVVUjZRqZYRVVVUVRCqwUmFSq/
oVPbHn4BT1A6dXgQfrKW7PMw4kybSksUSyCxBH+wIkmFJRWEVIbFQwqZUwKQyVGw5q2KgqTL+Qy0
VOI0GE1fsbsnYeBgOCiqJ3qmh7jCQaKwVCYWTwttt+5gMqjQoEGesGkCXLsXmMrv4nuz7OWvNaZH
No2pCOJzFC11Di9D1Ws5aTMoJDKdPb6fLuyszMjMzKrN47knJORYKEHUchBuByO4ho+hTCpVRVVW
D0YQ+b0NWVUPWfMPL4Md6/qSYsNF27/wtt231FucEzIsMGGGWEwGVTDBWAK/gwwbmGqhqqVQNFeo
iOLg/0VVSlVSlFJUMPB9jo3JOB7E2TtUlVKV0KjqSiSMq0KFKYVlJJJJWLPgwbhlmZtZmbZWGFZF
TCpg97LJErKYVMYtgbZi2WWKsWZJYkkliSkkpSq73mYREmhowk4FE1Vu0YSq+ZseZlTVqylUVKf9
KYUkkklssvZWfG+6BCEgy4FJsU3YMD+penB9/x6a/O6tNdNddt0bCvzZPFEhqnk82D8ijLRk6tGV
D9ijKVVVVVVFUVX7CmCpFIrvSUdWBhJTBTAeh6AfH5g/hmxI9gDZChROBv6xjy+PueIh4jGMEoAi
W4mLi4xOQUoqklaHEkJsVsOTgbJxfIkJ0OTJJ87bURZ4LDmYYTmyYSnNH8XIzpb7Tdh9R1fRyJCY
tnlZWtVK1rWrBQ2Fh0mK5pMhkXtBlsU2Q9BSlA/AqJHYUVUpSlKURKqVX+5hgpSVVKPcx9qtmZhZ
/wplRVFFQKSKkVR71YtskqUqqpKihwOL3tDRIpFKr4FQccri22ulfrrm4sWJLAyvPRpskv1UTCv7
MMKVKr+BUfNcrDZUMKjGK+v5emWk+99wamastU1dLT1qR5Mx3HmnrG48msdx5p6zQCSfsb2PEvH3
ecszC5tp3xcBoH9ult4WyEjDg+w9/JfuZNE6pEfF80nU1dHX+PK3GLcVcYfmVKpXV2NVcRlg5lYU
/MlIwqVSqRJfbTK8ZlcSSST7tNzUVmUoDBNL+7X3slplyZLKJGAwYxjPMKjiUkPdpbcWwMFQ3OBg
IySSSSSSSSSSX73h1tW3GMYrGTcpNX8mEMKSq3MMJGgraU8jRttkq2t/D0t3b5XxvWzret2cEKo/
RUkmFfu5mEPqVI0QpCSqLlcYq3CqqPoYYIpKRLMS9qbE99lZmbXHyPH8DngyWZnm/QwNuS4xVtK2
UZVPaimgymAYKKUjYp7lVHifnlakfcpq+Rk5Ps1fNo7SujQOhSYwtxbS1bKzxHvri2S9PYwvz+Uk
AN4S0dh935ODgniYYbJqw5aS3GKtoUwrklH0MsH3fBhJCsmBT9SYSP3tsk7ynaP7/kuWMW4G6pVK
lSAfoP6/w/n/p/P/P+mA8tETNAO8TQKMzhiD/5AsEDKyy2r4jI95I0abZRCQkzxDzD3B6gYLJyND
8Bgp/M90/lZbLZdjgf4FOFttt3a/rvf7VpjTTPEpxHElOCUJTBQyFpcfmfyVM5sXFhUqexQsLT8y
QnM/zNB9DY0KU7Hw6r2HMpzNhaiazYZDLlv22XVlbLLbMTIULzcfqaDWaGxIjSZTKbzUFTQWmgoW
jMaW1i1XqSi43JLWRmfZMZcpRYqwTIq3ZayI7rahPY7mhu/xssyr/ZwdPZbZzu7jmEPM4Ie4/6HB
sDGbGx7jgOZeba2yuSwHqNgJ/UHYXm4W1fq3Z0u8A3VfJ1N46C9w81hYc5Hwue7x3mU0+08jQUV+
Dap2hyMFuMGi76ZZzhnpqqrNkdHV03Xdq4mjLvczQcBhgc/OURNhoCBuMgXBvpnYIWViMsTag5su
jgciibuHDC40cTLicE1bHcwaPedHvbnA6N5qtVo83Q2eWi5cXC29h1OjkcyuQ4NkqUnB3NfdvLcX
FtYNymCnkrvKepoMJxRTttsyrzOxqEw9lXXS2KbNmxEZcM28mDbzXQ0Vv3dy4w4Nmpu8XAyUy5FZ
OLRoJ4CsO9xOZR33hjGMYtmpTo//SQCH/ckAhZPwpHXfo27N13GuG6u6y1dkvs/3jZdkuw45S8x/
aF5umWn1Bm8952iE9e/SOSE24XGNRh4Vt3iZNGv/KQR8XGpa0no7W68nVE41RJK0qyLI0BXsO6le
74ceEvMd4XtdMtPgGbzzO0Qnjt0EckJtwuMajDwrb3KpJ48Nhr5pXTw23ivFdUrg438gQSSLJBtn
ZmPl0vnD90u1dO2Wa6KIp0JxJxgN4mIjv0itazNtuNQo4pipxNsJsESgSGBzquaOZKDDVMzzZnbV
wW+jbGd2Pjm+2H7pdq8dss10URToTiTjAbxMRHfpFa14WeevA3pNi65WcbQSmEZQu3D+GqNYhXbw
vi/hr1YrObVSmcSIhacyITqSEixDJwggRGRnSRKSLQxj8evryfl6/V/Ln/HZ069O1+r1eBHRDTgS
raVpOvuvlffe21b70pfbaN6IaCl7wUXiEhOzNzZHKoM2SJisZYdWDvCilJSUUklFI5GBgUUpSUUa
GDBJScsW22wwUUoYAZXFc1tZzWXNbXMrQGVcRSlFKRRSUpkwaGSMDLBGCkNVGClKZJgMBdAGVtYp
UytIZbUpVIGDBQGEBgwB63vhmZmZkkg4OFxpoxjOlNDUpMFKUSiiikpTBQYMYtttjZSRsaG6lZJo
U0KaFJShRSimChg1KYKUjRRhClKTCjJkwKMFKMCaFMilKUpowYJKUoUo0KMBRQwUwGCmWTJkUwYK
asGDJRjqurJgKU2O5JJGH8H2eD3uJxcn5sjuZfZIh4tDKqqeIE97VnSIiHYvebi3PgRENxENrWkb
lBicxxKFglpQ5H8FSh2lW56ATUfB6mhEQ7kiIhdpVtPadGuxttvQQKHUDY9W8cZFzJHXJEQ/vDD/
B/c/yP/Zt2rVfxJ6uWLbbaU/wbsoeTMVXFE/4+h1iFFhlfuJI4KnBlMGXJoNGpg0jNqr8DY7R0OL
zf3KB+gf2Be0/u/Xu2JIWWkkKCSEvwGhttOzC4z77caS2UpUnaI/mcTuPme0/JTc5Hi5HicjDWy1
atWy0tWP1MGY4mQuGY2FxkLUn9Go0H0UNxvMHZ393+7LLLLDiZTyNtFOcoVSqwyHMeLS+NUy/CsY
rC4wxjA+Z7Un/hsP9nQ/C/eSSSSI/Pj5ySSST4n/oOoLwDsA+YeQf2KeR2JCR3DgfsweJ9u22235
iIydB0D2hgaD2hwAw8e6EkN7aSQq4BhyCHgfgvZjSaj1P0NQ/6P+jK0O5RsF46Hqew/H1ttt+vpb
bb+Z+R/I//BwOpxep4GRciZFCKPkqic5qP1cXSaSdDacD+wA9tsEj4H3edKjo5dg6vBQQ6PCK6B1
R3RYc+p7dyS25avkNt9ptc067ZsKh6jkGj5Xvla0rWta1NxvNh7GBHocA6D6qmBcgkPIZN9KUpSm
k2Hq5iwkjwPke48h9D+J/dNntPaNnSTuq14W224xbgwwnsNB3HiZWRgc5sO5PB1nYofVEJkQC+Yf
QPf5ttt94dou8+Yf1DYP8Pn8Ppbbbbbb4v1V8Ffy1t0ytVPE7FMH8B+Z0PiNjB+h8j5n2OQn72Wz
9jDFVVYtphVEepUdh9S45H6Gg3Gkakzn2GkvAPQPwFeuwafXc5ODy+VvLk3iHlqq+o1rV6VqVa1q
2oVqTq1Kg1GdYVSta1ZMKVrWFRqNawqla1qyoVqTjIhIunyfE1HIUnu4/duSN7ZsbErpScCSOASQ
CAoHsBfIOvo93p4zMzJmZmZmYj5+5NwAcgaCpuPgdRYN5/hgYHmc5YYDwFKcnoj+R/U2Pa+W8WyY
YwlqYPaNzyO8wfke9OypaFLbaicH7Ky7VLP0/U7Na1rW/Z+YDvXyvpZZdqxVnNBtP0LQtNCcRU1L
jE4nqVQTWlDanQ4tpuDETtJmIlypYhYe4DvMA9oeJ4sfJt+M352mOEzMKMweZlwzKY22jkH4B2ho
NhesNw3A+/H4uSEkK1qYjwH6mcwIvZCZg2G0vPkh+gkCQwS4MDx++/RlsrVlqttD7Nvru/yf6klZ
oPb+3vtdu+++6ttU2bhgMP6kIYGzsMBtPedZ4E8iplPEsHIxGxUZhUJ6O1RPgdpQtLQk7ix7yjBI
kkkLjsLSw5LTMZS8lprOB3l7VVU3KcjincdwZSfyPzPYnE+3fb70+ppbkbERRRJBld57zY2ngbTS
bw8g0HmLwbf+Z1D1h8wPMO3PT77s8zLluYZmaaNP2bq+xGrqepuePhatlqVytrEllkpSpKKpowMH
gcTQ8HwONLuVFigbVCd5lNpg3sjE7zKvNreVxFGDYPYfcwe9P8flbbbT4DQaBQCHUOnqfN9LbaQr
tttj+jk/H6bYlLbHIfRnOmuLjOzLVqf6u48xEiHtKqu49g9x+Z/H/i1bfk71cjDj4ejGMPyTObfS
Nq98ciVZ5GZQOmpmQDMiSSRgMEMwqbP0ORqicjxttdpI9pk+RX1P1DodBmx1Bh2B9A5B/cHoDbw8
Pq5bbbbawKp1JH1SfE0tsdiTQ/LN207dvLXa7bbbba30uvvvvuvpfffff+xU4HA8SwwRO1oJB0kR
DIXnoehtPzOJ4HQb0m8+oE7Wn72/kNX7MBqdTkwBy8rbbafc7/gfkz+GRksVdajm4YMD0iQhCD+C
n0P5HofNoPUbypmIhudp1vu/YvPFsSPj4nm05Ixs7hCBdhhOrTZ/DZIlBjkIUFAjCFCqFP4fd+Pi
/3fi9FElTU1NTVIiVgBcRVBhZaQajHOxpsrGzkEEAwYhKlSRhSTBUkqgYUYUpUhNCkjcUkmVESqp
QlKSEyqVUTCtSiFFSJSohBKEozu91P7Z3A83atfso3tztBEQ/hQRHuaX9pJPqBP7bxzHQmyyylay
OOSRxuRuNycHrD+weYdx9T+Be4OQeIczmdxp62227poe3x/9rjkrFWKTV/QwdhlGU6QJyaDU2nFo
Fp9WlRr4UpSUt6OxOwnYVyVValapI/JUbHi+DISOlpNj4tzI6Wo6wJoN5Q4tRP4PcYSJHeqSRKom
qldxhxf+leTDBVU1bJERD0bt09gKe1JMpRoougxi0H2O8Njg2OAO83nOSSSSaBiZTodEpSkfoqYF
hsLypcxTMnY+roWnYnkYOJob81ltvI+OiquyREjVWphgYVRobHeOLgaBhNDfgtlq3gjgaHa0q1av
YapMkQ7WHB/h4j1EAOBICAQAOg22nz0zvexNnUBkd4d1ixNoYIBACjxYWFrYEy1RK1CthwwKzMNC
PMh7clKhGuk9EEzAhZeJkOwdlUIqD9v4/y17fn/a/7PyniMXw+MYxh8DPKb7q3DOrIrsjvdwwcnp
uzIjs41Xa3zd5TLc5lGmltVs0aFU737tmRlowMMN1bqapqTRlgnBRl+YkmBo4qZKyKkpKlKo24Wz
/40RhNCm7BMFMsKVxNmhlSlGGrRq1aiopVJWrAworKpgMFKcCMDgTc3btBlswbsK2MG7UqVWXIQw
ymHFUQpERDImQVXJwR9H8XYe181ZerVEJ3v6Pzfu6OqpVKRU6nqeiaNHadfYRetlpFWWkVZaRVnx
+rcAEkoBQkTg0EMHgkJHsNXJPR7lLVlVWEEh2HJoZTgaGjkPsbJ+LiEmhhjK1XYdpxU2O97mr/Ij
Q4iAz8w9BwHYe8DsOTbGMN+u9lreb22VwaLIVlsruEmGBAFQKDChD/YNgqODzIwGCWpuRVwMh0tj
8MD35M6VrWzbtcMORJ+MuE402vnWVnjfjL53Ys0X1KdiSHiaPoaJh7yYTmVNjsMhVnR7F7SYJoPw
WHxLUlraylUyiSMGw+b+bweb0O7gtcZVrEq1irZi2f0YaKqpoGETREqORomA0FFTOUJaTYNzqOYv
SxGpJA60hHmksckQn6t7cyH4GzLqrWta1rWtZDLY8GW2xt9HlldrI5JIAQABMBDDDCTBVUioVEqi
lMmGDRRO0+zth220tq2cztYG7f/NdrbJB722MeC/0EhLDx58SSDKJvr5RS2h2CNHbrbTdGplTHbb
Jho+I5tCJEmhkrUiIUJHsNuC227DB8XYaG6ptxpSlKU3EXIqaT6sT93BvVdbraTOR5Fj0GdNDcGp
tWqKD9yPk4rDa4nlvBtdWVqtsrRCuJuMjbQuoITMK87bTCPwe3lboaG5SbOCqmhh2nNMHsKwrMRJ
7BEyIjyeBJHJwNFnKy1mrTi0V2ujkRlEJx9G/i6ffHu8fHw7+OzO/2PLHbp+mRPHqqPJAePKrw0C
FbG2777bvAmp2zkONt4VWVxugCK6KAQyAIzJZKsaCJMzgSXIkSUPm8FX7qPeoJkrGNtt30Yml706
qReKqA4vUMlXgIVHvME0GWusQGSKK5LsyEskuxEJKOyNRVqKElaQohVpHZvHfwR3MM7xDwJAocEH
k3JGWIZmJDNZAW/h9WZxNlCwzw7tFlCcs1K7qUwlrQXblWPQy6BIWUa1oKNKtRpQ79Sbo0l2R2cI
enMCC20e84jkD5m5zNEEbBogIMNEIMUGzRNFO1q1ATLVWilfzbq1DY4vZ1uYiIUbTK9WU8XJV6s7
WoMFCGFVUiYTuR6HeMmpokwamHoZKUrCq7FTLlti61nOa0TA7m7Yw12U2+eZhmZTMzMMzO/Q2aBQ
BgjmH1PM81piUMDEuJkZH0cRIiGtj5KUrDLLVPa3Njtex3/nb/NjFl4OZ7B7HNsHwNvg2zoI+ow8
Q9hv6fVrxttzMuW24CEHAUkewkKqBKSGFV2k0YeRA4AYQ5hA/b1nk5PhOs/fsn+lN/ZTKTG/fFIZ
mX4nEO2JZA0JDKSzu7u7uzMyqrKqsqqrMzIgkq7w+KucRQq+ArFVBDYqpdwYSpu15iQzFMFTN3mI
QO0EtLu7u7szMqqyqrKqqzMyIIKu8PVYONwNgCPYdgPyAIBA9B2AkD4HyWstawIrVrC1tiWZl2rO
lLUhLnQdhzl4tMXc52BoMh1rzEtGcyFhJHiOliDu66Ul5pLGBcmViY0NpEBh3mg+hG2v14/PxhJa
S2y1+q+HO2XHY5Ng7hMKEF0D3mBwHAeAaD3m4qer2XpBtUKLR0tjSxbnk+7Wyvofo7ztPBOL1VVA
ncpBVCUoYHi4qDVIUTQQ7TRO8yYEDA0QKC9gMQcGGB1MF+x09dcnLpveVmZmFdyWWjGJITEzYEII
cCQhCNTYbPmkRENGSqTR2K57FpVFqSMpKHstZC12vNzGRiyKKJgdTOCwt246kH7NlbulnDnPqe5c
aUreq8NgXq/k4z9o19qkt4u8wSGAMPWLF9TupsYGNoILmW0yzeWRI8JGJ5vZmmYSc/JQpQJZqS4i
7MEhmDDzFi5ndTNgZ22OZbTLNxYY8s8UAahMRExQ9JkgSoJyK4iUxlpFy2iLQhF8o6TbEyzGoMlP
QBJmhKCUnoujNKhMdH4aNGJNgRGY5541V4i0IZvzjnVsTLEcwZKeYCTMyUEpPNc2Z1CY58fH2b3x
ez0x5oHEiqIckkRUpHaiKU8nQZIYLg9quyBsdVoUScmFzlGDCBclEzfGW4SQpIOkHThdEMXKeZ8z
toJCcdOXgjPKDl9tht0LRGcKVraFVyCLsrKztZETRUbOgkhDtMO+IGDyQ6bTyjqgpNLvEbS61SME
N9bvteFCrMo77tXRhMEIIKKQ9w2xUgVel1vS9DOQg5Ntcyyuj6J4KA7o1xOWeuhD0524dJgII2JT
ocS+Z0slwNB6N2mgqMzoEtunmu8nFUKvdKXeKS/Q4N6tS5rAeCss04yM4oinbOGJIe/bthlnKb/p
7fdyA0njCEpSk+UpHAb3lAsTshC/Jl7BY4xsHqsxZzYkUI7GwcR3vD9vCYIJuRxnKhE8rs0Sd24O
+UEzHinnniRs4vDrBsriczNPPR0ZEL1GzjTyoVAmZnTC4ggEi4XQ0kkCrpzre/GhAyba5TRKy6Qn
DwNzuM9KF5iGGzqjDgwqBlzDYp9BhSiVIwgcFQQxKIzwLwNl4zeEMAwzRCJeUy1w5L3p5dIsgeIe
ZYgXEqABYWcAWMCGAgnB0G7mwNVJWrBGrZVSUcFatCoGGipJI1atGSmpSNFMFMlKm6Ybqy0MJRhh
Mt1TZqcko2FKlJ7MWpV3TIqaN0RGRolK0SYG7BgnVxcRk2ZUwaqVhwdFaDQmiuDiaDdowGiYTZTJ
VFI4PBNWhs1MuCNDVNBgbBGErQyUasHJJKJqdGCamxonJllShJUgy1VAZUjDAiMKVFUlEUZVBuUG
mVoUmDwEMgjCc1bCBRsqRhUVFI3VIwUoRE1TDCCGrCMBCCqpVFKJW7CYVIqVJYSSqRCqkREKqkRs
qMFalJVRhWFTVUTCsqSpIiIVUBKSUiIh2P5k4IcEqjdUqt3VxcWWySpqykYQqqhU1TDVWVOZhgy2
U3aI0RhoyZJopsUgM0QFhoNEFQwYhdoqYUhsLDKYGWCmqq4MMsnBgbNnMydgmCxiUJpbEjS1Pufu
ZGBmUMhmKCXPUkkkkkKM7Q2MCNvtKPv2Os78cJcxXK2t2rgwmSuDZybMHA6uKJElVI/wVF/FVtmC
TmVI52222K+B/Ybn+nutltvkcWi1apwPoCpxbK/B7662fkrbPrrF94fV7tatRSZabbYVJFQy5DJ7
hg0KcTdl4HYknBgcjwDg7Q+b9T8VIWphbHHGxhTA0AhgMDcBbW+BM5uvo+WDREREIQYHy0TSlrWr
iXHEsyb6bkGuBnsAYvEwCjDcWg0fFowy+5g5PAnJt0Wq1I8lJ9uNtStyd5ajKZypNCxVNxQcGZeq
iwjwKehWG7A2KblTJ83/Bk+3/tt9M5xnHtOJuc/KrbVrmMEREPU7jmYPZ5+MkkkkYdQYLtDgPZ9W
225xzbncfkL5nvSqSpqNhetUSSMDE7DcTpOknQ4HxPgfU/A/l4W8BuP/Dyepk5M1arxO45ywaDaX
tZqPmWkJsUITKczRSWy2W8oeVtltqNT4p3ikavBVfgcDgQ9x+DJORzMsE3cDn+b2s5yyzjNpZXS9
PwB7wJH+BQjB+QwIDxthz2YPP5EGQSzmvOtr6ra+dfttoImh21ajc5pzYSpxcivAf3HM4H5lx4na
bzrMhsG40G8yL82uta1rWta73gu1MR8wyBlRkZygHnwsMZMq0xMCYSUmSoUIl6TwLD+jiympeRLB
qXC8/yNZ19Vttj5m44GiKf2TtPUfQ5jfQtLbdnAyU7iu0kmpGo80k+BlRjBhyGC+4eXofezt8rWy
2+vNOs1NWMsr3FnhX/AsyBWCWOgkcd4eIKfE3LSVunzxAJnDqpQLhbKcMiQQbqlVgtQhEsyYV4Ao
aQfvcYVmZS2fd23+xWVmgY2jdJYXBONhFSbE8JwUVDhAEGCmGRMEGFTGMFqJsphcLdbJg2Ki4Zi0
LmMRhyKWNs4NGxhhQYqIpowplgSsImhUmGGU0YNuq7GSqUzCEEQYtiEjbNzc0YYUoimilKwrCJoV
JhhlNGGhSqVVSlBUNw7DsF1+nWSRyScBgbhARwIUCBcSSh7jebSh7jWd7OUdhnLBIRk0HEpCIh51
bLbShKIESpBUkSlUJUB9ygnkShAWh5g9xsLy0k8j3Gs7EtPJPccDVofYfdVT0TX8b81xcK+TL5PB
gknPRcHiOZ4n/hl8JVlFlW1YGMPUHkHQNAxKBz+/u8/VkOUy5YZNU1dXSoGRlZxx89x8+3pj4KFa
XmRM7gOJE2EGGpWKs3mK3ZgBCRIxEyAJiZMo9ycREhFKqEmSd2KRYzJURauFUOcsWtZoNYvcVRcg
0HOm3N5W5jyqV3MVx5mCRRiYyIqpVSNDor7nZS0UJ093/jfuwxMzDMhJgew1IeLdiqcsVTliqYBQ
qlJSpJCqqopXQc2EjQ3D4HUAXd06kkId516GlKSjRg/EwIM+ZCmTCMKqoqilJVRofmatrbRZV+ok
dpTzMuLc/bxtlVgdU9xUvOstNKJYZjMa0lCxpHvNbLbeZqyVHiYCTtHsH3OZ+p2m6QE+JTyKU5mD
6mqZSV8jR7in8incT8Sncypu3SSqknKMe64uL+TwH7KVycTg/I/NJGTg5K9Q2T0dHPraq7GB3H1l
VbF/5XEVYsqVKUYJiYMGJcAtB8OnO8oeetXWoa1q61DWtXWoaSA9oe4ILQaQhc+vvKn+EbQhXMKn
kf1Lp6+Ouk1mjMNDzz9VY8zMWcgb0SQ/L8Pxc01C2rw5bctZczObGzuDocB6zkM/qfc95j5Pq7Cx
zP4IhrJ+EhI+jWaxxHcTyytltoj/Uwfk9zBudrA8zgnR7Wx2lF6dy8qmhQo5Ow/RuAn9AiIaWJMD
ESRU4JrJCr9UPdm1PDXZbZZa7zW7cOxCEtGgwH6m4EjcPYcGHecG/ROWWUsp/0CIh9Xg0NR+aSTn
xtVTpdjeza1VaqqoyYKVISIVMxyb0bUtUWImgZT7PFei0l5/QkSqM36qUVGqQCHV3NWiimTTnVtq
/UiMYtVdDi2VpH/FtOxJJh+DJVZYTAPqfJ4vwdHUeQiPo+jbT0uMa91zFqtxxDY3nz+cuzk0XZig
2OMUHm23sBCEHQhrU7drkzMxycnHj6MmlHIZYUijeQhXrUG1khSWsjmGXGT0wMHWPIY0/6bBjbMz
LjBszZkclbZHd3N3hSMc0RUenpmtattHYRzGNmwFGI8PK223BlRqphqor8xEd72vzSEj+3m5mZ4v
N4NrQnm0n3Ucm5iuMEiIh3nAbgJggYkvceo9ZgMPX6Ltbbbbba3RXwKeLxOTge0pzPepuTkNym6f
Pe3D7ohK+SOSbNYdbLS2rfsuC0YBl4mTEW223KpNCJ9zgapnEzBYfh6tzOZjrETkymg6XBoIRDi5
kRDtPiZdGVVXmk7TBzHAyfdIhwe1hp4W6NEkHaIiqKCPF/KxrZSXJQ6QREMtilDE4NyPgtaGoouU
ZDoa1hiZWMkgELD0rK58JiW1lNEGXlXNwiJl9h8DXjZbLZa1Oh5G7gc2D4pJP0d6f1VPNTjtatvA
5u50PgyfI82r6fp4fDGM5nN8DZHm9tWvc7ut7sYYsmLalKpWruN10ttt0CnQpzPmaGyehEKRCpV0
LBeZerJStVa0pW12upuAnwSIiHck9xEODYoUah0via0kEHkITQC+v7emoBFnlwddlizDMWLltuAA
PMqARZvub7LFmGYsW+26SQM/MSEIQPWtVW2ldY2m3CEkgwjJGiWQccU+GcvJG2uYeybb7Ldmb7rd
zdnCTjIgYxjISMMDCyLb+76shJH8lT0VIiPaODmZoiTvETtdTK7W5auZAJkb3guSEjuDvdhhScRg
ilVhWElUVVNoycNta13rwoon5vkREMh0HcTKYmwsP1Mi8wL3QWFp5Jco0v6MB9i42oJ4FyqMUJJJ
C4qiwsMWKpiei8sLXaylp4uYRLzkREKPA+L8lfFIiIcz+Iie85sqSFKdyd2LapSUjsOZ4NXvaJoS
SpgkmqN37Ox7H8XAeBuna8XakJGulttvLpb2mopoUnxGD+DZh3mp8Cn9zgXI4PzVPiCIhoJ+q1a/
Vguai061E+TciH6NnA+hNt+1jGFwtKcR+5say05HA7XWXGLIWDwLnkJ3HQ6EqUMDoKHzdrobj4u9
ijvdRqMzYiRJuVUVJ6nkdoye5hoy/d0IRD8jqNfS223sytHYfY1HUdT4ngaGT/2cHgo0KNhUiIeq
x8REaTkImtnBEQ96REQ+XD62tHy4LPTd03U8cnbZVy11z5WfJoLrWHOr6VBrbS4rSSdMVzrWrhzr
KYxlIOWK5znNw5zsRtxYmx/0B/BSflrfv9n4fz/J/9aSqqqqKuLcBIhy422222224SRHI0f6P6ER
D4NDByAnOIj3OTa3KPsNDYUWNbLbTJmj7f3fNa61c3vF73W96FXvF73W97i97xe91ve4+IIFGgFF
FKRSilClIpSQ7zBMEUpSlKFKFMsEMFKUUoSlFPYwYKTJzPmdjYVPYcx2MP7lPM1IjBRTmP+FSQn/
VRbC1LYRAPJ7yoyqCJNSXJUWHiVfgtKgkj+Co1SeDQ5+a1atTrhdVVcLkYFKKRSlKSUoUUSUGAwT
BL4CKev2/LeV2yWV2ytgkC3KBSklKSJKUFKKUkSlEKUhSklKClJSkehhNOUtlYP6tattW/3PV7yq
7UTmfUOKSJNCiSJPUcj387e1jFv/RzDXn7NFtpb7ZIvk2z+bbO9t4HU+B5n3OYbGc5z6nOXGh+xR
3nU6C4bXM51FXahUpUUKUqK/QVqfqPoe471Oh+JyT3HqdTcwY/G1bZOxGBJHJO99TcZJ2VLZPjZL
TirNi2SPJ2KwVJKpT6nEdTmfY+gmrigiHEy5pzerQ+3vttt3Mmx4ngf5Pe6nA9jV7D/Z6mT3HxGh
EQ9jtOpyj7rVxbLRaPaxhLUP3KUVJStlJ0NkkibIV0mKWlKqwqWqSrC224EMHYVKVIZIkyIYSJVK
FDmNxgfP4KUUdLEtaxOY7TWloEiqRInM6KVSpJxBEQ9H6GpTtPMyeBWFVS22qqFKJN4qT9S4oJJ+
6OXnTTTwrzeNfpapVdZW66awcNbON7a2sNiGnrNWGiGtpq2V9SQz6OKXDBfL0f287bc4Dfc4uMJm
FXQ0MSQiYf7ivVg0bHoYxatvo8iJ/M2P3epzcjc9o94p+SSBzeLtq4erI3NU6GU6mJLEbl/JSgo0
mwqyJ0CJR5NL/lKfBACqCNEqEiHv1/r6/LGMZmZkkww/Z+zthsnjx4zF6zVxhHGGjCGFNivi9o0O
8yN9VwlwuD9z/Xe1bdj6vc9hscD9ieKtCellsqU6nYaNbboe4+hqe88Dd+R0MTxtnJg7XruXVhiy
3/hqmDY6jBf52226PUrJCSdhhs/IZPUr4cbbbeDvdTlYtw/kOSmln4faeu6b85kkGGQlGEwZEJGQ
kpiksSVWKIGxs2P4Pi/OTmyspZWqMjISDYIp1MpnbVxsM5eULX1M5sNhcWFgVMz9XaRCw6DSiE0o
flSKUijOxRCVLE5j8j1chaf2MCVTUk+h+Q/piYv1eJqKutzmYoLjae4+ZwNhuOpFgLeQ+/vHfkfw
9kZkDMkREMIhGZAzJCEyCOQO7B+plMGp9zy4L/pVxi3o4D+ZxNTo+h2nY0GrYwa1bupVKssxbhgK
NJ1KnqZDWdgnaZlFFF6YtBuFjU9HvkmGXMknYJCDQ2N+AvRJGjcZ8tDUsxVuqzNviMEkSbmrcy8D
7nvcSPYIeCUQwRgalSmPG2snI1TqZP3PoaB8zsP7iuSV+JyMZttt8zL9TKcyuxHJ2Mq+ZsbDiO0w
U1Pu/1iJNeNW+036LkxS1jC5Gie0av+WX1dDnHvaVjGGKsqKqGHE/5e1P9GZuZoiTM+bF1vZV+bB
e53BwbkCfuqkbTvRxH7qDkOJ9DmbAJpbXuLUmJ/DW9nB6Pu5z1P9FiwxZWd2o5NBwNxc/NISPA0u
sjaoYGQjnaT5HWZD/RpOksGczpJNbW5n3Rlnda9Ls1dPf13d2alF9MDZTbcVeJlGvd73JEGTZTa4
rOSM1RvGUzkPmwkhTJGbmINRdL3D3sJIUyRVznNsTgFWImYQZz/aXNT4bU09XWZtNsjeaZBcmm8+
nz5dmv3rfAiqmpo1QuVXV30UdHdlcpBhQgCIEIp2c+ckbbGNyOToYbn5HxEhCEHyQhL6uDaCIhrb
QJkZ2luIiHMix7mG4bkIDPV+ieziccG5INz7HMMD0h4hgPE2NTKfRsf2Pe0N2FdR3NOVtts3skkb
gkdp/QIeIYCMFAaVGmmm1UiolRNjtzbEqk2OnJZzc08ncjiImczj0ZjcZTMCIhU7C1N/Yttu5uPy
SSan3VPq+DodrQN34ngdhvEwNa9RQayjnOg7S03GBM4wZyMhEQ0gTqXpoODFwdB9kWDrO14mTVkw
OJ4FjS1bfidji9r5vo9z3up4B2geZ2B8D5Hft3HX5OPxevhlwHGE5GVV6usDIwmjKvR5fFsSQgNz
ny2Lz55nLWKuRTmZUXUusVcimjKjnzOaSQgIACEID0GhcaIzE4pwjoIRlhwjQlxBYqSdKipBcwVR
GGYIQOVgiVglZCCIQMCZMISSICwZLA8q0uaWLO4SFV3gDti9R8o/8fsxttqs5REvhFy+M6zrWpvh
ESApcKCugkIhQvsiE2d7QIujG7ttjawerreTRlzCa3HrJj3eZcwRgmQYKjCjOPl15d2ZmZLbLa8t
ktsuZpjOmmzVKlVxVulUpVSO9hqJEQ7XQjQyGDpWNySTIRELUiJCfNT7Kkji73BkRPm7kknYMu5M
MKrxVMqiKrBVbkYGSn+ZgyaJkwyTwVE7VKok/uNpp57cfjrNdddddkXraXX332rqXXXXXr1495VU
/s/d+x4rDuNByP2NprOxKlSwWmgzF5nOvwp15q1+WZLjuZceZnQODoCEw4CiGCMCBuf7nkf6KpR+
w+LyexZbF8FxJVkuFAibkTOZS0+q5raCbCgwJ4KFSlIqU+qITvHvTYaEmCSU1BiSVBgfsevXM9rX
DUajuQMeNEceERRIZRSP1nFZ64ydtvC23Omkqs3bJvogNode1m1oSSakebatNiEZmm4e2MbmZDRt
DZk1vSZtrMI5m0lieoTHooam1rzbVptJqO5wpHFhjG0hBgYIGBsMDLJSpKmCsphJWG7RhJWhhnNu
FI1YYUNEjCElSElVIiiFBVEisMEYNTBllSimFZTBKw1aME0VjK4UiqoqblMFTB3mh5Op2B1Trda+
dzc15VK3YiLrW1m138xBJVKqVSqXNttvNh1YYOo6H0MJoczvfWrWlVbadDqbnU6E0RFKRyNXEyO4
pqbMCYKPQCEIMzpJHJJNigkhgw/sIQLv9w/6+Xonc1XbgXHjx113NDpQBJjAExgEiKqIETYRFH/K
kYSEigkkbCF2ByDzGhXukkcknXmPwFoOMskcjk/Jwkbb8Q4Bdi2bYhISoUF5CECYdCsbGx/mHoDs
A6fBtndPwkm9skZRf2U7WFe0n5iORyOpzMDiZS9VrL7MGDq7ARENjBEQ+Ljrx3zbm5zG/eZGm155
NEtJW8HmY7YVgUoIYy0T5MCRNWRKk4m7BgpVfyIiGm9ttuWgwYPFufV6th8zYwR6piKjIXKmjU1V
qrRWtVa2E+6ehvKF8VrBKaG5zKpCHyVsjiHm+rmeZSbHFFPFORTj3W22/VNg0DiUKksRpLjaYnUn
g/JzGQolDBzKknOoclyrY+KpItUNjsVN23M12WWLIVZlwPGURVZkYYp7pJlmZmqoiVUmQhNGzBTt
bnBkwU+bvYHgqT8gREPU5VaipSHIcEQlOaSNhoiRJTKYMElJjRa80kDB9D81Spg7TcT1TBg9zM2r
y1PiIig+qKH+FEnsZ3i/NEJ7n1NJ+7meDxETBscJHGaaHVTTS1IpbW2tUhnx9pfOs3Jc1oN7rhIk
hiJhvd6KpItLRINTcJu1aErMA300kJIItAeg2O44Et02uTUfDK6xOyerneRBjwhlYqMR5rLKzN0H
8f5I1z03+SOJlIkvMotEbbSc6VpnS50tx9OmMYyQ8X3fIERDm9zxV92lxfJ8WZ1uKSSjMsRg2OBR
zm4oK30otv2Kpuweg+LBOApwNR2PTn4a5zm+/MzLbcWgSQCAoHt9rY2/WGGwaPUO2UrM/bbXTzAy
ztSvWvyXp5Ac18TuJHgYO9Or/NVUwPA3OJ5KZJcWmAvMhYbm51PoSp9l453SRDFnj7KK2zdopW5G
YpgQmEqrVltlhSqCnMqPY4sGjJU6lHeV7DY/YSEbjiy1U/Q0LC0fA+jOdbF8lE+AIiHiGhuZzuNz
va2K42Hc6Wcym0nQRDij8y4+SvyAlTqVJ9eVtn/5trPYtYzbXg/NoXjO/VpTc2lR+bOmJYklDafF
+Gh4IhP4QQvHGM/hWlVFMpvZ1o4t5Uqj6qfch7hSvqdpyOpq8CinNMRtbTRqw5vs1GjRqYJkfc/J
qYEkuFyKFUVSRLka3ziJKmWbemta8Fg3HaZxnWnUkJFWdcY/ayta0rWta9R8xi+B7GZzHJEiTkXp
sIhpb1HkxLHo/i3eavuiE84QPXx9LjjfbjrpXfprp7a1rarjjHE4Q7iyuLwt7tQZdWu3i113jldM
zNZyZptquOMcThDcsri5W8tQZdWu3i111x2PlOdmc9Qxuyc2o1ofBa3YySO2cSY5g5TnzushqPaj
cfHKGm7JyajWh7lrdjJI7ZvJjmDlOXK6yGo9qCUIK7j4BV0dLOqUPSj0h3lKWJZYFPRd8Kjsl5Mj
syEcjiYxmTHJmYwjZKDCZCMeExt5HKmhsbQ2fnOfn29uxr+X8dvTDV1PKAm+taitE51dhnWmFIgQ
vQIBN1EhkQi7WVtj0QxwsjYNuTULgMJqEb0Qxxlfd389d5rLKZttiNH+ggMBFGHMYMKaOLZhDRUI
aJIIKiJhQiqIUo+rJIiPzfs/0cBoSSJF5Nbqfkwd7W0MU0OQidbIzLVwOxISKZMqp3pBgyZOwyZD
IBRMEmMQ4Uc8CY6zBzCY7kG5mud452N51zuZyplSlKUpSkKUUmEcimoyD7HibGRqEA/MncBAQLKA
wHni7zTO7u7uzO7uru6sRatv1Uw1fJTk5H0YMIanMclNjQ2ytUYJqUZOrBedtV9lamhg82xloqqm
CYTCU7TU5mqSB0rp4DBmWVIEksvxssutc1JbBAwQbQxibAjI0m0jKTCRlpExYeFsk1Bs0aFRiDCG
BwI4ChgasH/ZRlMtjDBk1NDgqUkjUwVwNjZJalpIpo5NCuJlI2GwtCYijF3FnTxnVmPMmMx3IY8e
ZDHsTWWWypVHI2G7QyaEREPeaoJoaGEnEUypwD6He+w1zbbb+7Q/qaEiaGVOJyOYkn6qSHgk3lbY
m20kkIQMpDXWaZJZaySFZHSWkdJBsE2Cf4dcrg7bZgNptIIUVEYNSmRT7NHiaGENSmp5mDfW223A
5tTKJkjcyNdLVtowMHATU0OpxehVISVEkSbqfibJgpsPFJk8jJgU8zBoyk71ZHgch1KjL9QJ/o5m
5FV6qSpeUKmonqkkzFpamQaFhitMHcrHS222lMjVBM72quE0KZLJRSjSmsyPYyHSZTvMplYFReqY
NyUWLjISdY0meIkynewNLWOlISPk/B5PA4+FttuCdr7KnwPidp1NzUwYOxwQaGWidhVW2xoiMHI9
M5+WxZLmCYjI2q2922t2Wu0I0OzAZZCTUbpg3qlQOwdgVodkYQoQTKVUwqYYYVkwwyYSqVSYVWhq
ykpkowPkRMmxs2MGpTIpRTJKaGjJTBErBqZZImSj8xgyU3aIwbClZDONGKxWLGLixi6GGSZPWCAh
9XRh81UwnM3ISTdwVVWr2sVadrD0U0NTZTI7UQn9Ti0dyrKtUKMq+L5d6qtTnPL083NIjTTGIqJP
DuYBWWAAdL/HbwUj0MbRIJ69gLnbgsHzq+h1mZjR1VJbqdyg41kPxxw+L7cX3X5c7svUWFrcOU6i
1hYHc2BS1hazDFAWA63266fjhD16zx0DQIvxN+tRvobdeU1ymdpfWEO/M87hoEX5m/NRzobc8prq
LWFtAAALtDuKINupdeHBmnq5qbCNp/adE47dBuNg2IFhWPERABAwCyyx0mv5uBtuC/X+vx+PvHZq
84Ttk06W28xtxxzznnnnvx3hFKlehHbuEVUYkkC1haAQALSHi9RkZRqqGGGDQqoywlUwhUglGGCq
K0MNFaFaMJCAwExiYM9O+8kkbbbJCTYw0DNmGGFKqZZRgpVMmESMMDAowpRhCAUpBMoUYJQoQgxq
2KwZMNCUUVqywVUEQyTBhMvB7Gw2PBuZG6jBQpzP1M5YYrTSc5rLihQzB1Dcc3TSmAkssV4176+2
uMz9zCiKy7VA6hzNhjCh+IpptP8pqyXrW/SONu5HIkRu6JVWqstqoJSiilFUUoVKlUVUpSUoqUVU
lJRVFUUoqiqVKKpSpRSlCqqKRVJUUVRSiqKkopRSiopKhKm6SnuQ96puZE/yPJ4dffjidohCUuTD
BCEsuMrtheYQjHAEpQhKkJg8GiaGXsDjYtiSSK3VBNzmDVqiUYPQw4uBgsVVX+5hH9lUFNDoO8wO
BggznUnzF5tKREnQb99KSTOUE6DpL1idBvKDOai5zFCh4lzeuMpebiHtPJ86ttW+6Of64uNFMpgp
ueoU/AwdBx77fmbZt/5ZMaW4NHQ8T5n1Pe4tDRI6n/R0Dc/ocjfS2q+wkT2HqyosI8DKlhmN5wv1
1rW4/weBmMq9vObt+v/a22W223c8QOwOwDmLmBgwgAxidSWKlkrGQzASWJSWVKiltsqVVVKUw6uJ
o69PXux9NCilHXr1916F0ulMFF1F73vejgHC4JRLrjCjF8d+zvvc3fDjv34u/fv37PGJZmfckkw9
wsWSWwUqT8Cnk6mEaKSYKj/MqjxNxaWORYWnqVORnTcbznaKKVdD2KREQ2AcItiwUlKVFR7/O223
k6FfoeRxMHQ7DU7B7XRGxxPAmUdRLVtstQqk+JPm8zJsKeRgwcjQyblKmh2mPVaWrk+5o7z3ldz9
DnJrxxcKtT0Pgrn8beLKjDyVo4AUpJIpj7W1U2K7DLJ7TzZdzgdVRkrg4NBS9LaozvMDpjZE3Lr9
0W8/TpbJbxvEqqDJufwf+jxMNjQaMq7X3G/sq36sYWuRCSTVBKAlCIliSSEUUCQIxJc7C01HaYli
IE7jWZCdB/s7TWoC8dpI7C86y0fE0PE7TzPSHW3zPsn0K3q3C4Li3BKdRSnMykoZJzKdg4Q6WVgI
7jt6Txatlatlatldn2cZBxtk6nvUR5DkOo8zkXHgUTtZRlNRnbyPAr4nA9qJ8jxYO5SlJ+A/Lpbb
b1O15qqnwstWrZwZPwJge94JVfuixzGkmJpPceawzGU6DqLjnOkeJaXneknaUNg3ud2CxUNg6Cic
TB8SqJhHM6G1WvaYVumxNj6Ohw1tW34GI6W1JWpMHaT1N08CehwPgnkNTtR6x1Wq48VqolRTlPZb
g6BAYAIB2tegvtz3dkchl/ePsb4oFvaaMpV7hnZFEirqin9B+QFhYD7B+oFhgayb50ca1+UZdsXN
JjFS+MYwIhLfvlAhIJtdEv8CjtZ1ASxJJZyw0ObkLzm5zMSQwaZmatFfDzZmZo0bXSwQHZAkitCD
ba7nnDsprm3zre4dDgYHYYd4J3NTAjwfuCIh/o3v5fYRFjrf2cHQwb33dcRJuRxFqOKa3EqSfgvV
RwN2EmEonQ/F715W/9tDL1NTU9xo0628cYtxP0PkNzY3f4eLDDJ/MpqKdEqe5+D7PB4vBHcm6Tya
qmxGjyeFW2y+h6iGB7jsPHXqkkkkn6Gzb6DIxwEAH3MNFep9VKUqojaPfbbbqibp3Co5KT2dLS2x
XsPcPJ6giIVzVVfwUSSRJhSE1droKpTd9Huew0e+27st3aSTU1HYlSfi/ubJ0OpuqTeYHI5PwiE2
EvcDgqTrSSIPNXqUoqqTpOBuN5REGwtGs689KbU+Dr6VIkhbJEkK3dX4P+yIeb1SEipEP2iJMxqP
8GYiJNpuEhKDudd7Vt8DQ9R4GrBMtSuSPYnoMPYHM4/JbKuHwIrxfm6P+lV9HwTpvaqmkzjO1jSi
JcLD5OoqeDeUiJKGuV/wo/U6xryxjHdbbbWFwhq+6aOtXV+lt7NFqZbGjBUwMlJuTgbknR+RoGp1
GConIwe7tW21Vpg/EtPkoezE2qPFEJwdDzUdref5flESakhI8vZbsuO9cYYMsJ+5EQ/ZuyhJHY+a
1itJqER80klSxQudap8ni0JlSEj/JctAno5REnwezMtXEQ2ATmcCiwiGJxfI2oq+jFxEXt5ENroN
TgRDk6X5LncwPVg9huMwuZDwKk5FD4OL+3FJJg0Oxqc6jOiEvcyH8P7fSV92v1ZpkpfRFcI4zGSl
yK4RrW20j3ZrbbZhvmNY5hJKwzMaxzFGL4AzY4NuKbabRNakeni0202jTTYDcsFQdHGDajG6Xxjj
hMwjEWxtFY244JtjUcZGsVMbC8xi2HjrrW0kwgRCAEASMNiHXZJzgZ17HYfw3vaZ8DUIIcpSZABl
Krfs6bc8ydMzte7aKxRtxxpsbjUbcaUZ7eNOOWlnCzUNbYWtYmsznc3G0+hq2SQIaGAqMQ2Ngg+X
XrvbbeuZmZmY7Mx2ZjeVu3QAbjAExjGBgoJRQyN7W4Ot9nq4ge9lb3okk1u4jqiE8n3dzvUTiqQw
oSqqjCpH/amTY8TJGqlV5sJomXAop8gQ3sxKtkoHdy4RnJLuGcs5JdwyAUPwfgcycDY1f822KlRg
ricxhT3Dc+b0K5GDV4HvcjicnzwtW4uLi8j/kwSRqfQ72DzKcv4W225NU/oYGxu8EVP+7LZbbO1q
5GXU6HA9huf0czYjE8yqJasPc5JJMSYsSOheTEodTQzKFg6HSC8WI6EUGo0nYRaaBNQfZUTdn1tu
bcPWrlopkpRgMMAgUKARAJdO6nZHmXDI7lx4TMyvCX3tzYbMzpmWY62ZINrMlbMhmZW28zTeBcHA
SEkoMQkYIEmIkVJEqBKlEiJUEKqSCChlYkhEkwREQ1NGSUwYcZEiTyLSkqTYrCTvP6961qasI2OR
4lNXyGxk3ckycjo6tJMWSlVDgoVfV8jq70pRNaVUVLTS6h+D2dy/+vC2s5t2J3tTBStDLxMj/NTQ
4nmd54mo4GpT3HM8g3Kc8WqvtMI5HNyFU4nAoyPwOjarVqw2TsThVqCcjvOBskBNj7HMwqUMyg0F
p+S8+oiNQaWdeNZEvLS0tKr4iTOq9mRgToYnOkyFpzjBRRCikUlJSlKSlKKFKSlFKJSlKFKUopSK
KIpRJRRSikpKKUpKSlKKUUopRKUpQpSlKUSlKUSlApRJSiikpSdDQ/qZO837bbbae470EQwbmxOY
VLCqOAqXmgKjsNp1nqHuPM7zkf9DiaHtPa4Ps/q4+2222cHhbZhUZKYfwPJEREN0ok5qIET3CJSI
T1UnBQPRFIP6qSSWvXW5mb4mySVKxSs+ltW3tlZZtc191eVxXwplmoiL0A99tVQojoDEkzmL+aEJ
aD8zbs2kkkknoDqdvwtwyVkrCno3KalRucelttv9zSIkubkyDqKHWdqLnaZg7D3qNhJJNJkGc3kY
FiwajxSXpsLTOHsttu1dczqeFJdpW5nICvnXFK25kUps/4zbVRzUqvoIj7sJxsViY+Ug5Ag3JJEJ
KOOOQIdwCENGSlZLi2xbaSSKe0YYIfFzuO4H4yulne7XwdZa2WZyie+LjiLMUqlLM4AWAFZtYq0o
wU2MGppwtttncrmMHcUnsPt8qUufY0l5YdBoMxUqdKxJgdzWNYjYQgXkQ8D+k14222222yN9rTYx
gmsqquMLiEwf2P9ARENBwTof2d6EJYHQx+rY8cnhp5rOmpJsdOJmV3zdM7tPEvDNCQEhMOi3RFF4
RmUrRUNTlkvDNCQEhP4+OhvUZ2ZGKrsFc3SETCKioSMs2tkh4e7NMGFRWu93ZUR0VFQkQzVdIeHu
zTBhUVs7HarAAC1goAsLf4gj9gYQ+NhxObJ98plq4ssmKmEu8GaMoypTXWLiKH3J0VG+GeWf0+6q
M/PmVPgn8cTPS+C+DiFwtjON8eVQ1HjC1jhk42UX2nMw4hERFCnbdULkcS0XldXiuMw3AkRYg2QE
LpGlGClWYMQVdSYIiMyn7UDiaKOXpIlHrADgi1hYGwtYi1hYGwtbbvHNff/XzaYmZma1unGt+/TP
Xfukd2SuwS0sLIbZe5VnBKE1szV1i5gx2nD5njjbjD1fjiYGwzwtpZDaxdKVWAbakcjinjMluKfF
6OUyoPZvImreaXPnNCGMpCpTUtVQayC6rWlRO3xyPcZsob2777Pe6Me5IbyE9Z6bCT0mEKTtCjyY
JhwJKTR0drRJlDV1bCMKEDcZBMNHMIBTc2Dy25SSRtqYxcUGTi3YIcVYUit1TCSnAlGww4mjVUat
FSVFNGqjkkAhTVRlownBTBWU0ZZMMK9mxOBQ+Ch/TiRYufZ2NiQkXiJpfZi7V7uaSIcREbG5JsKs
7esJYWvJlgeStWTUVqqRMqjQaK1ZaKjKqauDLxHtH6HAU+BoTkcVUTOq1mRJCalEkkUIh+RYdjrP
RkVg4in8HE1OjoYOhRuejq2PiweCREQ4tDhvbbb7iIYGruV/o4J4md8jWbXskIomhMFDYfRGhwNU
RJ8wR8wM9DfxPI6B3ZejdVlboICnNEyGDOhaUDHhApYSEHIHaS1gasbArtlIONsIQUEDEiEGEBgl
oMpVGx8GWqV2HkeBzNRojmTinJEPUpJKlDCSe8qbHsbNz+aaHIogX0GLxEwNhgxjD3xuAbdvSSSS
Sup/Te+jEiNz/BaypERDH8uFa11rNFlaVl9c+W7TdtiYhhjobVsqS2pCRWFKqZN0jVgwiJJIeSpr
KG4yGR4tTgSTwM40FCpY+DKWrjkWGBYVOhmVcRlEEoXOhuYr2lTY5tzQw8Dmc5pattqllopUpZFC
d5h3OCuIQ0ZVQ0V+hi7A8RH4nXkbuR8f3zDHI8yVvFMyY3imZyRq/N2j2NGHa7WUe17UiIhy/C22
3tN5UvO99DaGl2NJyGCq18FiUWHU8ySHZ0t6tXgaJH3Mfmtlq2P2NCevS2yrTcVCjY4SeHli4+7D
6fjbhwjVVXDgcjg/g1fgRT81VVSk+x4H6PF8RE73TK1JShVSJVSRVFVVU2OeLbbeD8TVzfN0JCRh
725qgDqcFF4GKNNtp8yKNtNtkIH2DoZgTJIHntpDLd8r/K3mQLALbFKFVMKkwqiyaW1ERhKm4+5u
jA0mFqqrQYGNbbbcEOwQYeIEEkfYO0D6Tx9x7MkszRkbUDmVjK5Mp2sphl1PsSdTJkx1KpakwfkU
ZNCaGWTqaEaYttt8zhEgELhMqcDYSRpLi5Q2mg0sy5GjUwlT+J7/Cy22XBowaMpTdpheoEuFoknU
UkOIT7fx/r8Nf0xn+V9l033iC8mUhncJEyyQzwXme4HUDcfoHAt0BHzBHI83e8yKHSaVWJlNpUyH
WqlUhzUtkqPl6W5ZUo0BEQ4vc6Pj6+enf8vloir06w1JNKpiPioeGkJTqoqhb77wLxegl3VRe4tf
6fYpsDOJxfGhlXp2aEq0Us6kTESEFOi1U6WcdnHfjwYcdcZ48Jxpz6WMbpEKNTkwm1hjWJzC0Fao
VCBh1WChkSgvg4mYjAur3dkgM1Qjm0G0EXwKNAKamHp0wr0rsKKEMUgcI7aQF0aXQFUCSZZr4ESD
daNy1khYVER0ujNhbm0U6lcYJiCYCWDCCEKQb4eBCIDaShvNsXxChSGSxupoIbOgFAGIhQSis7pC
GSHg08UFBS7XKigLwxq5vLIEuoZ8ay8P5/9QiuexKxzaUCdRJ0YtJ0kkKUSiSpEzdJhmsnAAwiAk
QqDhyWckMCAwcilRa5h3QIC6QOVs31echz2ta52ctN5p4RGGmTlKcc9bGpB2koZknCm4kR0vkhcY
UC5gkzRMsJeKRzamtmPlovORy4zmdoJISOR0KQoHMS6d7uTQpG7Z/s4MstGzvbtWiN2WCCVkmGDJ
gmFbFcValE0asKqYMzpy522xRsdrlu5ohsEFuMUKM3Mmiqwri2Vsw4tWyJGGHDS3Qww5MnE1bYty
1aOLgrKt2G6cDgjdp2rxaN2GqpJs0TW24cGho4KrRlzGyhK7UcEyKpFUTKiEpSqlIKkkKQbmW7Dd
hhokpoywhCkGDGEDChQ7ChQoYQYzVbZhTI3hoYUWgwWhjIQMbcIYNhk0RXeo1NTQ7mxlgmTuMHY3
OfC222QknIf4LheZkNBppbkZNTiKdHNhWGBz5ZuMYamjWrSqwuFneyy3NWpNjc2NmWh06448Mcdv
Lbe6zKTMxJeWdYmJLTMrMwQBawsLAG1rAkC1qO+pCV8/sOOedzd22sy1mZYLvTLBQwVGFVUkcxwM
P4J8He7H81ZdDd3jg5KaIpyiZW23sNDZDQlaFJsVEZTrV8MMVcTg2CYKU2Gybq5KqkZJ2DCT9yn9
iQcXgU6WWyrbaqYdhk4KVNkOMNo4ejrbba8cMy228AkhixmpIw+bDzXd1xcrOOducbJF7LblUcOj
OFVubm4tuLbqIYYDdUJGSKkwqYNFanDS2VWgwwbmrtKVXQyDmCNB5BQoL0AnvzjkkkiGDjbbfiD7
n2djy5a8piwMmZB5g3lwbwIeIUI22KEIGiihgxiTMQxsRgyjKTJsfqRRg6Gr6JMjQ5ihzPd7z3zT
Jelc/dRE/PcXhX31zoCzFP/RwSZdiJsLnvWsVirgttyqSLCWA+BYXNpUuPcXvzajoXmIubhCQl2A
HMNGeuQkichJRCQl3CwGJ5FJPkUihNjCZGpsmTqbv4kqUllWqUhlgCRhKEipSpAqkiaHrtbV/Fea
4XA+BVOAEtg9wegO07s5kccIdJTLaXG3AUCgcw+AeAlsLgOYG4biOs1JJJJO8MNKVMm5TYibGWyd
j2q2Mn2P4qqsHk11Wsk7udttvU9hs0SRMmhR9DvPoagwbnAbHk8M8bi4q4wxjGpsdFObuG3Vaqnl
ZaWlslVKp1JxggIaHUaMHgrRWBjC1hKkYmkvLzIeKNSiiiJHc1r0xLpm3DCjiavg9rTFswwmjCmw
pJGU7mP52quGHNNTuMqbT1trmTQNRWxsZMoqtzJg2GgbHSTGlnfWHbGWNjaJYq0SwgvGtwIFDkUb
LbVu6YPIZKd5IymHsMp6lHmeHlhD1qzxvdXpW1etZ7e8JmIMoLCtvtip3812hGhHmZpWcTMRVGIh
JqKpQLWFuJ4mDmfgjym7ariYYq4YqtLamBMJuTuKXutuisW952GWUiIhXp1257as4TovUjoTuiXF
709rhLrciibol5VJq7AXgJeKU0l1RWvdgL3CXilNJdUA0Jon3ih5/rUfj/PTEmJErMysgmhceV3R
EREREREREKIUTNpIBDVg5tKttW/9D7mAyKeB7FP/DY/Y/c8DI+xRu+75qwqYVGb9v+ckkkk/gPeG
g9whUOgckjBsGMDOaT+zUWGs7TMPU7Xkax+DnMx1JEAfM3OYHB3ghAuXs7fykltskp582Npt3/4a
mydB7z6GRoZMDUfH8FsqwZCg1OJwLUlTIdRkNihimgklyEhk9DccDQnU2PiO/latvVH/w+7qHn0h
9XbCuyFdsK/SHoD6iEuYmH0D1hHA3dFFPU/wUkfFEiTB/29lW2rdEdiyKsRyT+B+DkZeCngbmDU7
VD1KYd58uVttuHgr/2eB+yZO0pomDoknmU9ynuNhwPmd5ueZopSJElHqUwfcweplP3P6HQneVE7T
Uni8FBoNRe96iZlDkWG9YlpT1txjGMYxjGXofLS2238TYHI+pzE7lPyOE2stlsv2Pue0exonuP0J
JJ1E+bc9plK2dytaq1qrWrQj8zxO42nBIOZqVJVEw/ownK2x/BPBEwap9U+B8zmeZ/A9SSOvTVcY
Yx3oxjCKPgtWYIr+LJKfgan8j5mzsVVepPLvtkZPVRUTsY8bbbeZwf57r5sqnciJqkRC22JEeza3
Do7zokJ0FB8hTq8DyT4FSniPI6J1eRwP4H8igknZbfwWD8w9wHQOA/YO0Nv0Z+Pq7SSFMZmYSQsA
eNNhO+KOe3x8r2d+szWtGv3cnHANQQCoVYkRC92MWRoYOtlfhFi9AnwfqCIhRqdzI2v4YszK2tER
J+GlrYNhtP8v8JERDQZTvXnsdZiWFzotpSVdyiuCNj/Dm0dj4GCxtZaKlSwqybCR2e8cCRtCE/78
3klcskpO0Yxo3BUcJ+dtWrSfgnJxNT8z7PiRD4PB4CI5I9HXsttt/RoK83enaeG1ttrHtad+mYZm
ZhmZmGZgM4D1h7z/I/EEaCH+Z3huGJ2CJr0ca1rWta1rcsLyhYP8sy94pJP8oxeDayHWtaXeyMjS
IjUkvRzO9oYXZq1qpWta4uZatAnYolFB5Mqp9HBHmq9BE9WwIiH4vm4B2DpExbbbq7REVOs5j4Bq
YmwbD+zL3KSOY+ZEKv9OCpRYqkJGlg2dVKUfoLnk9kiIh5mQVNSj3su80RCfdh+bQPxH+p5nJbLb
bZbbPmbvUnQ7ncR8XitM5GpoRCWIzohLlrvb2DOdre2soeKgl7SearhESbmZJJuDS7nkyo0ryfFw
dLyeR4NqSTYR6srneOfdppWlcyW22YSTBfUgwZsQQkJbP4PD15K3c93GiABIRJLzGHw3b1dJxxki
kZN3m8jbduxEfG+lKpeOx2OZ0nFwckczk5N7ndpEPFnIiHSIjudyJEmxwaEhIqc5weY+y+i220ql
dVSSYPUw3i2yjawOxaHFcqnO63c2OSSTFijFkc7ycyPc7SMHc/VXB2H3pZHom31i2LJwq2Fsloqy
JVQVIkn6qwlKUKKKHM9nwcnW2JJPFY5NTQ5NOynnS/TZ1OmGskcmoDL+NruxtDbJHJqAy7XfRj1m
+LHJd8l1AZd7Xti05LtkuoDLte8SS7xwMVavkfuZrKpb5e3m3O6CUMD5sL7hEpGeisk3uoZKFwyj
AQAoh+9PdUREQheIzj0QZ+YRmQMwSzb3ffcK5LHK6NOr07h6NBoJFUodEYEHfbLNuMYuadpUU5Hc
w2TuA+xHaIjFaanS1PJ2Mi9LFFjUkREKp3vECaNHkivur3uURJXijzJ0Ux5222lTiaFCKHSXHM7D
sOw5jqNQ7TwZAREOsRFBaucWkqSE2tre9xl8DqcfC1bY7jV7UhI+Z7nR9nq/QtWijMwdT0c/Uoop
uZ2dvPe6ycGQ4CJsMy1vNpUnJ+Fg/ZgVLm9+xYmJQ+D3HQ2H8F5kP2G0UIoT8O9NrqPBiRD93uOB
yUw8PmteDtNhhIUlPcwwolEGg7z+BRLAREMSPBi9xGlyex3P5Nz7HBJBh5UpWSCCtaUrCSJMVnjS
nmwfN5O9wfJ8EhIytT5ohOoRMHF5LXa7nQiEzxEmUROdufHopWlaVpWlaVpX4t6RU5ixVpbFXgiR
EPY+RE97vb2V8VpqUSOsRP8HY+rafNqD+eTnVwxjDGMK/PFlqrKscz80Qno9zuBEQ6lXJ5HExEiI
fue91M0IHozJERDnVckfVISNzEsbz9GxHwf/zFBWSZTWa9iWkwCg7dfgAASQIv/4X/v/qD////wY
NKeR9nTgANACpAABnwUWHt6cAB0AOIAAOdD1tAAAHneAAHPub3o67szGgKAXuy+33TXxk9gAPXQB
BIvvm4BSgAAAeD4APtlhAUwCotmAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC19ANUHBAxU2pUrsO
AdKMhgWwAAAAAAAAyAAAAAAAAAg0FGsmgHQMgPrqgGgVyB0UAoCoJtivSnHXrvCemVa0aHryJ5vQ
cEAihAN985T0Pr6yHtug7mA1PpQPnvB3bpIvrAdPAfTQF0D6AA+pBp573LmUOhiOg6cnTFnYaB23
osrB6DzGNsegPT166AUAe8c94BXAuaGBQAp2zZjPWL74+vKA9HLNiuK2D6oPQbsDWR3GrgOYHSgN
KoeBp7i1j0GgAoaNw6w4V5CgdAe9jfeiu7j30ALwAOtAB1IDgADMAve4A++wC+MAPr6cF63sBux6
Dr3MDhBxMBYingJoAggImUyaihkeoAABp6g1PIBEKaICGiaNFPUAAAAAEqfkpKBJk0aKfqNNITIA
AAAAAk9VISEJ6RMk9FHpk1NA0AABoABEUUaaTRkaEyNGgEo9T1P0oemo2nqabVP1TagVEkIEABAQ
BCnqKaND0MJAzUgqgKGEVQFDsVUBQ/j+QGH7H2+v6YuJcl592cv6/tO6fv++zf+92Td/P7bPvt+0
1zeqa/xy0+/X9uP+UUP/2dNF/dUTciF7dhwhOBLEGCKgHjV6IDtFhqKAKqrAYLP/73pzEpWRAVUM
J6fLVr/e80LURRFofK127j/kX7/YmRmRkexkhJ0AiE3ix6v3mnDOUgyY5nrOeuOW/tyfHLn19vn4
5cdvB+Ph/97JGSE51A56g7qJsgBwWQ0fp+O3Hju56d2uVOk4GBOF2w9k+v77Jrs6zp4G/h1Q7rfT
nnjZy44XfBBoDsj+nH99mskJu1U/hD9TpydORoAfyb9a+QpifNhWQxeV6Fz2CyfT6bDdfHq4eiPP
HHGgfKbTT++elMdUWEjCQJ1Yu/3/0yFgrkm8BsUPTt5ePV3evu8OExwzzxp+G11/Pn1EI3zzKgXi
aXm3wrnU9zfn+n8muOwteV50GPzKKc1msvoTH1K6J/D44IU5Xjf78Eb/057xWw/uPqpB5D1xn4zk
eN2uR1Y6a9+BN9A/R91ovZW7LYy2TMrRl6nYDkbl0vCfNbPJQEo7rXiWQaIlEHHXN93mehNbENAw
O/zi2qVplk7L8Kt98TDENwNAcgkOie6rMZdTdtTcM18GF0aL2aJxdPh+rYyrzi82GdnMgn6v8Rj+
qU8b7jzLm4a/qX+l8nXjcD8iPWX9rUwZSiYnLjtmPH+xUWR9Vsik3l3PQy+xpvYfDt59yCwXpTB9
dKr3/EZ1XsVrVM+g+LB6QMji3mn16owcdm9lMar/+TVG5oWvXF4JtNg13Ql+h/Hn0tKFuVbW6bv4
kzdg9TxUfnv7iHt8y+UILeN/G6wrdk5fPP1jXFcTn64xzOrzDD+OC3OrPcfMPKVU5n9+c5733ug5
mZc9Bz16m1hkfHt/zl3L+5H4SDPzWh+eIdLeFGKAdDy/EMq96tErALyHsXrz2H4/wb9jsG247Btt
Ofx1ejr4mLygPmw1rTEeivSB9v3NfWJ/Dc9HwuVo/Yig4gAA1cYSm1B2DbZD291EGFRix4OJbMIA
Grz/IfZ+ubtg8bl5FqZgwi6S5WPu7++iCnWsUuHW6bxzR1nxbSqZHu/zLHOZBIM3KwZA7X1Qvfq3
0FJW+RlTHDTYEqAuYQPg7+eOja063gak63F1tA2EpNxZfNuh+xpOh/uc7Ez9W7p2wWSvOSyVHiEf
3RIluLVk5G3WuVeo3s35S2CpDGZ+sVYio0FU6QJY3lXpeklw15uH4xP3jmgX08Ni8JJguLgln0mv
AwbHEblIU5ovY5t3ECYBpHx2q1HmcRzMaG6ORDOHGqE4Es4MEVAPinD0UJPFhETAURFAwWe+8/cS
lVEBVQwnw+GrX4vOanic1RaHyqaglkRdiQW3UygDVcbAeMGANItzLb55INmzoUy0toepQ9iIPgz+
SlN8PJzr2yIH0vPunI9Eg+v4/DIIfQv9K0leUjBAhXRB8jua6FNjqZG/gUPUNBfi6f+hkuZYw7jO
0x96VA4Yf9GYteUX/sZDp4RaTADj6IkIQcZ2p/QACI033Pdd2PtuW/YgjuBCIehbvP5NWklyCSsB
Z6O9jRl/GPPx9EqlgPmwcFJcSDuxu30H0dwkY0PXmsmoPbGOLbj3uEtTlgyelEdOEH6ljhqdlyaT
oAlYTAvBBjht5LMk7JNSYfVH6fG8CfKXN/DOua6iEbjiVAvE0vNu6udT7G/355Nceha8rzoMfUop
zWay+xMfxK6J8vjghTleN/Xgjf657xWw/EfNSDyHrjPxnI8btcjqx0178Cb6B+j7rReyt2WxlsmZ
WjL1MLHI3LpeE+a2eSgJR3WvEsg0RKIOOub7vM9Ca2IaBgd/nFtUrTLJ2X4Vb74mGIbgaA5BIdE9
1WYy6m7am4Zr4MLozRezpOLp8P1bGVecXmwzs5kE/V/iMfSU8b7jzLm4a+i/b5OvG4H5Eesv7Wpg
ylExOXHbMeP4VFkfVbIpN5dz0Mvsab2Hw7efcgsF6UwfXSq9/xGdV7Fa1TPoPiwekDI4t5p9eqMH
HZvZTGq/tNUbmha9cXgm02DXdCX6H8efS0oW5Vtbpu/iTN2D1PFR+e/uIe3zL5Qgt438brCt2Tl8
8/WNcVxOfrjHM6vMMP44Lc6s9x8w8pVTmf35znvfe6DmZlz0HPXqbWGR8e3/OXcv0R+Egz81ofni
HS3hRigHQ8vxDKvevDtf18fnn6Pn9cvj0X++Y+xxJUAQeaT+Cd3OhD9pgaLcbDLsh/VoHFu+uNFx
7+/Z68Gk8brj4YPHoDyiPTBkJCSRQkZMywkDfufxh2xsWR+G6iYgpIqSAfDFKulr7e3NulbG2LYr
xXFqNtFrjXGo2/m2uLUavla4tRtRqDGoNfxW4tG3/lW4rfr+HNt0tdNca+7a4tRbG2LRV8NrjVFX
8+ubdK0VY20bYt563u/usv32cuW/tm/f0ee3eCe2KPD/eqJYCEihIFijaNSbY0a2jVjGo2Mba36K
isRFqMaLQaNb+CrFbf1KsatG2qNqNUgsgoHoil58fT9vRt8+uaa5QefDSy+vyxtJ658v5RHmbdvv
8uG+JBAxUZh58kYe9H/T896Io7y45JQvu8BVd96sglMz0NBcqGYF+kktmQUY1wrDThwkMpltOSTD
jhTD+q7FnBnzne+n/rxIxjElNQyAz2Dz/H4/oZmZmZmZmZmfbYK5qGs96sB2EeccJndtmLcpcwQy
WfJb+HXf/fc9kT8pElQ14knKG58N/7+f+PDaR3HTv3qdCcsfT85jPLT1z3deefT2Qkunj1btOOgi
9ALx/s1Ekkyv0j+9a/ljtqRrQBDfjw6z2/avk1i6m1q67Fdxr8/w14fLHq8M5vXPz5bg6YUOgdUO
uMhCEab/z8zORAjoCnL1cc9emdnq4dvt4w7sfLJ4SfHeaerYP8nb99vXH9Pi/3oLCO9CP9Eg9P19
efuZ95b77777y67ZnXjjo87Jb+yBvKXVD/r3m/ru8JjxWvj+VmY/jAUEHEB34JSzIZUyBYmQpAT6
LUIwFNWOby+SkAv/Xwb8bvWTVwn+hvF079T8eta8/2n1zrFK+8imR6IuLcuE0tUh8+e8mZK4q1Ph
n+B97hdQn8C2qaNiwsh4N5VrwHxIIgX6lMLBxM68jw3IY4NoDe3GHJDAP9Vz555rocBgubIAVL1K
kxpQZcSfNBeLs6Na1RzXCF905HNEWw551l2UqXYS2kmpb/e9cvSZVKMfm3Cf4DEKtek2WbKIgPCo
e7VZeeu/vVI7WQQ73CBC5wtj4nz7oMJQ3YvXn5l+u3lel43729KfjR+gktfKN38GvfZN7+fEynF8
pc868PKcRugjeWktPudXCZ7/xBH7qe6HF76KDXLd4hfcviEXPPgrCF4Cki5JROB2Hg6cEWtbo8iO
xXK/ZFFXW9PxUseTi4eOMb6D9yUKS3Dx49vL/DABtsE8V4tgOmTE77BPbbbbuZIRB9a83H2/Hnzz
x5+HfauXH1ruI8PHnem3cCnyZ2zGEsF1lLbYLhe+vfu91rzvoQOJybxU1MKCpSYzQkEGwQzDia1H
8HxEfU/nATns4rvIjZPVG+IpExx+NJYV2L5LqL6Tp0wU2JQbH4duJzpvV724QnVOfRh3yWL5ryIA
vve+I8kdeM3ooW7+CnHTg/YuKSShNHSS4v36zRqm9Q6ts4/vzYZ3wwSpme96dpR1jWn/i8u/U7AD
zmU9wQMN5wkk0DauwQNCqqhESknbM0nrnzL4GTB0d3j6tnUy39n8DeLyHZLCh9hQEGq7h5vjv2ZB
Lgz8DMXKhmBekkp2ZRVjblWGmXCQymW05JMOOlMNLsWcGfnO99PxxLdCnmGNQ0A7ugOCwAyQQIAu
VtoeTJQQApEo1F3Y9u4u/EMu2wWHaggHFYn3+gix9hMew0Glr8Yx/RP+sMGX7MGdmZvwzRTBmlgz
MwZ5YNLMz/zZv7OzW36OHd2awgmxJlgQX9aYNumZ6ZuYzTTBolmpmbGYNFsGm2DVTNDMzD+f21rQ
9if05999d+yk/YimIINR2Az/HwkhCsqeUC0OIHB+3k9ZKKkxDxz1meqWGRRgPdjtB6WPplgY18Gk
5/M7AG+++8S/D/VWHPGglvloGeCSnB6om8FKCc/C9aIUEKW7KoVnz9+1THOOI4EKHwgYEfMwfdR7
Hb4+PXHr8X+dBYR3oR+SQen69+/mZ95b77777y67ZnXjjo87Jb9oG8pdUP57zf13eEx4rXx+FmY/
jAUEHEB34JSzIZUyBYmQpAT6LUIwFNWOby+SkAv9+Dfjd6yauE/hvF079T8eta8/ufXOsUr7yKZH
oi4ty4TS1SHz57yZkrirU+Gf4H3uF1CfwLapo2LCyHg3lWvAfEgiBfqUwttxM68jw3IY4NoDe3GH
JDAP1c+eea6HAYLmyAFS9SpMaUGXEnzQXi7OjWtUc1whfdORzRFsOedZdlKl2EtpJqW/3vXL0mVS
jH5twn6GIVa9Jss2URAeFQ92qy89d/eqR2sgh3uECFzhbHxPn3QYShuxevPzL9dvK9Lxv3t6U/Gj
9BJa+Ubv4Ne+yb38+JlOL5S5514eU4jdBG8tJafc6uEz3/iCP3U90OL30UGuW7xC+5fEIuefBWEL
wFJFySicDsPB04Ita3R5EdiuV+yKKut6fipY8nFw8cUyIfP34/I/PkV+P0I3VFcfwjHtAw9Zf25+
n9DUJSoiI0g+mAus7x11wA05T39iY9M8+N8Zrs58X0xDtkWKO+AWKXVPx6aFiEx6sKGIqSCktEb+
e3AuICyCEgVZFqFqJeeQykuZIZZC9MBYKSIEhOFQsCRJ8KhYLO2oljrtqDjFEtoJYLIgSIyAz40A
sBJx9+ADEBJAGQUkRnjwT2RXXfs49HVu9f5ejv9nBXygAdPGgCGoyMkFVkkTSSVbfpm1FMmFtfxm
1q+uIoRgIyAKdkU6O7q+n59HsPLtPD/UDPrkkl/KbOHwkH8kJ+qJw6P4UiT93r+lttoBCABCAB/g
v2VVvCExXkh4HLuWQTkk8CeCSJIxDqJ3tl/FskRKgEdEgnsPN1EnY72zvV2q0wkjkK/0fdIk/0jy
kJzdXg2cns6JiR9UQmHJ6sT/s3Y4V/zkkgkP9PR2Ohh5n6ny6or1AI3HsacESYVoVCK0rcaKx8nR
JJJEn1Pk4N3w3Mcym4JJwfyf4P4+y/c5G5hEbEnNsfY4NNPEY9H13XDeTxMYm6q+z6Obwq21byO4
SFHsdH+wk2I903dXZPgp4mH+z8tm71e54O+r2fpBOp4p3onyf2RNu565jMzLly/ydXVwHN1RI8CP
7CTjn9MubPwSRE6Nz2fKRE+DkaKjdzOPsvcbsdDD/YSK0+QSsVzSfBpo7xPg6JsTwK7PYyEJBODY
3H7OfOW7HDg4M3W22uhh0ck+Th2MNNz7oFdFOFdTqcGwbK7PR1O8fA6pJHJOifUnUhOSoabJ7eVt
tv8OaIkjkO/3tW3xfq6Ormf8BzeJ6m7g/4gT90nT8We7861a1rH1zH8fm4ccN9Gs1rLxdt3G78Nm
b75mcmIklOSQmGhOUAGn0Jjn9D9ySPR8/p9fq62NYdkDxPuSdb2hva5W9DObmzrdb2t1Ot4dDZ0D
yI4dcznFyp15of4T09NWTEMYAeJBOQQ4e3XhfC+0mXj6PHN3bPVnlI/Tn90r+Jt9ff4uoTCV7pMF
/T0cjEzIzLE1PA768W4r6d9noFu7QPxZQxTiNNkr0Qh4OQkfBSdvCvkqnvcnkTbs/8dXiUikmDxa
oSEKlwgKdjHvXsYIyQ8qUdmROUppSHvPo5cRFksINshWGwoRDp6DK/d15kbTTti0pJ4SEaiA4TY5
wyXoicUoMDQrFigId/JcrzgrLHe60Mzwl+FMJM80805dalLx+eTnzYFoHZh4KoiO4kKWWU11pM3m
7iMElF7NwI72lYEraGW7hDjvcbVj76N6rd5WAdbwCBLweL53quvNN9XF71EZVybBoqmbZXymt1Z4
GXHBGHBdZkeWxkjq4GScFITMjGyUVFHqti9Z5w9mCwSp4eXkYjD2yYHI6cyyJhY7eqzadh2aG45E
qXB7kwUGyyM1EkEJOVAzOjWHB6nHNN5hGzCnZyNFVadok9IAxyUg64IFLgS48zMZAIkPV8QpStZF
CvheOJzhY4MkROdztmkccUasqS3m+Z8suy7leJJAkJNbJy7X98QtMPUM2AHHtUYtdQnjji+7pfOb
+tWOnA7ATi+QgNxNenyDZeghAzLDM2zTQ3R77r2HILo6N7pa8AXHcw9rzZKjk0QhQacb+AD6ChSF
SKpUQpIj8vClqqv3wzMY2Yfj8sKykSYftS0xStgQOQDzgcTvniSvHHps8e0nS7jmDJZiWWUIAgzM
mAYMBVgqwFW+ckNgAOM43YxuaFthbnNNgHvDYYOFtsIcOj5+nj31+KZ9fLrvvwt1cW2/py++ttiQ
dfaHDD6Ojbj8vzP07C4yAcwLIJOiPsgulRgZioVooLUyGbLNQ9JJFC9kx8OBw4MxnpNVoodV1XqL
Pc+vIZdeBqg+EbID7XswK64C2PGSzvrXow6IghGz62S7evNE6CaVxgV1gLdPHJZ31row6IghE872
/bkw3feidDnjeh694u/D2RwunWAg8xgqKnXp5bTnvzMcdu24yTbtL3+nxnRw/n95B/L+LSqLhrFX
ExNWC9agaAsAgDTwSVFKkUUkqQVSkKiRTYA2NVczM/cJJiYmNWNWXYgYAYAMA1zrbtxt8e1H3J/F
yWswoi/1FNkvVnJllEELPyUPi8O4toL65GmG+cu4TGbdktvwok8q7Lk3N73xrlDjlyzVu/genhe/
WWXWqzF0onoiRPZpN26ioVVRDRCaelWlJInf3eOfYkJGgbAAAAbB05QMB4NFVUIiXzPwVZ9v43k/
fuXL36Rwn29uNGb2K0IJGPk2iCdruK/EUaViVre4tyL/wJeSlu0rvfJB2AhEQEudcAZhwiAiAiIY
pqEVRE9bEHX0hA7XmDfrPpuh9YC9q+E1tHDyGpuBwaoR0UaRZGdwrKfP533auJLAaXN52JJdFLvz
ju4e9cRxbAWHaIIbZOkdL1pGSkd0nfpsLKvQzU6yrwJT/LJNhlKOSqil3HEAyyqTMZmjdkvJj+2u
mV5pz3hpvYXaCE+d2OiFqXamKJSZmHkJQtnacOO3KgkVSFmAiNe9fVNlh5jwnihJyB4I4Tp+Dsr1
xmOAxuePEFLOb7jRr7Gt05A2gkVkfhcmmYqNoDrvMx8XDfnz1RwTBEVJsng+1u3Zo2CDnyZcTKxU
h06Jgtpa2JQbkCQSvPqiu+0zlO6aupZ5lM6fzoD6MpOH2d7ceekvO5OCDPJUgFN1dmBXHtEqUu1B
CLVr2XsN6QJxc7QQLZ8LaeZKAqTGZdPacKRETWCRdTCEYHlhdR3bSj0Z7GXELiH5ve454ZF6795T
Zy3yg+fAb7oAd2l4nTkXgpDm24T4I/VHmA2uIElkREt2PkZb71RV3l0NbE52B+8nP0PGZW8axyUM
ddQl74oJCoEhA0EqJjtv44e0gxrqoGzc5knpOk4HaXPMlfyUpEPlktr5Adg2DbYPoID/EAC4CGwC
FN3dEqc/dvf5brXn5ue9cWBLgyKGKK70IKWaTzpiYVtjDB9gwBtcA58e0QCI3cX+gP66k6Pv+F+f
x7bEzMzMSDEgggkkkkghVfof0D89gtsPmqqW/AITnOc4QnIkfCpg93/s/Q1t9fp127/Ts033235c
vDlaq20ggggggvSiEfuhlp89xGH29O7VcPv1sVUfvE7ECj1wd9x3zLc9HucqDwxdjp+9tc/z/roa
/gjT8RD+qNiZdQTVH0zKtbVltZVvJRk3XP16tdu5eG2ry3bYorduQXGgCAz6OgSXc/uRKQ/i5t9E
gG6tk4FjcVsuPZi5pN2vvy6hqJIGiljFlAaAtiJHSQMsTR1sSZk22SAZki2Gc0UwKmEcmEF2ZKQc
UqWtW1oa5uIthm12AJjKyLIrnMmTQCQDgPrTANC0kglFzkgTlVVVmb3vMx9DnNtzg1TRXYrVqDRR
QygJgQCQAm22wAAAhgQAHnF9D1zyG49Y8/ufpW/Pi4Lqd0T4qqX+6m0fdM2vJYx+M+Gf75gpC+Ok
Nw1LmfUAyCms80365S/W9G56CsmlHO+bHkR0A8dZ3XguLt+86wRoaIG7+O/i6kNEzESwTmYiZiGl
5iWd2TMyTBJIkknWpiPjucdmyhbKPrA/eBT36dt111c86L9XNHIQm9CpNSNkoiuMoqtFYKnM6VY7
Y45tdhELYE+Zr0WhOV54xi1ZI8G18TpDCIRbAVoLWF6zs4Ux9/a8ir8PQSAEh9bW+bW35W0P4Gvg
aAEDWgHv29OC6iHj3uaIml/bq7i+bbrg2Bwjlb5nW+GcWbBHRDuub5PXU1zm2XBGuyOuo6766rfR
6sp+gR2Q79cyZnq9vrfMZijXEnfM3NYkdg6xlysuL3bYM1DzVTIit3NvNb42QnL73G973ZOuyN9T
vvrK5w92U/QI7Id63cURM9TOXF2EadC3a7t+tqwLSy4l7vLW1AG0tndPd1vL00rN85zquuttvgI6
Id+m3D3e25sWMO1DTakrpafio0dZVsMia5U5KtWxSve93ut822+AgIHtLrqud991fXVln6BHZfqH
qLpao1yunzDvaWxAG33utvlVYQT3d295TXgIRSbMjLVGqiZuJpLVJVWMHtVZQuFh5m9zveNewdMy
3mXdVVpa7Szre+c3w5nEgOJcM7776iucss/AeiOnXRrrnLrnKLXwHTNvd3eZWNsibIk3SHcnCDiI
c7y466a1tprW/TjnVAcuxd3xqxd9cjQ217FRt9u+1u+uSB10o30IqdTapVlRQCg0FIoEktVaqtSr
FrNtWK0Ki0pSEHEgktDZa9itsoxZjgd7rBS4sOc3sZmXMRF8rbTd4wHDvYre9tO97YDZ2XvYt++R
yI4us77nXXVbyZ1MzO1WVUzNxqG5Ke1zLgCy25zNtO1u9wB3zOXxucfe9gbO72K222na5zrqdddd
C+uumrpcZyLunmKkobIY6GzczL6mI3mNNq2Aw5WCcbGnF1xQeSBw8M5wV30+3rpdZ3A5yd73vfea
w82Ntve3fa3e41u9ittvb3ermxFtbTaxqbGGPdzF0hVRReVdOBRahGWou0B2cmxVttpxb24GVkq1
Fq7fQurnvb7etrrnIAqNRSKhKtUqj1KVqqAVGqxUJVqlUlUpUTac1iIhI1/M5254bvbtSQ5YJj4n
y0cGETalCrD4rKKdQVq4O8sPWZWCGrd2JCdBnAvgUmV5Zh5NmRcUF837V7tgcwmSBO0eUoPbVppA
Xpc4RTospJAzvKYsojFUitbps97stRcQEQfctfaSQGERcdkBnd/yHANfgrCzIlFmTHY+SuAnHf2Y
PSEnDd/CzJZh7192l2m/rY3Odw/8Ry/LB6en3IQR86HmRmZbnZ8nKgaCspBZrteiuwgYbAHdkA6d
oF8F3fRBKi0z77qwbiHjvq/GL9Ft75sBhmKmuuB5sVWEbDSKWMNIL4csFeuNcz2xvzHNQDYtTkZZ
Yw1DSkoDJD2NpMzO8lCmopMJq5RTJMzMzUHEEkixQHoB/jj2HHds9TpHTodPzD6Bfmqd6PE/ID69
/KGoUodgG0MB6QcdflMflmZxk+Z8w6Mfl578y5zg8T1BxEwCiwGIoC+MnI8fn5/L3fPTZnbxxun9
yg6yczIecazh1NAkYGCD0SwGx/X9d9l/v8BwpfH4di/Xwyj+mDxN/0kfoTp/j/jrV8jqmQupTq7F
fTKOmDU3ykaE6a1VLliKAmqzoEz1rVZoc9V2PT3nhWtoUxrUXpcTnhK2nWTkmWW0USeZgeWnJaZE
7Z1fDPOo0uE6TrWLHkKlcSKJ0wqggu9kkzKxyxhpTkFKSio4tfFajitEeGVjpjDWjEBisTccWxit
RxWiPDKx0xhpYkGKSjA4tjFajiZtKeMLcFsNpWq41qavWtVqC1Gsq0/WrzFJ3SsUdivdllM41AHp
owtMids6zfGBOdUvFHYrZZZTOMwB5aNZauhO+tYDWNTftMcHJ3AyXvMmMGVjznkbeLFt1OTkDIxo
wIho3nvWBOKpTM7SeRrd2gt5AW6PhYyJ1zr73zvncTrdM4reTyNd3aKnvAFustLPcTtvvbFQpKlK
nOUrFxd21+szBk5mNnN73sbre9tve97rHr1yBHPJvWs61nNJVqoLWrVrVuJStUbMfCxSnF5yRabJ
mtaQ+Jb230+aZvkTndHvS8nRTd7MC4V9aaehOudazrWhOl0zilpOim76YF0r6y09Cdda1nWtCdLp
nFLSdFN30wLpX1lp6E661dXnUd8RFL5pSmDlBCLUNHpV4CcpvSKyoNZGr1q9QrKr1isqDWRq9avU
Kyq9YrJmaUJNaBFtUra+L3DAfJ2Otm3bV3YaaOc5NMk1NXo9RW9ISeBxbOtYwOqnWU2qSawr6fQr
qkJPQ6trWsYHVTrKbVJNYV9PoV1SEnodW1qPy19CJIZoiIhmRTiIVVVV31Aye95TAt8y3kB3h5ax
TGs2yOb1rFQLOJZkB5h5ZzTOedX0OsWTF6Xk5JpllqcgXSyys9Cdda1rGhxSyYvS0nka6do1IE0j
5WNCddargcQc3hFTF5UtxmAbKw+albObZHNjm8IqZvKlsSyLZWHzUrZzbI5mc3iwnaT4bA4e5xgT
pilhvY5tKYneT3a43exxcTpelHBqnFogYnRrzpUqqc1uyVGS2lJwKHUocJtY5VE52ozsVKCGVvOe
dVtd6Zi98AJLZLSbL9Xdho+kpSk5OSaZZUisA12i60wJ2zrWLjqdUvadZOSaZZajUA2mjK00J21r
WLjqdUvadZOSaZZajUA2mjK00J21q9hzFEhBpm8sQGJv0mZ5znNcjmKpCDXOZZgMzfKZnnOc1yOY
qkBXAKF6w4wsJARCgMRCiqxlYtV7XrZKFEoWy2BBsUpSaQnZZKE1Kj0itoqNirR4oJ2WShZSs9ot
aKjYq0eKCdlkoWUrPaLWs9lrI1I1VVVVVVVVXleLyE2ykrxOTkmWW8USe8wPTTktNCdta1rGcidL
Ji9LSck0y3iiT1MD005LTQnbWvkLBr4EdtiANtg27AH+hja2xDXsttuxskww2E+ymrbbb+iKRwU0
bkqmB5tG5VKU/II2Oam6iTf9tszNmnDRG+qt5OzZ9H3y2uRyVfpb1TD6nCEkkN3Z/5ohucCSR4Mb
urm5pDhTa2+NtYbbckG0GSv5DgAA238hugGuhtBrBsGYbYNrdjkoN2PYa4N0AYBtcHAHyADgwBtg
0wAAHXDg1+QAAAMAMA4ADBg26w4ASDl5w2robag1sAYMGugHQ10A9hrkpS29hrV/MdS1gDBrew4O
DbgANQaaAbBuAABgAAGt7Db9lfFy/JXB9Poqr+YU9pawY/EOn0N4qr4HBG7xYbNmzQaTJA8LYiqq
qSSSSSSSSSSSSSSSVr78gdV8ySUl5xHtdNFbsY2PNskTbotbm40xTojUe6Lwx0g8yqvgbhIvQQ9T
GETyVV8D4PQOY8BOhgwhvFVeh071FhkXAhhDdFMBCYOERAHseoh0Oh0Pc3oqr0KVVg6Gyq3RmW22
4eLh3NNjgcNMMISSFNFJudWHM6PMiNDk5sJOQGkkabtHPa223sVTgxwwY3RJWmJNRqrdMaRCkY4Y
3bnNsw5b2227nRhh/s3MRpzajKt5tjdip0dzhu2bq004MORSm51OySSVpsqq3O2rVt0YrR1QSUqk
NMXCRfYjHTuRekJ7nsBwxj7HmRdOHe2aVVVXNuYxelttuHBDq7MDdswicGmIShQattttttAAAAAA
AAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAABtg2vylbuvtVyqvV1X6VXJ
yVTk4elt4G7dzbO5huN27Mq3Tfa3X2A8rkvtfW9qvPAPVc4Byvc2Ohs5qqsQmomVbu8WHk252228
jbVW9WlTDba223kXFrDweQR1cHHFttvMxXVjGOjScEkFQ5q3vatf/tttVtXv2B9K5wDlJJBKVVgp
VWD6Bsqrg9D1I9Q9jdu0Rok1523i3d1dyScMUciThzbNGml6W22/qcz/J4OR09rarBhDvZV+F1fa
3VclZ4JcvuAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK6uk8vtX0r2quXLl5LbwSTzcmnPlVvJ
KRyac2zdzQitON6X8QGRYBkWBkWA9C4ZFxyKVTyTmSaVw6qnN1GJu3Y2dHRgGGTgCpQUoqBATbyx
pN2c4zm03EU3VDuSKmKmzojZE4bt1VzyreTThsdxueakdCbOFRTRnVa0aPRuR3uzY5OGZVuKTdId
XZE0N2yE6Zbbb2NMMMbRq223k0SNDRo0eQhpuU2YTc0wqsPEo02dGjk0qSfFtkxmWz4StKruy2at
s622klRGypzeLhXe7ldnbirdNOSSQ0dF3VV4KY6MJnfbbbo1qi9Dhy6qr0KFIKVVg6GBD2UYU5NM
Nb2228GjckmyRJubDuRYIQRDpsi4GRYGRYJoJonNRVNOTBsFOqbqGGiSOTyIcORzcHDwUCZtVu65
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
U+yyVUlLJJLJZJKyVdzBgiqiqVKoqlFSpMp3RxYanmw7tGrqnunQ2eavhXwrc4nNhJh4q8WFKrya
n02c3gw4JVEr3bPZ3RRohStX06NSOrybPNk/DDZ2cEbMvdq5MtT4YV1U9Wzg3btW6ssuDVwErmap
8k8WHy7n04PsV6vRzfpuwQnun/s8yIknMoAVKkiKkpCqgPMeLDdJPhl4NGHNhs2avN8vlXdsat33
V4Ky4Kr3fsRll5sMOrm4NGjkwwquJ5ojwa5t8FfCqeDRXck2cXs1SU/k1dCtzZu0Rh9nqk4OL0PJ
2OD1cXJ5uCndwE82jxV6uRMObc4tEaOD8n6NA+VcB4HAqaqiZIQ0To0cnZufdwIUrdME9E6vF4Mk
5tiMsq4gwQ0aOzdq1d3Y8WpWDV1cEmGry81tt1aPh+H4dHBq6N1TL7BHNzIrdHuVOquT1Zfw6tGj
0ZZeT3ciCOru7uh6OaRP/dJBJJUkkbN2rd5qqq82pOju3bm7myRlq1J+mxu3cHoknmJyZa4WVESy
W2pHiwy1SN26qqmxxZdGho3eDV0TpeN6but43zXV676t5S7/aAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAcupLxu60qpEakJhocWHRVdn8O7VwavB6MODg1eSRGxor7vp5OB+Oa1FT1YB4lcXNhDch
Uk5O7ZSqVUridVVXBhweLRqH6V93q7OLkwiVW6Ti6GXIYYaNZNLbJC22SBbZEJwfh2cW6t3JgRsw
Knd0YcTV3dBydm7KSstk/R4qbE2fl4uDKTJ8nkGXg/lXVMq2dmHkerLUmzDZs93Mj0YYYbsObLLu
w+Fe70dHgr8vy2cRJ4P4aJ+U/TmyJ3aojR+WhI1URs0ZQ4pEPuNBNW5FGh/Liw5pJ5OTyPM+6SSR
5tSez3eSRNhVGyFTB+HBoknBo5vcR4PuqVB4OSDDDgklNGZmVMAeQOgCUEXIFV0IFBWhuDgn2auL
zeTiw7O7DJkwT7HkeauaYeDCclbK+ysE8HJ7uadk81VUifBs+Wrg8DVhKmrVXuqtnU4PBXBxatm6
uIw4tX8ySHwogSPAphUkkhMFfo5iTu/JxcVV1YYYR5ssq6qqq0YZdGHWNFywTspVHcUw7NnBgcGV
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHC4UldtnqWeRV33C+e5NXEpzejcyYJGrNN
Vizc8k8CSScBRdPdQfRYsZrlE1UpJueTe2ITxJ2UPNQk8lIajo2KUUUlKKUUo+zm6Aycm9YkfKeD
2U2Ti8Gj0LPJdZdvHF2cG86n6TxfTRuNHw5t7o4MnN3ZrrMLDioik5s0wsp0R9KaJT5XWUUlKSw7
GCnVdM0833ejQ7HQdSNW9miiilJOqzq3iJGrDushg3N71amojupJopEpKJ8Uxlij5uDgxYsTjFZi
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
2rKEbfWu9zAQ/m5YUxGoB3xR6yqHUx2YMbQVfeH0JG2QSvni/KeQiLIs8MNJT6qonGMgTqBvczoM
tqARRDpfzmzBIR0zHsNAe5Go/F986NgAE8AvEfaD1B+Y7IK9qIRFT7T5KnmPwwlVNnEnMGXiR3wi
u1s2+/29/iIRwt4fCopKPSMSmqGSGg7j9tPhJk9Ffzab+SpivNfLcp5IS1atKqZHR3RYp0pftuOn
t4bSLZbGiYZGCeppjqfM2ocN4b06vYI0i93jxFepkndcpHt4bduZzV+3aVRidFxR/TQlk8pH6+Oy
NnwT4lilSn+0p17Wo0vySF9ywq/cZ6Ml7N1z8+jSP27eZ2uX1P7sY9j4619a0XXL4NLOld/PokjY
junlqt4Z/DXQ+F1K89RZBdJJB926X7teJMCOflrdS0HnOU5pPv2xzFE2SNcyqMlz95vutq6dfDfT
NjnNBmb9FUQYkWzjDNQpd6Q+6QNW9IMK7zxeFpPC/Ud7500UnijlS8IYp8Y+p5/K19c8l2l2wN/s
f9o0luuQnsi76j5ayB2OdCSXXjU/X6ZWkne11Y39xCbKX5KvNy9Q/v5kLjFa5Tv3Zox+J63bwd72
RO4+rj4UaLN/df2+KuOvD/J0Kzf7rur9qnv46xM32+UblTb9i/Hv4atT5O17938+pO/gfFM2L78/
M5xf7l9qYv659ctNn8L2jXb9s76tmlPjrPalooMx66PlLPGC9ziUrL2p+fetecc4UtUQ+3cdu/xR
7lJOvmP5aiD/c09LNE92qnvqcLf0xTqEqmo6m7N5t1D4+P3/cu35/Yi9n4bvIa/0+UOpdU1M+JxO
zV+jaUpIZ0/m6fptq8ULBL52n5eRarvPjvz5+Pv3bvlo43wzlr76OXw7lDrDRQVQDR+Mjlusig7u
T+ktIU/fhiOpBpRoD76wE1Ca/79eGwG6X0g6fP8/rsnnK8JAoAoO6DJEpRoTJMhKQ+8jkCUJStCl
ClIVQUJW+TI9YcgaX9YAyR1ImQnjDknlK5KFIFIFI0JxhckSgP+u2AahGgWgWhCh/b8eD330lf/m
/3+/2fC+nPt89/ME+8o9CUSlQoApQoBpGikIlaShaUoQpRoKCkDMjKzPvVFYRFlGGRZAlA+EflCN
CL9pRaFKRQpQqlGkUPjKZ59vy/b67/Xx8eOuf8Pdtr2/Tfy/Xmcfft7OR8RLjgDg4kX8LP+dMoX/
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
ZJ7Eig2S2K5O4jTT2Zvbpw8mzSqqlc25jHN1Y5A9BK7vc3PB4t3spDkEqiHs8Wnd2cjwbESqmypI
5AlE6KOKtQSbvBgnJps0adWObZVNz57LpzcOzDg5tgMObhct3TyTXg3PVpsxwfDm5cW8My3HVs5O
THwqpXDoqqwkeYm50Vtbejk4abuTjVvw0qY22t5MV5vgI5nj4W8nCscITq8GnVv1t3cyujurGz1b
PR1cnJzSoHkIYomu1vds7O6MY5PlITo5NAR/uAgKh38K7EQZlYRERERMy3GZbjqdnDfe3d0bEc1S
VUKU+jsx0cMRuod1bsRhHgJ0+bbzt4ez2STkxT2V0VU5sV3adHd8mjwVs2d2mNeVvg6vd1cmvO3T
HGazM7NzcG7wY4bHZp4ppipyY51eZyaOe+9rMtzLLv9oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfs7oAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC22226IY5OTVXq7nYKrZUnoknm4eDweXa3olR
1dXDtNrccN3Ds7ERptxb5jMtwZluGZbg4Y6Nst2TFKpz9N8zOTdu6ObSqqqrSsVjGMZbJJLEpbJJ
LZJbJLWzZ0SSfL3TmclcPJTk8hjZWnRUjTsgqEScnfOLy2ba22zDkVRuU8VB3CUmlJycOhG5E5o0
qRIqpCOHCq8XRjk9Td5OOy9nmxHZHDo8mGOFcmOB5K3bu7NYzNNGJzQeAjDm4bITnlvZpsqtNNDd
WplW83w2RGxs2ae5CmnCtmG7TaS29tK5dXvrPKldV55AABkADGBgBdXpWZ51VtlVQlKlESoke6JS
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
X9YOYQlaWgocFxOk6DXS2gWlQbqUMDaedRq+FLWhOqqEaXS+rvvWMbs9wwKS3e85idb1tV8mE2ve
oMMb0mLpKNI0tF0biDfxFr5wwzWN3UcMqVjKIVkuEaVmvip1gqTvFa1jG7iUpVrm411467N+Wu9u
Lx5f5vm1eJCHUk6uqMJomFKeTsmpJBlq0YYaPu22XUklN0RIqoiRWWWxloqqiJGjLQZerQ0bmBBJ
PsME/soZfBzUyJRUpTISEUwVGX6YJkqODqZMuA83U4ODg4Kqq+wRwRyU5CoRrm3BSVUkw1YEQwME
H7GjRCEIQg4htFKMMDClDJqgNlQlKifZUkwoVQwgsI+9tKpIlVCKqFVIYVAyoRkVJBqTUpRUp3YO
TJOvS2poEw2iRBJoHRJGiasFUVSVSKqilUhS9LlivSSSSSSUktrvZeVqy1asE4OLRo4mrLwZIycU
wYE0aGaKEKGBSlGMgKEDCEOhDBmVVowwqqpVZGxAkyyykZcGJwtrgTZswMoyyqqqq6OTLLVqbtGj
I1apgOBswhs2cmZvbuYUqKWMrVUrBXYpuplKpupzZfoFchqSNSuTBoRllyZU5ILZoYiCCGjYKiVK
MpD1KQZpCmGrZRl4ODKNGjVlqOqmEmjRVYGGFVgww2ZbOJhRSigw0aKBCEDkATS22xaEENp2SKmz
Zq7MstUbuDBo0bmFYZclGRo0YMmWWxmONuphHYrkpKvK2k2JQ4ODDKVMsE0d3+ipOqdW7u6GG6Ob
5tBoc3RVKrg0KU1amrVWqeJhlVaJNjLRk6qZaqqsmS5fSSNts4BnYwgbOBjGQDghyURGjAww2YYb
ODgbJNlGycEU3ZNShX/okSA0cWTky7t25qVoywGCsKcFImgkasEwVWrdlk7mB0anBzaNiuLiyGUk
w3tvBkalaOjAjVTZFNXilYm9tblNlrrw7W7ttZXwkkkkkkkkkkkkkkkkkkkkkkrMSSSSSSSSSSSS
SSSyySSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SSSSSSSSSSkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkkkkkkkkkkkkkkkkszKrJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJSSSS
SSSSSSSSSSSSSSSSSSSSSUkkkkkkkkkkuvYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
wHvyEvi5/3Ah8fv69PrJvs/Enf0fxOfbhqSgzT806OqJAIO5/kBOBkEHAr9OOw7i4yPQdx+KvqbX
2nlOhrxsqyYZe09b0M6OZj5jEnY+c635P97V2vh3e5+5+T7Xc7mqjqcm51yeRwbMsk1fNPJ/B57P
iy4uzox+Tj000pW1cXY3pqpk/Gfa1ZKydDZS+thX0732NGY1P0GG4+Kmc3qp4LdP2vucm5zPt4Nm
H7mbhkTk/M9Hdn/7z/E/0JmT2b2/4He61OidziOtvx6ZqfB3P+7z8Nn+B/Jbob3D7/2nPfx1fF3N
50f9/H+lh3Ko2e5/I/k7Hk/c62w7X4LftfY636rW2fDye5/gf6X3v4/P7Xxert9yfT8dXi0fP3u9
vVjGnX6vc2fi5u53O92tHFw4ux0fTP8/XNIclNWfs7WU5PRbJ+vnVVVVMGTZ+5/mdf2qafA8H7lu
p9j+xxe3v6+7zb2EfaybnZaz+8fJ2Osm80dTscvXQvp59X3uaPNqiT4vT+Hh/xdMssssvjwVTsbO
A3qZsn9D8GWqtl/Fsj+TtJufk6PhhWby4Ey9vS/Vm/zP7mri5Dqc+L4vVM2apPJ2NwZ5HTu/n6aG
3Y/e+5ueM8n4v7ngts1zvyebx9HAnZNGnY/r36HWl+GrSSKpMjc2fU+TTjPH3P4Pc+DKfXr2P67t
e/DG75vFIycHYtOz8Pfty3u7zd7Z9H+B+19Gr9OG+QSZPR1OmfoxMPte1z+L6172n+LyduTJ2tHo
/L6Ozk1fM7lU91t7vfM+lZo0drb13TJTxcM36Pc7UzVODU3KSnc82501iXOI72jDqb+E0dzm0MOp
yasNzD6ny5fN9r/Lo2O1Tuf1dz1Tp1HN/H/I/nf+rDF6PNr2K72TDqPRQ7HW6PGcs3iz44b3o82H
0f6jo4RZ9r11zb+vb9+/51G8iH85RIUpEKUWQFLJIUIYsQr3MRgpSlKU8fL7VcHZ3/iul4/d/ixf
crGfvfI+b3dWLKTdZHxVoBfok/VXl9f5/KR/ZP9j/z/Edh+n6FUSZmXYTSqJMzLsJgiCBQhBlEIA
xAoQhBRCnLjlokvhgPf85/Dt+cTQlg3OX8wM8nc62GcDr4KLnE7BEC7mDIiMGBQwaUuU/0xbbfY5
Oc76yc5x+nq31w8r9pmX6/WBZU4A21JArKEnT6524qb+skqCzM4UPn6f6Wed1XGYO7KM/bnxHOfH
vJsmJzZWonZl1I2iZ8zUn7MhyCM2HBMYQB8T2Q3deDEyiThBDcczGXmMEGK4l6m802V5SriTMOUZ
fsGpDwal38eXqQ9yh+pnxaEYoFEmgql2LZG0SuSqGs+xY8dXLbTjfxTBYwpdmF9Ip85SQbLt8qqV
q5LfrmAyM6FYLgMPehIQObVllvIABCNL7HqFojpse3MxLXRCIpeyeCl1h7I0ZrkxFng9opi6K9q4
7enk2Y8D1sNzi2IjpBCbyPKXEEKia7Ui+xdMY3tsXS4jqccIcKUWC7qXmON305tlFnQEdlNQnUxj
eG0Wma81mx96P5PxtEk4W6Q6vg2a6lJX77xoLymt5v6NBKpzSHv25o2O5PvG86FLzGVOKzaPuSF7
Ruq+sMbmS8Nvt36mkPPHSVbF6S9amOw7759M5LfZ9zSr0prx1JIaEOSdGo3Nn82shuXMbSzCqCyR
SB8m3X1raEWBHLo1d45D5SjKSS5cX2hNNEjWMqDBbeuLapWmXrzb0Zr7YmMSfuVBAxEtHC7NMo8p
wfqcBmvVBdXvle0FnK6+kOVsZaE5Xm8p2ghife/pLHladdti4jxca8n/QhlK77BOxFyzDw1UD2OU
ySO/PMuvwZWinKtlY39oQTRR9yptYusH9vERYXpTCcuTNC/tLOq8ztaqJyHpYd1GSxbtTz3o8b83
+DmVW/lXVH8UPXfe8jfp+EbZTbyXt27tSh7HW1uT+nWL38x3nipevTxKULesfVTFuu3XZpM/mvEM
8eca3ric+++OJ1hMYh13PZKvhcu0oRjVeJ+/bOel9rqWZofHIccu832KKb+IfHMIH+o06rJE7Von
beUFt1YpUCUTMN5PZuld+/y+XHv55NvCvc/3Jl4IoKYIPksvQ7QglDgfu3coUhcrFPmqebzK/v+T
0ej4PocXqezfPx7vb319gyz2LCIMyjC6tRXXPlXpZrMM93XbLhZkZmRV7uNquFl3+G5nCswzMLMK
6K1ZRmZCMWMWFsnZZGKhbDuVGKhbIVlBhlBl8azVkZnzKzVZ6ve3MzhZcMtZeVmWrKLMMzCyKuzM
tQWjsziTNItEtki2SWpseGoeKoFskFshbbLUi1CPB0fEdzPe4e7YjdsMC1vVAlvt+0tKHK4OHxJw
cKfRz37dePuUff1T8a/j/YQS6CZWWmUEugmVlplBLoJlZaZQS6CZWVhAxxsNbjri73fiJ2wh9PmZ
nEb/B0AKiHa3S/YsvACuqARETid2IiIiIi1Sj3/TDbehbzDnO+e/nyPq9/m/T1KfrKtHDKcVQn4m
p16hy8LHbwd+JFGsTWU2D7flZB9TOPOET787X1D7947Kc8yejDQLaCiAaQKKkDA7TrVzUNsgJSOe
GZhdexmfW4fWh0dbIHry89vnErJzJC5lQqRP2khfea+GQIfogRURE90RoIER6BEtl3my823fft+T
be19Wzd23tGN7lr3Rj8vVC5Kq0qu7VYlQrwqyqraqFelCxShZlVdVVB9/RznDBF448dNdObHDmZz
IKXX1K6ODN7eqzIXnbwoxKBBJJ6QjCsWJjeZcufTae9LFE5YG1ktJNNLy9pFLXqizn7TsBttttKP
mHSryzvoR2y+RTwa03TVF2lhJTOKdX8oGSkKW5s0uPfwq34vvrchRN1GCLtMQ2YuaW9PTvv39r+u
hYi2oadjUuUOXjx6zTpHbbbbbaPLnmdd9+SZctvwUbRjyonr0nDv0hJcda16+zTQvbAoQgQLbc2P
MSjTIPEzJZCfI9SV4ObPScI+pxBQ9+qQ32hWL64X4P63Xpyn17612/CfLjWKV8ZJclyM97cQE1tU
y7dukXvWuKvp6Ph6F42F2E/Qn6ppHnholukI1ruPSIlIocozFnbzSvBbv4GN0fIbW3xA1QD8d044
4rosDB8WUCp940mVKFHeMM0KErvgr7WqWa4U/enBZorWLPGswex0u8jdFdR299q5hSZ1OWPjbdfk
UpM1eSuab2IgW7Kmz6vbjl08apLnZSHS4kQukmsm8+PFCktEg8+/b1j8ufZuTb7dLd2TrpO4i1ey
v6dUbo5dr9usznK+VumddYRnKWykV46W0+iVgJpt8JGniqbKkr30ckbL+kpN4j6SVs8dTsQvIUif
BsSSJxbpTcz1rZYRNLHc781Ymg16e1Tx2SVx13p6+/X4l69ib0+RFZlaBeyvR0ilCkfw38w7FOol
JDVTfEeXg+M+ktuzv9fjWK4V8OV+defKelQ7KqSpE3ULomsfXxsxYXXw5kM2SLUi4wiY+3sykzSS
1C0VZFqFqJd2IYpLjEhiyF+HarVmRlRO/crVGT3blasx6NxGLN+zEJnOEYxgjFSWwWxLSXz4DFIv
c9vIZpFolqRbEvCRPDLEhZRJbIJ7TndDaz2crwP3c/Vu9L0d/y3m87j9nThp5ee3rlm27cNvl8Pl
8vn9Pq9vPfOf18cIJPGSQP7JXWWT7keOZLu/O1m22j+J5cQmFindYiD8xXhsR+TsdY2DR8zLmaOl
3B1vkYauC6VXnVbm48aKzm6o9aefbVZ+tevf0ZbdOF+cfzne/zv08WR/LjXVj0P5Pi1fqs9Ho7X8
+DvaOHY8qdx/G3vIeHvH0shg8jsf06MsJPlOvqt0cv5rfJuPU/A4nNs7XR5vN9jT8m9szeMn8n/s
dbretnB2aOrIqj7LfXvez62j/haKfjvaNncb3TDRlpj8z4nV43wP5n8DBW/kd1zFV3GHKzp6/Fq2
Pn+R0NzCpve4/T5j+npKw8x75iT+he+qNhwHnfgfHPtIO81czVB7zvvL5FeJt7Pqxiz864zjFmFZ
VUqqKrRX83YuHScDsQ+0qTs8toKIEgfUvtLutl89V812vivbd/rnHjxUkCieLiRHFAejJzSE0ebV
yB6x96eLzvS7rmZ3udo5W+cq8ltYTiFeluf2u5qbOLozbOTi4J1ZP729Jkb3as3qbP9SNmGCleMi
AjvfsX976fm/EfuZn7NUgero6lHWfe6I70hPe82ybl/4/35O18HRxlpVKZJQlNyluDiMM+aJJIfi
ovRk0yebRk727N0RJM3+Nz+KuTcdH12+LN/gSd2TT2Tt6/F5JNDvTCzyU+KA2Ov5LZb3bVVuOiA8
Z9ZIYHxdvc8uivqW9XOj6jqebwluph+5h69HRo9nUubnBxcGTVx6pMuLS7uv+B8uje/yIR8TqQfU
HLTd33V+59DmURP856IDk2O1vNy1PLrt4NXh9+7zVvarcntgwUpxbknOdrNmzcU2Rs7kjufM4m5H
mYLc3c3mHX1okkkHLr7D6mnwcj4Othk63e82rxjgyNJ4VVU8Vu1lwT4NzW6rC2Gh8HycmBzd2rZ7
bnconwbMMPJ3Pk/f6saO9oNm1UeZhhmqnFSO479X3NDocU2cFQ3qqlVVVkzN/jVdi2EBqN/mrl3P
o0b25s4PNkzf6875f5m/Pw6pzw4KYkUpHT+Oa3/C3uji+p8Mt93eyuVVd1TFThWKgdKYWUq216jX
NZISYasbKkkGF77udN7fuUbbMt1RJzq8XdM+y39akEm3GnH3vtfk+3JPnfAQ4tCWs1Zx8w8ENZOW
1OTeJyyxm+hh/SpjLS7vZalIlNi0Kn3s4CYPfYSMXfUC2FsIa2FqqtoECS4q42d1XDxK6b7OM5Zc
MnPdVNazzuZUusqZYI3KGynrPKfj6eHpz9/fjabTbTPbbbZy5OFqpSuqVUnNAXjK13aWvJh06lqX
c7aVkXU66WzUpZVRGjBiGCZVVEMKhQwdBtrTaqqbr0btWo0k46UnM6vWzNhHhFUZsALMySTmSBNC
oKipJlS7iJnKJEa77a2hXH4fy6D49xpNRGgqkMkQg94oaIcLGiVIgcFdtvOvDKOOGQhwiGxmIGxC
AJEdGKL82c3mLEhqCoS3/DBeBBDMuYNvtwZMM7ZaamVWWdUZEQwYQhRDWaIGkgRAanRTVVMKzrB2
Rs7A2Ghr5CCSdKSQW0HCiB7FT74oGKpEmQSHmqetdlZazMo2S0hKU0aRDJISitc9MY792M8s8s8Z
7JhBmw0aMHp1+XZjF4/sbjekDlu5IW4S3HjeJV4pmxhWS2ayjLIQTIaSSCFGgA09nS6LBZQKK8iz
u7IiP415A87526lv10r4QH3x+H4vs9bvr9ItIezZvOxrHP3JLl8M+8R524lxfIsTpSMraSksNy0r
1pL0Wd+T8NGvIpslY13I5/e9ZvKMZcHVWPoWJB7Rqb3oiK/mt4vT4PuuW4px0k+c9GYtCvu9IXbJ
518N+Ntw82y36/SNrFVO8k6tw18WTTBEVeheJuWL5FuvWZrwEuaSXlDdNmhW+ZbjGyY6yOOc32Kj
7uRrrwEeYivVGiQtLOuzaKtJEksJaRhrQu1p5iwJjeiH0hacmMzN9hE+kxJXiEcNqXJ+mLoiOQ95
NiUOd73LO71bn26Rm+B7ZUu3UbbKB0fHrOnBQkcSzbYT3NO9ITBWuQNbKqrbmnBR22q9nvgstk5F
WxyR4j0jBO5b5jfrfHByeldSW98UIyYGph8jZVxz267wtEY1yqEe/jMV7ryXcnR44i0OxxiZdnrb
wB5C8fjVmzpzL7S6MypNOJkwtzY/kO8PO+H8f7hAiMh9gG4l00ScYX48vj+s/07e/1eU8V72C3dn
KvOrK+pit3xhWuZi1855j6wHucwmo+oD5RIvISBFhAUU+QAHh7t+C3jji8dVWf730O3r7/e7dbsf
JXk0kCSSS91nw+Pjt8vt7ccc89Onq+xdnusynC49Um5PuzMmG78enxk5WfH8vPW4Eh267V2RMay6
vHvxeVytt30ymabIgbqqpLrhc3pDLGJYDaDKmtDTiAFdNIiBEaouAIuZmZ3e8y7vJJlld3lhhNJE
Ctyx8Hv16/P5/T5Y8azx5+fp9N6/Cfqj9X9PGcRaWPh683w+PKRxJAicUfTZuSh+opxiQ1N+dsY5
bpsRcAuXLPDcj3voW4EHrTNNqoz3sz0Co9m5515vHPN3a21bFUADMvjeepxXj53E+Dida4qsOI1t
Jn1sqBVkcXsaPWKtApzq1mtAWWnPI9mrATsScqt0O5JjXTG+LVMYwkw+2BGxPmUJ0rAWxiDgdQCC
SCDQ12AE98c7YFk9HZ/KYkiJT7t1T154vNjANkbnN39mbMWl4COEMybzcc5E73ipsPrsjnH51zk5
w8oo3AR0Qzc3cRHKxtZu1UoZ2iM13kTaIcB1apubp6ylsXp2iZiA85UU0Tm1t0YtmPmZlE66IzkZ
1y53s9UUbgI6IZpynkiI5EXT1QQyyCmWqpuYlAUiXTw1VdJiOBiJhyWqpy60sJeb3vk85i5sEcIZ
uLjtVYu8FCziOsUkFOJptpJk6uaUW8TuYuEpKUolZmVk5vFzYICA9InOTvrrqa5yircBHRbjtL1K
akzueNdnMRMDgY2ZONczQQI1VVNVytWCEKIt290kmZeIp4lE1KJM2oakmigp0s7vMjMtawHSqmXd
VMzSJrpEvmZvebN3tEA2ibMZ11x53uirbB4Rxk4Z5vdTvcla2DpVzKqrubXsagAUzRihVZQqzcTM
gbqhVVtZtO+bfQxawS+NjNiZXe4A5xHzgvi8WOJytuBs7LXsU3fH478Tl9dRrl82m33vdsNogRE0
MK1gnFR7S7YDrJsSm0s3vMF3dQ7vW5xYqrUDZzBOZixmYoGHC1YKbrb7d9py+uo1zk5cRqIiMSbm
YiKfTruEak3dOBRXIu8WMTKxwOt3utrvbZmAYcrBOLixib3zka5zgrnOLPE2rEVUtDzBQYQp0MNR
ENqHfLtYpKUCzc2ItbWLTm0c7gDZ2YvYnrjY08Tl9ON7jMzM6vVneDFzMZsTKx9ZWCcXMaq1UUHp
aWKS1lbUW1VD1KCZeS0JUsBJWQ90j1SAdG4oTS4sWmYwFzcJSPSVTaFTUdY2NOJze3A4eFr4K5xu
NPErrjgcPHvgrnG41cSttrMe7u2s9Dsj4D6h7+++xx6ctzC55c14LW/OayGadM5fmcaItSoxFe63
tfKuhnL+73PyfHlYKAYVmbcdX34MiMrgKA8kFui88wgsIK9INDuOo62hjrfoFpz667xZ45kOtN+2
Nr8zd33sEMbzrJ8oISLqaDClCMDodK2xvN2+t5b72BEAQIV3rqJHpnL9XzECzcZVzjiVkoijMuMx
3Znew0g03tx2FbuV7NbyrGKypktkZMnadC+2qpsccWtxsLPPI+fzikYzyk6n20zny+P3u2ju/Ies
iJESIkRIiREiJESIkVxEiJESIkRIiREiJESIjFxWLisXFcPwHfdfe/SedxJP431vtNqtEgcSUgnS
+vBONUkh1KQ9+yQmTTEpMyZPR74Hs9rbbQPkkzM4v0O542tm6uoKakaOX6e/d5Qf2Hdj8zg8/q9n
sXzePWcPqWWCSn93+PWr5LVMi7HOsHnfT2LTxqcMrLRJTWqrc8SoF1WdBNNa1WapPVXJqF54Z9tE
uNalelySeFradYwNcva0qLPMwmXzi1Mkls6vYsyosJPZ6Uzd8cRGKRlgsWxitSxWiwk9npTGHxxE
YpGWCxbGK1LE0fGeMNcNYrRtWBc4rzznH4H4eVzf2efeFs7bl7mE77h6xb87C+cX4emSS2dZvjBJ
Oq3lSDztl7RmksyCZfLWX10SX1rA1484rxD7G4xxcNV3D2Lm2i+3xnoUvIuLcW9q0hKT5bT2rIkl
VaZnaMIo14Pke0Qeyww0sklc6+W2ds7ElbrnFbxhFG2g+VU2kD2aOmnsSW22tiopGlKpOqoU9VS1
5Xdi4u7W95mYMnMxczMybafLbh93fetZ1rOaxrVg1avrWu1dr3JK1W1p1jBWSENPDZaG+HzySVzt
rOtaJKXXOKWjBWSENPDaaGsvnokrrV+z44sV6eJ4PFeJ7vqtnlK885PByuTy+ed8PVrc3FDW1mhq
H0JsUks8Fq2daxgtVSsZvqa6w0NQ0TapJZ6LVtatl9EREM5RjFmZmbWZFGFrRmD1iOohLyhHOKYz
m2SzetZVB5xHMQmZQjnNM531fRaxZcXpeMDXT2jqcQ2mjlp6JK61rWNFillxelowijag+WohdLDL
S0SV1quCxJJwkrLi8aW2zIPy0oZqds5tks2ScJKy5vGlsRyT8tKGanbObZLM0nCViS0YYfgsQuks
Em/G+j30uRWFe6nuOz3PS32V33vciOLfV2bzcd5vicdcfuG4afqqkJculyMjpa4Vzrz52e77bvl7
qBrp7R4lmQfl8sNTJJbO2sXLU6re06xga6e0dS1IP0+WWpoktrV7FmVFkpUzeOJDE4cLmec5zXJZ
lVZKVc5jmQzOGVzPOc5rksyqshXAYXrKBSaSyEpMCldybR55dlfJ6cY6dzu++74ek5ub2V6enHTp
1PUrWrZ9ZQZmZm5Oc4O5P4xIkhpZYnSMDXT2xKiz3mE2fOLU2JLbbbOG22daJK3XOK3jA12e2JUW
e0wmz5xz4dlY5dnZ4vc5vwf+0/Mpx4VVVVfBG9h+w2IniiSSQU9no4MNifYjR80kMiPXaq2Zkta8
iTDBSloww+Dc3BuRmNxHJskmTYzSsVW56Mz1aJEkh5t6IbM0kkZsyFuP6O8pSnA6tqrivbF3eG5l
iqw/STNvas2bKYT0+dscKrMw1ZLUiNz8WHYEpRvc2Gym6qqNc6rJhbNZlm3RlilYYMsMM23CmVQ5
iuBktRvc2E1QkkKZyhR1usiMEaSE27Ld6q0YU0kkUqSTvomWjRuVs0t0Mu7PUsTKMtLbsZK3NGWW
GGjLgcCSSst6toQofaVN1t3NGc25YU1EWtyXlVYZuTJhSlKZNmaSckTgsLRKRGTwWB8ufgwBMSkf
5KSVSMqW0WJstLcV2pODgsrjVYXdVbNk7WiQtM6qs1NFOsUvKqyWps6BHRNtW5q+jrZokpE2aI0c
kQEnXgHhFBhCEIQigzZaFigzmE5bKSqKI3snFxSTJanRRok2bKUtbuUphvYcGbS6qlLLSSjetuTC
1WORerb4OfAAAAAAAAAAAAAAAAAAAAAAAAAAAPx63QAAAAAAAAAAAAAAAAAAAAAAAA38DjgAAAAA
PTugAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH6GdKdOmc8c3Kc2dLteJO+77K4lmeZJO9m0
daodVNWzJs2QjDTSq6y7qrN023TaWjbZJdbm7Sut2q2tpMnagpJOyss8Yxijg4JG9m2RhE0bmXBs
0auDJGaMN7DV4LNqTRJKKEZ6VWryp3mbQpBRTNkmFrUpab1OD2GgSklHNSGHuWQ4tlNmy1skkG9k
+R673VJk3KHU53VYSRhLYU4KLU83BkwzaLZJI0Zsl5VVrUpTJeKrC7qrXdVbBC0OaUzdhDNhyUbE
pVatGSMlSqU3KypGN1uHuaMzRNynWUtKIUi0Wk6xRJEwSpJ3EUNiApGio0KaKJp0r7TGLbbanMqR
h5GHUqDYkcCUSW71JaiSNFMKZqRkpaktktJlUyqGFRVTChxplhMoYYTLRho1YaqMqwqaFaKMKZVN
HesMc3FSdRSN50YOxqgNxEiR3HC2Niq55i3Deb1cDVorRTClVWjVg3JMoqpJtcbObaqTg0WugiTn
LMqs62X05llWKZgZWWAGBmYGZZUGZQZZgWVZnN4q63aViVyOJbbc3PBxbptumySSW6bc1ttxptxf
HL2Z7csrMZNuYpSaFrdbDqYTgRQmG5o3nNyINUk1SmTAwzMmTcya1VZqZpIzWsZMmzJhhbJmlp5p
TCmHY11qtWbyU0Uara4E11qtXBkTV1hKUlixJUmbNYjRk6m45E33VTRnbISYYINkj44JLqq3LUtL
WsGVSRXBbJkb0GWSEy0GEJZPPNkZNmyVBnds2LDDC1mFrKWpqkmFmalKWhkta0YYZ3VWpSlKUzIc
Hd2aMk/1DclkdFAUUkklKIlpvcWhhpMmTmSHI8Wrk5qU7lKWWpvZGMNGMVWGTctqww4twHFIkkNy
PRFkTJUcKk0KiHw1ISaqCZYYQha1iSWtZIWtaIRSkiWtZEFrWkSSmbBbCLWtQlpIUjKRMMMkiZVE
SVYRJm3aw42HZxbnJxZiapJaglJhmt4KSMlKkGV3d5MmWM7u6TczUpzarZJk+5IkCMJi1blyIkrc
0YZElbFaJI0k9rQ2KDFBhCWTZCUCzmE9yMZZbmmxIXtNNbu9UE1TNbUaiRhhszSwt89loPNEzTdV
VopbXSq0c2TRSmERwLalMIlmFGTJZopbVq40NigxQZsnfJkzqMs7Tqb0Gxk6nozrSyGqE0uq0XdV
a1LUoxotTC0ts5MMaVWbNozJh4riTKqnAluyk3NSQzKcVZG/fVb2XqREW7PBhxKdQp/G6VXy9ufT
GNPHPPGLms/abHwZGj18qucmRsw/X/Due7KaN1nYw625q4sNJkiuL82G9rSltlKU06eGOpwt2nNb
V5N6aVCqb6VkqyViyqS2Fy/+N3MmTs7dyTgo4tLcU1KYSVzTmZRq2tj+dTj+VsPKaPTWjewNFavo
SSSKWWnyUyVDhc7WJBkoRmhkgob7qrYkmiy4hhhaGDC4RSChSpJbJRopPl5Nx8mSyIjveT+Tc1Zz
kqaqNWfJaduSPRTvYWcGhq4JoREYm+VvVvleWudfhx5PU4W1o1YVh8DIScmzRazJwcFJJDDQj1Zs
KSSd+NKwZLRxyWu7S7yIz7dWfZt0tjF7Vlc6hsDQghULww3gejDiSGIz2LP7B9LbSAwI7RaiOQqE
pUqK4MMpDuUa7LJwpH8dXgjsdTy0dXKD9HJznLn/Wnbk7LrqxO2tOa+gUK4U0i6HvBFMFB3L6xhS
qoYVAp49QkO3BvcKeSEcOvoL5b13ynRJycWWnLGmt40zyjBLdvQEKbCrnZ5iX6QVSc7YNTcXYAVI
BCduEMQOzP4ptL13Yu26vLe/kg/odebqU4qIrlSq5g9AAg6I9SPcFQGHfp9CO0gp49721aFgyKOR
iqa9cjdaxfyD7x42NAACHGxs6Ukksez2yawIEkhjrsnogIexCF3jbE+gqA6EjwNuFA65Gy1WE1YI
6x3mP445wWMIQEYBwIBIIFkkai0EAqQpwjYZ6qpUNlBxbywshSAjp0Dh9AQGOthlUbOrYIO8QMV+
4aAACB1G6O7/e8EZsKdXm4Tlk3cN9M6XTauVONTGttYrmHkcIV6umAOFS1oB5/l/KFFD3jYIX9Ih
HEEIKcmqedVUUo2ZpoUd+UsNUqJGZK01V97qdHuTJ/xuju7GSm9kpgpv/mtup3MrCwgHvDJrXkbZ
IfGSX0PzDu2mryKOJOCw49gc2l1p0ZHbla33W2QG+feZeZqgOKaz82VnevVITBzT7kG9myfI5OOP
tSE9nK5fXx4R0b3Y8DyqLFtVVVLFtKWSkrEpJTBiSSxJTArEvFLPZK9M5FWfWsZmyxdLdqI0PPxx
8KbPg4rbOxmwqfGlV4N0/ZbH7jhLbI/yos7c5kwpTeqbn1qW5uTyYcatU4tKFVFPtv4Vy66tGdJU
plnlnXLqRqP373JwdTVb3L/g2N9NHMi06EbMSXVSTtkbjRoTXU1lJaWo1GmltZVNJpGFzNbJhRsx
JclJKkqS0mbZbFJLfvUmEVZth+grVSp5vRhvel5tj7sy/6J5vef857GjfJ6d3ax91LZdWOVED8Mj
xbdNv+ndxb2Tbhz+tkm/STkKd6lP2piGfVpemFR5S/uwyz3sEcdzoIde31oHOAA+yhFIOsHBZDR/
AVaAWTxZ92jdpb44x06L1RJJIPc4p8jh72d8uM214VwVGSnKnuZ8miTikDDV8WzYcKRnKdOXJ8eC
6Ivsg/QDHsEHv6CCPNBAJPyD9pSVE4J9B6Y0CnS9NHW8TJ0xenDnWHRWK7Od6tbm+mcwJsUBDYDc
r2Hf4jsDAmoQdEX8Qy+4j6KACRgPsGG56UePOnvpeLG5YeBYQg694IEgl0la5azQ5ALRBEiBGCDy
CHtBBUcBLDAkNoOu8qCw4ZKvu8XRA96HlAdDsIgKsclA45C0aY7CVUoIbawAMSiQphE5zA1lyEAY
T46HoP1xIAka4PePUGAEc69C72CNsjZzhVeZEqs/RROMGKD0SD9PiybmezVVZ9rE1ZMtMz7P5bsN
I1NJGv6MkI/PHY9+ic+b1SBkjxQj8WyQKRJJINHZ9P6Egf434urrc3vej25P6btfU3avBmna9M/e
/83Y5ng5rw9xk/U+jhwpXQtudPJbZ1tSfzh+gcAOGh78D5eXl+X5D28HCZE4icHCYMJOUpEsilv2
3qVPbt+x7HSG5s/Y9Hdto3uJb6/IxyGZ6lZ9z6vA36EQwBvxbsVIiZQGJFqSmShEpmphIGC3kcS8
Or6K0rjMUzPm4M1xrQbrd0Jbc0r5x5kpoiiYKmFTAYR5isIyVBKBo7Xwe8zfNyd1JzeDPd4O1n65
esxGNOmFc+e+sk+3XXcxrXHRmbf2s0P506svyf0ID+38A4Z5uc4FARjf9kOcSIxWT2NoE/K7XHc9
xvWc4yBIVTRTSYRA5yBwDhEPkOojDItygqCq6DgBLNx9KDAu7801iM3uREWgrywFvQYSTDEFwKp+
AmMC1kRvc+W//PodDtW1p1uLbdS87xzbcEB9YIOAAGYiHpS5AElD2KxlYK8At4XGwmFR27Wr/ovq
AIrgdOsHY8AfEEVp5GtAAFMOSSc4/kHFxKMbWHUHYNQPta4vWFahgwtD3HYZgMGALPqqg2i9BuKs
Lto7Kp26F5swskICC0s1tbT5ePRO4/LrtB/nSB/gbjybc0ne5uryRon2UlqSqqKSON5+RtaJzokk
kHwcbKcSEcXYkJ1pkT5u9SfI6LWyPz1c+TtZyeSJJJBue7m43Vd2b6nufse897E1Savq9/lvX6U/
JIMQc6QRBCUoRk+Qv1H2fS9ByePPwH3D4j3DrAWut5Jm0l3zvFW7i3Nvt5VoxfZ108DbQmaQaFJB
RmydgkM3W9NU1Q9XKKDt+YH4eC40XyOIxzu0XiTih/nFTl9AUPysNC1rwc3LEMXpJz0lYJ9w/SP8
AclWyNoXgAREQ+sO/OAwb8rwRDAdi9j2ChSzIDSrl8M7s54P7B9QoOVIIUJ2lC59I1qqHIrz1mvu
A+UaGO2t9Hy5twMTimuRD90Ie7fbQMELTKjNgPQsBgsJ75dhTwyoFxdt8vYi6q+kiPUGfcMptbZM
II0AAIjwxbS+gUa196QnvfLlxrWt2+ruGXJjnl807MuZW5TrxvxVL2eP0B9ORs+h15AmXQJzrEzk
cQaAH6hmh0w04I6GBf0IBnR6kp0q6ITtSLuHhAsiW7ISHZVZOeta7q+Deyaa7qvteHqgP0QYYncG
r7nFPNvU4dT+DvnD13J+L3ID4cEGlLf0O3uIh5JNQ5uXNBpXXqtX7KrLy9n49zbV6v9D4O9wGOrx
WLnS5i4dYZBmALiP2rpl/IZhYI5zoBQz4Ntq3W7aY71z5dVY0fCkDR9izYeiXb8LfbbV7uGX2YNE
rLZM5tlRE2YtwU5DcGAKA3gx+wEGwQBw5F6EvfpUugJ4eyP3MXjLwn4aA5IIN7zn3qEL4NDWta1o
AcCrUuwcFEfrqv2ZACmu7EpThXZLRSwzVfSOD6RqOtpQIoHXKSOygbnS1KdFjiZKPgXpk/E0uzkZ
5D9YYu0OqjXShwSO0YqYRcdddU/hNg8GdA5PNgS/COaNAhZrhTVArA0Na1rWgB+zduDOky95IeUh
1lyEX8Q9vMQOh2NaA0nO2q9vAReKiQQgaRQVS5H5wQBJ1KaPfYxw3QiKKWiwD5VUzB4U62l4jwZC
w6hA4QCAmsABAuWQnEWFrFMErCIlqSkws0jjGotOomn/IFFizEnGxWr29QNDT+DfzNuHzeU+mpxK
TxR/JCKSfkyK/i6Psfi8f0W/bTrfhqpEkkg+b4Nu18HhtVT7KkbKe2rXU1+le5gyqYYXlRx/JaaN
y0Gm2iA3NI7LZJnCZk29/zF0bFKrR3SkqhSkknL5t7De58L08v2NZ88lZNPjU4vmbuM69yrYW79B
p83RQqBK01ggKNgURrQACCpddD8+eHTJvd7LBcDK6s3Q0Na1rWgB8o5XS6e5pEJA4gnyGgAAqPsf
nFN13BNp84132/meU6Vdunaa21URPmcGlUXqVmIANIghlC+wHuGYNBgQbSp4X398/aAYdNRHTWHT
7tONTA7im8lelPJ8mEBEtxKJZF1U2QNg6QqUfg1oDW4acZIZvK3MoMCgN1fnDKfovEzTB2RrVkd1
q6TIAyLGLPspO4JZni1m4ZBEubaCHDlBSQfuBDDAhNfm1Xm9T1eq0e77TvOciSSQeP2JMj921ho7
n2EOSQPwSfZ9/Wgp8U6BkhGiTDCU9Es793e9KPX41Wsc8mvnu4VWVbjT6PituHA6fh78SXeMTk3N
3s4ty2j5huWPrdEBhMK+H/8s01XEk1MmUkKqJVRKaqJh0h7XBvEdfIe+nlCurCaBEOcXJUSkgWZu
B/L9Tw7qvSNjBSOEC53wKKHQoSTaILRVGAvCBHTVWbFANZDwkqZDsze8BVLHU7rQCmRpvvfrth8E
HL/Q6J3sVX6u5h5VmrPg3K06djmfFEkkg6+7p259G/RZ2Y3VnZ6m7blW6VTHJ2Gakgp30DlxL6hg
rAj3BOHr52Rw2ZK2jaN0IgmZzquRvs0RQFi4D73w6YI6PUztERRNe0orAct947Mtq6fByANwF51J
M28LY3TTZeKl3IKVSqy8l3aPtBFBnoXLG9AbCj4ih0OtMg6vFB9EB4uLl9PzQHF29zrcm58w/RHU
lIx0S0hOt3u5WXjxb3e5eCtqtV9ubXdHatoqiGh8TRJuQpFBSSHW2eNPwbHL7HQ7ZxjZFhyRVQfT
TBvJ1rRqotcEw1aTQwETChQW+EXUKfjSuS1lQqiwVXPpEXL0waV36MFdysS7ykEOGNsrrj31eYtu
8X941oAD6xrVjc8oqK0LZHEX7wOkW7pGAhnFFBb9fV7wUmwSDO8YXkfcGCDzDRqw72vmE6nxAlCC
jKX2lJ4+0aGta1rQAzLpLU4RMNBBLUJKkINAADywnxRsutJpAqILq+PLTErSIqIzmUF66Vs+CmjL
Xdfmza+aA4e7wZ5U8fbzkgfR/6PsdTxRJJIOT6JCcUgdyQnwRJJIMMklOq0hPgk8XR4PNxPHzZtn
lM8ctN3dZ4vRp5xy91ZQxF4rENt84+057n02bTogPyevRtnG2LYiC2Qg2CSedIwVADgBgDiDt8gi
GzGpcMbDZCz8gBQgSNBjuGRTS0iuzewX3Dje4Vvoa0ABeMIG1CBXRqyvn3T9p1cPuBPpMlMRf+Xs
A4VtFofAOAcI7VFTLKyPyHOAAXye9twFSJiF4sKL9HjbCakPoAg6ZRUiBjTlOtTTGVeCkh3Z5Zpc
kLchlLM1rNDXqANsrJtShBoWgdSk60QRgkDKMrgQyKuVQrCoNaA1vb4UlUHQoSuLMtio9PCEMj60
AAFwwrwWbf7EQ+F0DMNLwYwobbRKAzLjbiQ1UtJVUkzd21CYuaRYCkJD39gcSMZZpN3n7tfBp8Q+
r597k00mNvB4fYgPp1vrCkb8mTVAWjz7eHb123MzL0xvxV4qf8DJbv+G9Ekkg3Mp7FU+aW0ek7tf
X224VtlXU4M8Om/GNt22jI2wg0AAMaQrzVqXpBX5giAWQXtWqrgaDSIiU84d20hSURHl1idgMiyr
O7NsosBpT+CNDWta1oAENE78NcXOMqsjM6t8/uJWexsQislX9I0/NunawpuNCxC6uWpanQkKEx0B
T7BcFX1fxDtPnyqUnnu9w/aAuO6tazpV4khDDUx54YIE7pcs7oqQchKxx8g0AAFeieaRRlvypkM9
6/HXKhHkq6NSJipCy7fUFEhnz6BoDQ9wAFD5xr4LQHf5daA6IP+t0fN72DClbn0fkgPGnU/dm/cm
Hr1ve+D+HBPm+v8a/GuF/r/fraqOy3+Fr7tH/S97qZtU6nm4OjqaOtqpKSinJvNmbI/Yww6KZM5K
yUlUlNjit0f1tJk7GvJlzYTe5MmEqlUb7tmpm7WjVwLH/Gw2TI0NC1snFjV/0djRh/F2G973Rm/w
KfFTndD8WxofofzMI6mPpWc5o6TvsMstz43cejl0Zv3PJ+b9G/hxQpT3M3U+16nve81blG1G57P/
gOSNHrsiTqe9k8U7Hc4j4vqbObZ8n/L+5k636tx82SFJ/fdVJ0c1rb1z1qvc6nQ+7Vo4LdXZ2vwf
blhzbP+XVm4M15tz/Mey3i+9Zm7B1uT0auSm463k4a61XJffq+D2OpvFD6mPXrSdQdFvJODk+zsc
H8Fux9NrzL9mrY4E5GzpP4WjzPsYdBVaEwVJOjEkjrO6AX/MsFHkH8gv6xj3T7c0HRLG0gC/q9h/
pmPfDwH/5PwcJzOM8z6jm9twqr2nQw42XjVhNynqVn7y7W84mr3WW6sm99xgwyfH+CRAR63O6Do4
Bo73KPmfmU/clre9mlo/5nD+bCP7zMSRX5keE0fyKcRIRHqfA629h76MT+wrJtcyvmRsy3Nj+pSu
V+o1Ro63Ii2519ax2Mm5HDdmtGTrf1FpJ+0lJ8TrPzvoY86qmpRsnE/sasMPgyZyKaH+pw/izWR5
KDtQM7i1EaT5WlKiaUng3Hc7nf4Pe/JkinJfcW1dpmWpHvebgbfq5mzV1MM3VkjiyMZM2a3+Ep7i
UR8CkopFFRNXULd4k2akyODolxJGqTQomrDMvJHgODwnmhCRakYRSEmyJ4qkqnFmp1N/if3sZ/Fh
/reJTPOU5vSzrRkMkSkV3us5HN5PelmxToyOiMc5TIZv+v/JkbzuXE7qg7Hi/9f9Zxch0508/LbD
GMYYxjDGMYYxjEkeFRGeM7wWtLWlrS1pkzgzMzmZM9EmfPk96TZjgvn0cLk8n6bsJ8HJ7NZG5H/D
E7HJHUjkjMvrRkTweHYERGiMiQiMxxI+Tqct70ccif87jbcp1qfgw3I3vF6vDw7m6PoumlttttvA
8abnYjodB4G9UTqPIXe0YV0VbKobnyb4NqcbYdLvJNSoEZeLnncvVTyWWc25Xpmq+C9Neb6QAc3q
RktKJSfuVB6SZJT4s2GLWpE8rZMJakti2SYFmZSZmFAZKMKUUlUjvRTRHNZrXzWjqRyRozGc1anO
2QJ6patlpjRHC62E1J2Qm9mcHJoTe7lqFNzn5jm6T+o076SUfuWSeqvwU/sfm+Gde1VlUtMsWs6x
weJobP+RhLKKUpP1kElJPFx97yYk0ZvJHon5IT0RSESR4txK/4zD5PkjmGDsdjLby/kOZeq0j/Z2
rdn1lNx/d9nnkZKU6M9HiyZk73c+D5JP2u4fRmblOTJ7j4nXIxKO69+tl4/FoBu2WTdANWWXxWXr
RbkjBIRGidnubUmzc/ymTsc2x3N6Pg6oZHVI1UwwPdUnx/CrTvUc1ODyR8Ekdz7HUj2wzR9jZFk8
oO4zZ/QLbNUU7SWmztbFEWW3I/OM2qKbjfcHzorvfNsnqtozyOhM2p3OxG7ZGqPgjvRmw+83nyOp
mTbuNYcVBmTk7Te4MkZv6X6Njqd7xcz4t82MLWpama3NmqmTmjzZuow5o4vAqP+in7kUoeKwZKfB
QxzZsvzRhHmPZq9yObOokKqSpMw8TRrFXqPoeJsVScKp+pXUeLXBup6lP61LPB1D3KSO1xfzMyak
nW7y258Ec3+t/zM5NazSfUjojc8Onfd39GLVVVVVVVVVRRVVVVVVVVVVVVbJJJ657PU75OJ3z8WW
e5PrRlo8js+tGR9SN0bN6Lp7mr6Gqjj4iZtM56qTqO0zR9EyBl8UcFrarO8o7XnAwAd1xVea4pVn
Fm2VWWX/IblRUP620aOCnN1driSER8GY7XM+txNNjaVVb3a6zYYf832ube/iKSZu57U8Tfm6keCR
ER8N/2tUd72R/YyRua0/yLtalSSySS0nkOo4VtW8DCzli2LlwZMFIpOClo8fN5G9LZyOiLukU3ow
kkdzQyR2vrf4n9Tg3HA3on7nlH45GRJm80eyWjwPo0HN7KUZyjUqUrCYXZhTrPraJO5yfCbifFyc
2r0diMInEyRzcfFGOvxb2BqTJ5sJOBotHvSjVFDkSa8cJxTeWfUo97Rbo+bufJkpNj3vAjVqphm7
vFHU2JSPAm9pTjJJCKlFBJ/q61fM9pogsqZVCqsgksST89tgflJgr+R8DDgfYjH9Pz3GMW3a7rp9
cfgPwn3zznoPcPdPrPsjoPkPwHsPYew/tPyn7Y8R7D2HsPYdh7D2Hsj2HsPYew9h7D2HsPZHsPYf
7n+p8h9R/QfrP3R/1P6D95/ufMfIeUnpf+Lqj1fswnyfw/O/T9Fv4vpt4HBw3/bP7bjg6lUb/SJY
QBPaDQEfy0GLaNqwqNToipAKIBeQkpJxnfCKx0axrWUrghhBFOaUYCIcPcYkCZdQzraCC0phYBhI
DYguf1KAHfMuzjMiYu6sMqCoaWB3kxKWwNYLBBDzMpNmBlzrC7gBHwKAREqKRBp4NI8Klm4rFVxC
BpY2ExiEu3EBiawrMPUWDiuYd5iEZlaSwoIVJWqWYaCqpjkLUoiN+oOjWDlS7H+cDDQwG9y+ongG
IwIfjTlomAsHSxqIaiTdrRZGnzjAzud1s5qoEsAj4kQVktBkJ8nygPCMjYNNWOY8B7t95tlZ0hIY
U0ZiJRcwSomS9s4R3YOVrYpHtZlKjGKzK5lYEu7dLu2uoyZurq7u7q6urq6m7qbm4ubi4uLi4uLh
1SRT5kOY5joK1oZSuqIZHWovYMdQikyBAqRugg3WLUqiyr+AGdaoSsorYNboGnSoFj+RYkaT6G6T
nR9bKB9j9ySNEfoKj6GxE+na/Q/aif3Im1GTc7EZJEiN6o8b2yYIrYjAibkTiJPsfsRN3C4na/2f
W5n97V/ktX+0n1t5TQw/7or9zLkAnA5Ws0ttVWjAw4k4Opyf7zNOLqBvdTK6rJ8GTJtftzcMZfES
tCp/q3tXLVsbrisYwcOGPKLr5BIPRzbcYAxSldLivr9LMOZ2MOwnRzTi38KrqNzgZKUUpSnFot2c
2GRbR2ubqcqqqu86rGOLR2f+CrbjtwrBhqpRNnWqbK35VV8mi44qn/cdzgdzKXmnaWei7V4Wei57
2A4rbm6+AGJJarqrfd2tBonZy4XdXd1vG9vVVV3GzCjjvdXtBAj+aICKcuKXFym3/QpSnLcMZIEq
MGUc/X9fn7+/2d2dr0fB5u/yAOm24YAKEgmJAnJ5cb5yNNznGA/G4/66ICh0BIogarXye6VVVVUt
rbbbbbQC2221VW221mUttttVVttttVVttttVVVYMFbbbbVVQBVW2231S/LJ9SZJk5mZJnpmRZskD
27HJ0QjSWfe/3smHp+ns/JvyfrP/lxM2iJJJBxfTeczD6MHdv8Bh+xStXlDthXjPIYeNtMKRXK0Y
ZKw+0lUhSmEWtZ0fRp8qqzBkbu9KlNfiqk7GZPYRos6mNWGSSevMoye5TzSBWFcTSLbSkooibm9x
pl/YwB7ZNxgeCOcfYUoo6pucEyaOnRtuwwqlYxbEqtX+1o632gyTkyVsqmzfJKci0lHf114+1rvG
HhyqubDwSDZJuVNjmS318Ycait6WncdSefaXjqvlV3eM7TyaJb3pFqU5G//a71v5VoH05w3u5FSc
qjisraVip286Ye5lhZUtllWwcxhg2L3K6cvcDPa59rLsd14RXcYVZwV36xZjmMmCa5NXwR4s0kkR
KauG1V5v1aM02P9zeWpFKk1NznfXV3btVJueOGI8XwbOxRktv6Ml9HUb1bzimjfsrc0ay6qns/7F
pvkkpD4OZPm6n3Hk8UGr/06O5599mdKu2KKRJLV3VVIETookiR1qd7RbaUVJyW3R8tDCpGFU2eDk
3R2oh2NIzfRwNHlwqtqYYuqxTBEfeoyxartFrWRNX1Jrhm+p9DrTDZNSifsW3MkpsthaYjuqpTBu
ePDqr9FLp4KQj3Szvk/MAEFp5bizEbKzDkJgf9RgeRoOHLkHERd8CxmZLJKUmISSRJWS3JzHKdbJ
3qUzfvOxwOF5jvNOe21Vtqaqp1OKOxmMVLYcElXEKhfao8nWOqJKaOpZjHwK97zRyNWHgUaNRPJh
EBLU4BuSNnI/3KE+D9DwzqsLaqOXUblDOkNtMkeBulaPYrhRlq9689l1qfgra7vF6gWExmE8O+GE
XmB3kTZrJSaxknqnk4sKZMmrmqMLta5Dema2TJTMvUy3LXmpZhRe2H71bGd5y3kq27qcRvaNGze2
8LXd3Vb3Z2Kp4pCUtT6xLeK6WsBUqR7SjgVHddEy1f4aDwN41OTgz3EnBAeyYHatk7vZJ2mtK7Ld
2lVSQ8vF3p+Skk+rVtFb6tVF0uqquizVEkkgpJ/Kn4aVWd1H3fZcelSXdzFMv0/b5tgZZkhTZ54y
V2aZ4yVlnnnoZtPfKqS6qqqkERgFBAYRgZAEGBgFBAUGBi9dklgQ+t4H8WY9GE6vg3IR+0pITx/L
nTRAVxw008h8Hw8ne2Q5J+KOSDR4qTJEBNmhPo/asIfJ8FgnMtaFpbxSH5mS25vORaMhwZMmrRhJ
OyRNzKTVQpA9lI9nn30Wr3Pe5PZvdE6EbyOKiG9RGEzWMKDn/BAVq5HMrG1FVJVApUBSkTItXanG
dybj0f0NWCfg2eLgZKSI+VHEbUntKqbTCdSbUTJ3XWyh6PU9gw4NNTcqpdVVNUpSnYy4tHYfc8m8
at5aT8T4fJgycFnUtMKU+fhou8TZ80gf09b+l83FHBREecm90YQ4Jb5aY/p7Fuuq4s37Dcktj7FR
e/ZXvpgtGRegdSP+8w8ia2HvUjRBSj1KHY8w5vvQaI5tlpHWYbDtfFMj6K9fhd3Z5eH4+Df/1Ke5
tbNTR3rLqdKTNUnvZYKr7PjeKSKxlWq7um/J8U7H5N2cZx9jl/B6Oge4XWtBQlViPxu8muPPHKiu
e68bc8nj4ZfDve52GqiLKSbUmOFVWFUqlVVR4q6ZUmVc6UdaAo6sL6i89+XJljGWzeUZCSmqk1WR
SjRJJFqWtcpa1qLUosoWqMKqsYYDrQGEwkyrFtwUJYlSk2pZbWylIFLdlLS1Et8/wedFs3zflT68
+bxZI/NhlwdTegOt2Ln3sWe58307cu86Kb3J5U70eC3wclsj0RHFITsPd9JVR1qqqhL7X6NxNvs8
OOMYxRP0YWiSImzNTsRS39kdRwSIpUZCe2p5VTancwvG5G7Zblw22nwpaimrRO5dVXaswJq+59Yp
oizjvOjzYPxTZ9k4P3auaeL2Jbja4WUpSGGJmQhhDMgHml3ci3dFkyz4pxJxBGHc6raGZtLgzM1H
bSkfsfr8XMeXvqY+Gu+5vevVeby3snmS6canASLeFvmrXWUurwqYUapTVt72+lZsUmabIjHh3Yur
x7mklzRmp5pTNmnAzmjCcFJM26JPPFyrhaSUjcks1bmbNk8Rg4vBNRmsZOxDkfo8TmvDpwErSbaz
gzjTjhlxjAmhgZxYlp2KUuLRSmGy0LmHzqe/fcq7SBSkB1GbVzT8Sdjq7ezf35MqyyywmFGzgk4M
lOsWloZKybaiDDJ1iW8DBZ7u51EynhVZu9lxVvdZ2ObvRvTcpbwJbm8XcwUnzjXc81p16K5ueGTq
tktSSSKEkkLIkkNWVKC3CXUKiKQUD3BSpzpn5oxMiozsGxgzNBdxdxElupGL51V4MP0YZMibOC2X
Xlvvhd4rFMYq7rDfvV6vweri3uKP+2QSYeKODmtKcESLHKquZsy95qY8nFbXU0YPFbbVrL1Jkokl
n0dShk9STcLU62/dKqe8w2TMpT6/pxdj07MexP/PY+HrUrg6HvZutOsqRxUxm9ztfF8/h63d29zV
v8qrcwhO5Kw7nKJpPJvnnTcpdXSrXItU3qVqn/EpOp0Pj5bPKb5vxt4YRLI7vJmAkIiSLEDgAIHs
PMaUE96dHFqDNDNzpwYbjDzlOYroN5XWTvo9/LejeskJ3LFpilsh16MNzsKuM6KXS60W6Kc1rZa4
YYUFqIdzqxpbSVK0VJwKb6jSllNLJMEYWLD0BBYUXPBdqIK5nx8qqsov5yuJEdY6pL4QB0jakYqq
7EeadYkEnIn70rjx6yutiYEqG9G8d+vWNt2e6U8BLXV857veWGnNUM2gkkvsDexHCKrpY107dduN
7teF57nbu4OTfaM1MnxasN77UBow7ZS2zZ0a2wcUnqw1EzqR2V0qvqypvpVpooEQqOhYTwih5+Hv
9+WuzHwQXs4fO87LDqmngdg6QXKGeimDN8DTnW2VAnUEsCgUYAioJvk53Zu8V6AAUZBkGBQAUABR
YFBgUAAEYVV2BWlttMAhIyWQjMkd4Q5qSR0+L7mpbwQeSTvTc+G3wfej8/g5vzfBr1IDuXhBwh9T
RolTik069G4tSUfJ3u/HxKfF2NnrM3waJbZm63sfRJHPdJwU7XbP25IbHBzdT5vgyyW5qVVVIsRI
1IUbwfJN/Z5/W3rOpmWcRM6GtAcoGQoA0Hbh1pvT3PuYdzs4qpTQ7KVSZXartPckpipVR0fYLNko
J5OXcjKpPPO13YbySYEGWGCSne63oyPxUyejcTk9XiodGUthMPFq2fqt9D6mbN9jy9ylruqnYRSS
gVEFCFB1qBrvehHZLCex3gIDwSdD4iNETZojDa/w0dKzLq92qq8uJjVawhpDm6YSZN7YnaVE1kpS
Kc30+4+fg7U+tqPVNk5qb3rPEPF8O1mnopO0p0UjRmyfR+zg9NVduLqrwgeDsyT54ThO6QpUSnl6
PTc8YeimErySdXXaXSPe7Nq+N2v7HeclJSd/4JCfU/Pr8qqknsHcfN94fFhHep2Hqno7vqqs06Gf
BXBaHBvbOtrUqpVKoDb9m2W3Os8ZZZ5tQhbgDYkmT7U2ns4R8vBq3uRBqinH0qqTDo4vemqOw2Tv
fd2jqc23Cq6+35uD6mibApc73M+LvRwwo6zrFDDRkW2ZPLtquicXIWlHn7Kqqrm3jk7WHM2c0I63
zdw2nxRJJIN7shHVQFCh4IcEpmfQIN6LABQwiQJQfuBDtAHsII+4IHFihBbJH19DtRIHBYGqDA6s
YGDwy2jTipuw7NptnLGqufLqXwbmaNVqI02VlFYY5snLDbQxUVWXPNwozmbObFc+YtwyIGHQDMgk
IGFA2HHdRXYoKNcCCk+ceA7pAnAVgDEhAgeBN6E1Ms974N2Nw1HIakqHqMBtUZd+fm3IDpGGmeHR
FUq7KzDEHHbGSiOXfiVq7u3VabrYqWayFoeHrjnws49NT6HfQzg3nU5sQk9EZjKrrxgdEyppnbWQ
zGMfc9zVDhFRyGYHxvVOxV93w+TONMMAvoUOAacaAYDTgto6mBOthkkcd5uaG6qrNa1pLVAOiCCI
kUG1t+u0gEL2+47SNSWRJJiZiYDnT1Jc0uROR1tr2zWBQqSSCrJWIlOE1SgrWis6p2cevl0uryE8
lM89NsYvGSbOsiFsKUSipKJVQGIkEzJxq6LaxbYN3dWaKzQGYFmjiyzMzMqMiXSxZJJIWklJZVsm
FoilITKkiYYCGGFQFUIKwwkLSSWkYGTCSYMFtswwyDJckSZVETCSDDCSKoGEpIkS0nMoMESJGCWp
RcSBLIlqSJSlLLElrsgpQhEk0KhJlhWEkUqQqoiklITFlohS1ekauLR3pz7N/fiqvGMUrGLu8WyR
JxUpKOcm59TA+jkx9rZzeySjo5TLe4MKdHi7HQ7VKS2S25SUKYLp2Njcwau50JODNLZODRJk0fq5
uEjvUpuXBq42mymBwd7ZkydVyHlNynsxD1aM0wbi6VU8xJqysrrajmRqcWxodjmuZqfa41KqMm9U
VTr7Wk7GjJvDm3NUUb1OBSm5akSYxd3eGLLueNSSstkpgHmPGEsnEoBllnms2Od0t0ZOpTA0ap1O
Di0dZW5U1VKaubPizYTZbQN7C0YKZqXarazNUw7m9hwW0aXuZuLYGNzVObTJJCx2Gk3MmctMOjRr
opzU+BnyVs9W9ocU2W7akNuxHW8sg14JJaaKHUrsW6c0ZR1n5vs9mHr/haO1u3Wtd3Srqr43SqmQ
wikkjNCidhk8tz1TvTzcEcG5328fnVdsmp3O+lhJ5GdVXhSdiOqA7bq537OpJ3ybnHQ3XExbnOMm
eBJKzJlWxoiaNGw++667HS9m9oao6lsm53MHI5PRslDCOwJUiqlLYsLbSTwuVkmXQeY9TRJaWjgI
1OosynwxON1JJ7ZbLcKYeymExxRGxHaw3yPrd7g0bcZVUod+0hhJ0bjCaehq0Np3sa48sqMq2rF2
xUjNvXnVU0Baj+8yePiU8nI61Cf1LHHc3lP+5aafw3TvJHRq6RJHxTe7TqQ4bnlVXeqUqGil063U
78nDSq1gxpItRmXhl8DJopm/FbPfetKphmt5bmTJmpF+V1bKufCDlXSmodpBu4KTLSopFkWYNLen
AcM2LUw5seRj0116ZXjGXHNqjgo4qH/gpNxSc1uQ4nPEc2dKqSZi3FhaEaqBb+40YFut9TcHNnN4
3bGBUMSKFuSk7H9KpJTUw7iegp5rxIfW5l8OHByxbK7Yu2Vz7xJ3uJ5KSTznnoSdqSVNmc+Jpx9i
1FLeLHq6ejRv44Zt7ctrXDT2Wp9lR9yyloSFl5sDQQQNAADZCbEAKHw1qkb3B4IjeyZWmuF78Ew3
qqQqpN7JSifWpN7elpMjVcGyopZZRkxIdXFVH6vJm1b1GabJydjirnWDqxL688TOmNK0rSu8jExV
ujLVDVNH4xlsjNtABJ3W2owBJ5K+Tz5cVzd09ykiTe00W23w8JpVsVxk87fNG1yuJv4kkgBnnzvu
65rtWZZZZOhxeOMTFVSjZktsLUtkzS5KSWWhZXIwyyttVdwm+uZvRI4S0thJwkozeZ3rMOagpKQq
mzWdzCM0KcZPFKOpQ4sn6nmnoe4ScDQE4uDznGfGiMK5u1XS60lm1XbqdLrYnnHwRRHyTzSR8XJV
OxidarzyzyqVed+F9NnHGytLOuruweBFhC2F5659tmZb2ZC76Y2229NcYzxnnppHkr7ififJ+T9f
9L9HWdqQmn88nrVONpCfwHX38WRxRgLT1NG452+pxaIOLNm8USSdmTHY7yLarfw/haeLsU3fX2vQ
e5zHRaOpKR974LU+Wg4jk4OC24tZt69x7zmo3HFGmevfd0KG+Tq4++7xdXjGMKtV4WpN5tP3o/zG
bRx3JI+RsWWW1gPArcrgZcraaP3eD6i3ddEkbtdV1Vq/zrtVSubXFV3tGa2G59TQ7dXuccib1He6
0g70dyn7lpDrZHeos93RU9yJHpSpHXOs30s68lteAmiSSSQdtzMbMraSkRMy3StUmSe33K6kn2+8
z9hyTdh1OZZ/VxM2R+D6zsJDvUpRIhTtaap29aqMCM1yTgo6nUm4djc2H+iq4kSSSDe77Xptr5Xz
6kRyBW+d0tH4p5NyYdh5smqNRxZOLsdqmnb+mlenUPDu6gunuMEfg/AKmaSRNGGSIVRBkUmAOEF7
t2W2e7F6Vpi9M8YaUykpUhSkoa9aIFl67x23IDKpVl57NsXjvR8/nNzOnmFKydb3uxNmrVnuWW9y
Bmzfi+9PB9XvScCcaoRvy+4qOl1DETKyKqLYkzUkM6J1KgguuNL6bXbLw20X4aaZZbaYzyydlZVE
lWcgrrQpkRwgjSsGZIeEKUzuiOr4MsbZ1cyJ47zc7WTNspFLk3DdicLximuOLhcy42q8XFbV688A
GWDiyu6CZ0G90QFf1/cdH38LV76dJTYtuQHq/tRh2NDmUsqmh2GZH7B4IzcHFqyaCOt3O9mydVO9
SlqS36KWjilqU4oks9Z0nrKZtnXo6zVi1qiiqtc8y0kQlbCwYSe7LL9T7rz0t+3kPCR8CTPiv6dE
4WXAwlqJVMbOauDgxis54+BJN6VRgo0Uw2O/31WTocVuhp/c8ImFPPJ3NyjW2yqejew8CJJwHOqq
4PB8OUG33GiA+fijM3HIt4qFClKUOCWql626fh0T0WEkCMkhUSiobFQVJknIm93WDhPd22yqnSsz
ZeJiqp9aehxbMlKTqd6jPtVs5UkR5tnN8XIjNl9ywwoOnuVaTggPd0ktt3XfVi8YsRwoth4raM3c
tx/L5OJwUoUhSqLEarIHr2TCM0xZA2SOpI3vs5H5dSPSSI0/H6sSSImLxgSI+OHBMk8fYd62CxLa
xLq1SSWq2KKrB61aAXZmNjJJGMArplDCmKSZIyAgR09/ETIs0txgtSQwqSWe+4GHxeyQP0lINGv3
ev4IR8WqIbgJoKilSCqU5jqeE8LRGsASSxJ1vivvfFPV4PRSin2OSbiTglH5o4mlWitE5+xPO6o/
l1RhU2IqJxOBgjcpSilJ1/9/Z19tVNzebIUz+xC+O5va7qq2zctPD+SDDBqdGziOxlm3K5OTDCzl
Vez8EZOSAzfWrWsi3o4BwZubmpNVuqZQ6o/HJVxc6LcE1fsdmZJMJmNE+pqtJNyS2Y90cGmhr/6/
q0ZCMmxbxpVO58+Tgy/uYOpCOaJuYSk+OJ71fnnj7PX7Hllr+F1G7Ez2zxppeN217qbaR+NPhsPs
YT0YOK+jt9OWfL4AAAAAZgAGAAAAYGB9rZV7b0XeYd5vDxPinvBzpNhsK8ngdxPwPntrV6VZE50n
abn4vVmst4RF1HomqiIR1VEQ6VAm1SSSbShY6lcDOHKqRufFM2qj72S2bI3Gq2ji1bzye9UEziqi
kcX+aVcG8ydTotq5OBTDY+wX183yoiDxXzcaDBhojsR6bJM0CyAkkgggiqU2QaO6He5Nm41Tk5Nz
/CxzSZpsTN8ylE+BvZrMx+DqZvFyEo/zHBJLOKdT63ap1I7nf4Sqn1lIGje4nBNGyTPTS7vrQjt1
SYUiFkCmbV4ji0mTbwOCnPqTg4EnW7POKqPMUKQjEc2/8Xh1PR0JJ0S0djzkjmqt/+e5inzqXS7S
VQwqSwqhSSVEkkgqSVNBylXIzlTrOim/lHXE1TormkqUiJKcJOsnRtnart+LuPt/Wqu3tPV4TUpu
OJR+xSb+b5PVxN/zxd3xcGfBTClxTu0ddVSlaJSMIkHkfWye5wEHmzNDWsdmMYxTCh5qTe4LN7zJ
aEdZ7ODKlYPNmejmNx6bY7fnd5ZZeKJMzJaST3gYSQUDUec99VW/W5zdFvM6MYkwph8FzVlbLw2Z
Mm3VnhR2rtv2UxPDa1G6QpwVth3sOTTgu2HC1WuT8JBJSm5N7G6JU4a8N5eKuYq5nSs5ac1JkNDG
G+i3GO90HSVH0Ke5U7u23yvvcK8BNXlDqnOsR786291v5bJOUnfwqsJ3eCvaTsyfVzdV1azvPowz
cU2UwVR2RRBk/yhknY9PI9C1De1ckd+SLJKqJVkCVUiSQqqo0b+O3OixEkh7fK14b40xjC0VJFJo
mzZbBo7hTyJW0klNNLeuZOGFPmtZ9E+Ftk/M7B9TiUTSI1dbsKFSpafCwYeJ9s1OXWHdWWL4+i3v
P43IN7sKElpbcPk4SaM4KVIdfhVZuLRsbGotcXUVQZvjCSWteFoYRmW0rzVL4a6a3irxdtNGGlmS
YTZJFpvR7nlPSqkib1GRMNoj7nF8Oyb8GavZVpHUl5zBwblOilkpRhqsoU9GgvC3Jid9JDQyHsmj
rTiZrSUoj60SSSD3zhjS2q8bGLarDCDBZEZ8DLMj33qQjlcsSVJUsepJs43toR8qQOp0SfyeH5I6
keSQmEB4NHi7/AJs934+ST8tXZSvwOj7venxZI+b6279fZCNXR86fosOrpkblHU8W7+LZ9H2pA7P
geSno3lbmzO0pxbbPS+L7Lnh6psY6adz1s97tszwF1a2wsFyQCWJFyoJ1dpH8MUICkaZAkEO7nbp
igqKY6t1syRmXiEsxmZm5XyHhu7u5BgYGYG7u7oCqqqku7u71+b6vsbHpqkJ4OLv+G3UgPL6tPqQ
HuTscCcnaUUKWqPWhPQM3a0b3QRsez6mHw+pNjgnutPh4iPeoqlUZJRap80m5+3DZMp+RT2PKXFH
1JCe3BIcyTkog9KPFjiHRDofVo67q1urDyazydlOTxilpA0TOYszWW+afttPqJowR0y1bMNjLZxz
oOhqtLRxKqkaJa5qLMOmVV6fV73Fz8kad/f4OBznk+x73g9XKi2UopQ3yzyU4HYjJiYYWmAdOCCA
VBDjgcOG60qV9tJDv9DMoc6HbD9DYlLVJWw6Ltbh0RnosXKSUE/CmWHQLha9RCweJGtw44RJDksD
G0YupWbRRyRtqfT3xsrTa2uN1aMt2N2Xmyk5qNGaaUYKhqkDi4OjiJMnFHUsbcqV1Wvi44GVS8Wy
pbZ0u/jZvPFqeG2orOi1FKWceyTsweLb7W7u7tu7ru7u7ttoBbbu7u6oAG7bu7u6SbVV23d3d1Qq
220m1Vdt3d3d3d221Xbbdba23d3d3d3bbbbbVdXbbSbu3d3d3iTiE9c9M9MnwzAeLrTwd3ucEBwh
1vBb2pakTmSS0W6MIfJInV69n21VVVcrtd6upHNzavN6yavq5GDzcE+Lcd7R2LcFGS98h7TdJ7Mz
P+Xe1qoqiqqsKR5LauxvcDWN7Lgxaqh2PqaiYR4NHW2GGqe6mmi82F/fRdCaGJheG8i+GmayrNmi
hhW1KTYsSaKS4xrm3Ocs6solFIbAgUhJUEKiJRJKSIlSSQqSQSSkkIw0fAyWUsn1u8dGSmhFqFS1
S1FOxqwljo7OJSTklTUXVVxQFtZvJTVvOLCW3KFEiIjeS3u0OihvPVIH3oOHpVZJj7KVXMkKakiQ
2QFPJCKSSDiompgtCkFEkUFA6di6Mk4CUmeTxZuxsbHbO92PUbm+WqW8dKrZg0ZvgqlSJMHgdzr6
HI69Krzd/nT4+d4peMMMxZzdOKsnJ8HqOcRzL4MGBPllPVlbhDva3dhxNGMs9mWK8t33dXFl/U0N
GGF296DZzPfqyZtjcZM/ZXiU85J7Sz+Ew1eiPRJYkgmqA5Ewdr62Lc9aMy/PuLPcjB9S5sr4ry9v
pN1s8l1jm8fHF3d3VZNTJ1MDer3dt3ebceD9ezi2T4m//KiTJ6bjrbKUqb/yqSZv5MnAwps9LZIO
1vzae196+dsVjF2wpai1FolbKbZjCONm1GitazCyNazKKiyMMtVlrCKMMsbtm7ubMMoxu5laywsM
MtZVqwwxUurXebExVRRZkKUzpHfoqyZZjZqubarBoS5ZTvpoowmSuhobhBl3nuynCapqrFVSqh4w
8rhRyObydSy1ZNY3b914vFjqUpHRbPtqpyfO0vCwlt61pRYvLbI6UdmWMTCmsrUqmEDVWMLp5b6f
Iz3jutcVSlLOHgnYipGSQWAxSmFa52ml43pA44sHYwJ1kEAGAoAmKBQQsOADGqm9NE1Val2Y28Wi
5znTe0bdJGCi1To/HJOiDH4Ln7EIzTXe2cmi3VG9kGh+j9F5kdTqPzb6VZ2qYSfckDN2Ot6PR9bo
p/4mqTI5GjN8nJl69+/bv9tWuMa66a6E1PlkrZxwSSbKJIE0ZPR3GTD7O/X3Yq8bnW3lOs3L47Pm
k8djg0J1uLknW8jk0bM0WmyiTen+dv2KUMDcV1upbVk5sjyTuNnN0QZns+Zbu25ruikUUjsOVF7m
i0/qCdz6ddV8/8Jh4E4Incm93equgO4w0dEtR1mvpKrNk63Zi3inJswGnq/j+qMmzgj96EYJxMm5
m44fuJmw8EScTz71d73+7ogKcOKFUh8KRdHetY9f47PvOxaDkxo7WZ1v4JqYaNFPVc7lRCSlJ3iS
Ecnm7d1envw8srq8Yyq2GMnjnniZ3WeeeeZM2OpsbFNG85KLYM2a2Te9u4qZNCjM3JLWySTxRjHT
npjGMYxVYXdVS0yeLBZ8diqDfrLqqlK8m9a0PV1ni8IWM2ykoxGnDqurmsetVGaSIiKFTgaE0ZoN
Fspjo92OysYu6xlhhoRZTJ0ToYZbVVPzYaxO45MJP4IkkkGiR+H1JCcXh/W5tjsk6cOWKqWoqyTu
FTCpVtkVWiyaRJ06GWdGcLnqjfUiFDEIWVJTVI5L/GSkT7kEYWyFpEGUtZFS2MUAV4KwwLFVQFA4
UBdAOEHsNaA1mSSfJBqmkSsVn28cs87zzxlna86AlqitWB5kyTJWVC0qEkhTepJLUMKI1kiSRSFS
KIzUTJQnohlEm7DRwQyEwpkyWJD+hQ97kn1Po+oMxJBs826HNRzrosON8SYRNyj3VSqK2u60aOlp
7WZ2WWviU3s1+qaKRDxblDDcOTVoknZO+7qr/Dm+WTNwcnJZhbJkILa7hhhc0cTZO0myOxisY5kH
jGRIwGEYyFKjqpWi2bsZ20FqpkS2VmCmUolmGWDKEYlVKVZvsvHnVNDCq8j1mDo0gxVSpTNsvorf
B7OCNzc+dqqqvpy0cTDBwqehVTaaNZOpq3qm0jqsEmqAnBJUiJ1VAh1PC3bRauNWixnGFucQxJME
sRjSTYsmGZvepAWnwPN9rV4OW/fVqqr2ZHN/sWYpqtaPB11HWYZNy0iyeiklKlOCLDDcUWT83S2a
hH0cP28mUcDtCb3SSBTVPc3n1mjreTJhKmo4RwYby3+z0f4tD0lJBufezSeDM4vzcVvh8m4pubno
Y5sBxerc6HWaDqSkmzYmT1WS+ee6lVb4Ytd2RJIeXAl+T0bvxNJ2K6OJVqYcU3JJsnaXJ7MMwhPh
5AA+acnc5nDKXLFkBO7d0mzTEoEXcmSZihZk7phGYS6aYuc3OVw0YTAKNE0MtGjLvK0GW+FdmWxo
oshWrOCpqrewmEk0SVBbK3aQQRSiQ+KnUzFkJnEhpGlRUUk9i2Hi1ZObR9Pwy1DxiEntFT+VaqaU
4WWCappnIx0daxShXOpRUSeE3eF3N1fprlttiJBGykooUuKkkymeuu1GW1a7JII4axoGikskp2rM
yt46lsGm7ZmZszOY4IoosFVUIKiiqCKqioqCRYoxgoCiqirDFVVViqqgCxVVUFVGCqoLFQWCKgqq
qqp9LtLOvbCHwAoBiquKq5ABVUAAABVQBQlKqru7uqqpd3d6JIPxbjmUbFskFcBTjgfgVPhdDCOB
OVdrbZi2mKxFJJKomhESJiRYNKWhyqkmaTIk6nE1BrITJTIlOzsMKUYSlqUW2WwoyUtk96if2qRs
STynjryvhna8ZZfR9HpSqaSQCHFqf01GrqnmqFlSJ/YUanNtfeoRkWjqTub3FND0R1j72zVhvU7E
U1Xcd1JdSLxbeyeIsOB+qmkT0m41RsUoUOKm0U0RSp2SyWLOKTc4Pk59+0unFd071nrtsBIjh6PC
lqRUriLJ1KtTNOTHlvyV0zzrJkzzwlKhoqZ6KuQJkoxdVa6IkkNCkm6Ok5Nn/k+DKnmpq1kkTqUR
ZvRb7G50YaUzaS6qiJJChhSeKTNmxGUihMOo3zvqVkth2ELvLL7/y3XxZfqW1tYkxGJGGGCpSe4u
XPQ3cK7N94pjFzJmdbsTzKRSXs2NzRubbnzbnSaN0Ek65bSk8Xa/sW76ZslsEU6rjCnexaWqZ4W1
Zsscn7jNkZpbDC3HiT7iPyN7SbObS8XdpEgRaKcfFhEjyhkdj5I6E1VI7n1rD+1q47z397tzdskf
RRPNTeomU7BFLpXq9/QZOiZuBhb/HJyhmVGEVKX6IyUtEm2MQWlWOqxbPfWFChXoSo/xm9Y7C2cO
DCFLn9DrZO7vmCdxTwzd8PwUhqpSi1LYgcFCdbZ3A+mzY+1p3PY3En1vqTk3NwaGLTR5p3byzvtj
LCqBhUZVl4itVmxo1tvY5LT/ApuPOI812e5ytqrNUcfuaVplVX/XltyDvDoUf4R7809JPsip0WUh
zEY9oEviimRCnOZJZ1gineyjqFXboGctuphSoe4meR5haAUiNzZqwyNynWpE3lE3bTdtntWMUtjP
Gw2zrjZYNvBrwy+x5ttt6VUhJ27Riy0LMkyc8gbtpaSEloEIz6c8OpJ8Xof1sJ7kSSSDc0bHcWiT
DrczkTRhkg7HWtJxUdxTexVV9Ej7GjOlUWkzarlty2y03sPBT83fjxVdXd3a7qryNjviEHpt7tvR
mIgSIrKDBMRVQDvEidf9DABh68D7DzqSOF2lVJF3anJSTm6mzkzdETHLS7tSug4H9DQlmjZN7xUW
e1n9DPyjg0u1XV0q12qcnnioqh2+qrHBnsZa1XWRnSYSn6zQ5uynNP0YcX+lSWUh6udK7VtxlMPJ
udC0xKGjk0UerZSUTxTmdGhsW83oot3u50Op6oU0dZJOLrPAbFFI9eTJs6lMGOUoY7VTr5r7Pn5r
vFlM25yclEk7UzT9UnBzMO34ZX4U+CsUxlebNSkqEN1V5zJ45CTilO1FRwM9CqKdzfUqokkRGZk/
V5usycO8tF2mXW0eBonfTRTiq1yHwHg1VFWHr3uhzSBv/tO43p0TuYW5sk7DJ/ObbtGUdzCqqqm5
WbN6qopyWmqzyaMME37rXe57OopQ/xE5mrC21O1R3pL5ricnq+WTtxVU2eCnMz/y8mR29yzTwV9a
aPeZr4VXsW0yLD5k969aqqqpTNEkkgzetW9BFF+CjNRNx4M2WfdrdX3+JJkaqTREnWp4vWs6Dqpt
h75drmwtSrqtUSLW5mbQpo6aKp/E2+puZOB5uZJ96k9ednKU6HBJbDxT7yTxNXFqnWoW8aqiww/u
WYdRLe3l1Kpy7MYKvGVMM0yYRaezEgkwlLbI5oHO27bfC8/4Wuba407iQNGuffyW8/sSZbnL3P5v
N/iSZJ8e8s9XRG52B1pSKP8aJJJBu7Tyfe13vFPokJqg8R7TlbHS8hNH43f+q1Vttttrxbe9ljOL
TVs6g+KruvhwpFJI7Kd6YVdyj6lrZSSUpbbm0kxTGYuN2WUyZJJkiy8eK7/J8nH0XK72Om9WdzNN
6lNbbeabQq3xtaFEMRZGMEMJJzG+kSA4auCQlo8qktJKZZVa8OGGufLxyxTfastObozu68HFtrVr
xWLJZlKlmVtoJCQmenJ8va22222222221VW2223JbbbagACAqqgVtttyWqq222gFtttC0LbbbbbV
VQBVZeMYxjEONNJTu2iqM25L+nS37f75FJPfs8njvT6BskdwpVKopTudiJ1ImT5DrYS1ClLUNDqs
WOstTUOMNOTI9H1Jk/m6Dco0W2n5qLn9bm5HFOb7mHWjrw25mqW6JgdqnzOj8W8GRHc4m84OjM4q
Uzq7qr5XeLrGMIwwspSkzZOtmZjNI/FRsYdqWnWw9zlps3qZ1XFzbtwtlwaGy2Dd76WZ8cuKkgIp
JJIWFCFLJIipUkJI/GkiSRaYUi/g6mdLO1ySxj82TZ9rk3O+f11JNt5RrFcW51sfVHWkhnTrUwpb
gsHU27Fcftb3d6K6/d5y1EWjVLGNHc7LRq9nBgE8aqupRvOw2fUbuZXB4KU5+VVcvLPGLxbflpVd
kziSObo8GbVqqUt3seEKc1I2UtxayTVkTLxf0qMOKmSnBEjVco7TjVFVN6xhKcoaQrDWep91sZaN
SyqqlWSniffUmEkw4rfjP4rTmZM3FuUvt0TZRN61tjMbXXI+l8TgcCG1NvRPiq0tWxZSVTzaG86J
7Ewn4pA5xu4XV2/LetMOLuTRwThvR7tevuxeMaLTNSdS5C1BW5+iCi4Zv4ktahg9eyI3skcqiL0L
PRqknVIeyUkm5SJIIdaT3upHbKGXJxfW0NolVPgn9K8MFFqm42U1fKSYSPe63hCTo2fttV3VaKG9
LZtFKUocmbCMJfiqJneHcpmdJIc2RNWHfMI/EqRuivgYYWuZZDCutUSdSpxGzeWwicUBh+9k2kqq
HVvuNclVLyytNNFsYi2mxaTOHKk0SaO7VrE0kq2Itk1WMFmRglOQYZTJDgHFOxr44xdXmfvcODxk
jM7kUVukknYn7sNw+Jz3vtfsfHt7eLVa6clGClqYYYGCMP2u8mpDxSE0mfX+V+6k/xsGrC35Ke5g
dwSR5IiIPHeb1VVVz+jnWQp/cKD/4FO8hw53lwc7kNzVs8OtY3M2TXRe1lzVTnuZySYcpan0Y3OW
bNk/BzcO/Oq1Xb5uTc3TJpS+FtmHVgB0HQeEAWY4iJ5IQjgI75JV4N3Qh23qUws7GQQk6q6pOEid
FCxf0s0M2zWVMYEUOMs6uGV4umH6lyKLE0IvW8sFMh9jLAYxsEdkhsMTCUFUMRUBiAoTy3KC5OUd
paxLaLJum75anYUliq3alY7P1C86Ufe9js6Z5bq7cZdeSOikfv8XFq6HpwaqKQG5aNFOxFOqkmSS
5zZspGmSpauSu6uGalT2S5jwy0hIHr8EW0Au2EzCQBhSYTMfDw5FczOp7kcmdTv3gSNzM7zgkFnQ
FmWOBnnJgZyJiRrJYsaymK5iuUlrAgBMpSQrIrhDMTEzFjKSmUlMkYZAxtsiuJkFylrIrkiJExIl
rKSlMBAlI1lJEiRIrhwsi4ccbcMLWGFFrLVq1JLXIiTAwIEpaykSIkSJElrKRM7jknXWl00nAdUC
hzeLyatNJKhhGTZNkvhM5niAAB7CqqqqqqoAgCBgAKqgCq5EAAAxu7u6ADG7urizLPbLMyxLJGFR
DvUiNiICKTNIhLFSBikJD+DVPi5/JHe01n9TqPikDDvSB5w8buHWrwO8xJOxeJYqmFwpKKUyd3cy
NXiZtKZMKey2DJk9GHrqjNi09kezkfY68Nh5Z1VPg2Qa1VTtQj2SE9vQyTuUWkgeZSzmneoSdE49
nV5Ku2M07Y9k80m5B/SJ9rk5qTtqqqKfFtI3utPJ4J5H2+De3up4PZrbsyWcWPSqwyM5KUp1Nnhd
VfB0I1GFUkhvW9ncz9nJ1NInN1LJN5qWhqGjyqqjNTXl5W9waTc5bb2O9V61Q4RVJ0KjafHbpPV7
UqlsPX2Vb3di06ni96TJqmY7nY7E9zjPd3PBE7drp9+++us87zplnaQyUUiSSFkNVjCyohUFAlG5
oQVyHKzCSSJMnQ72y2W2zxJqnOlTLc97GH9qlqU3qfCJho+KZ8GjBwb3Y+CfCrFWqfq6mzlpKsiq
rhdLxOISd5yu5l5VVveYYMSYWPihG2+I7lQb0j5pCYSdpufYrRkbji2ROpAUnUo4HfFrYfi7DJSU
HT9Wj3Ik1XSqcyckPNk5/VV3Xd73Fg+tESd63ccIo4hvj4DvGSlGCfI2Ukwa4pvVuK6nsfCajo4d
itz5iOx8Uw+1tr6XV0yfBzKdGEH5nOmWjohzti2W+FlMVcMMKwlHh3Sa3iZ93xuVds2qDyYWUwp9
tC2FFS2xUjCiv+CsqmW1wtreisCZkpIzyi5GlMCWGJKRtZCQspBksW1ZHuZtEMHKdjRcknHJfBps
8L6YxheLWvFysXVYrZo9nY1cTm0dZ3RBsyMOi5Ik0YdeRg1OfUqIkCNVKpS3AmEMspg1lTV0W3gF
WbNLLVq0Bxno6mZop8lTdx9mZuSRdHBPj/WhHFPvZoe8Sj8EhPwfyTePg8nR+90XT7W89nosmdHa
wws81l1hWKlMQukTJi33INWj4r8fhXB1PZlnd/lK0a1eWo4NmFsZzvk3WwNgp7mGe5bJSJKTR81G
IcAjWkcJel+galA0BBmk1rEbQpxYVwQz2bHAgZzuxtdkZGJFEcSHZ/TLx8xQq3RRmIxCwOILUJ8x
jcjfTOJ/C7Yk7QTOwqOFVuKiqjl2kyoE1FQgiZen6RHd+JZdlkraCxGKqPhEQUZyzsHVkVqG26Z7
RllNsx4nSpvTU0sc8s8YacarFYkEmTkrIoo5Mmaltt2WDhjOJIQmzITOTJ42GV5LN1iWjDRYsSME
NUu4VhXCrCEmpy6rjhBtEskWpVKRMRCKEVtnDpkne4cAi3Dgq5KINaAoAzvksZnhO+c7xZbQ2y2s
lLbbWaGGm7bbsks0qpgAAqqAGaFaqYAoYFttvEzxzM4ncTwlhO+SYkkCSHWaltxqUuUU3LbFsmDi
yGGG9Aw3sltzVaRszLUytLUlqKapRZxMCkjVm7HckaZKtPfwqtDcdCb1MNZobLjTRM3eUR/cwd3f
nVREalejUkaGHJohkQ3lNVLPB1OLOlNpVSCWqiJMEpNjncyM1gopWxmTNmw0TJGHZUqlUqu5K0WF
sOCbXCe33wsssMnCxCspMDKsTAlMskxVuFGLbMzZbXEGdbi3Lwrm7YeCi5tS+am07qrRmgqZN5pJ
SlORrEOBYk8nvLid+SaL3GW5vurLFtiqhJQqcnamHWlRGbjq9Ui30S0ww5gnY80bPsbuVKrVEklB
alm0hq2PJ1IyYpXY0azJ1SYML3qPr2MnMaZvA6h1tYjpHBRuMngwzc28iQ3N7VksMB64Tr4A2QAo
IsYfQeoZBD6gNIoKyAhiKcWdxaicsVVpapN8tJJFyhJJCowpVUtCSQxxQzZtJbhqjJKfc2LQ1olU
jekw4zU4EJxcTeZNGHpyOGyn3NTg2dSIHF4OwWk3HqpJqX2bKmOm5vRTZQqs9HqHO+m3gjN2BLgF
MgCGg4Oc4I4sFMmU5mDrblqRsda3Q4skwO9TZaYd54NyYNghzpVJJ4IKJSJQltzBxdTcuZ0wjmwx
7PbuX+5SebRxchboknitE4J/UpMkmjJNHE4GbCh0dt06LUZ28HNuqqzWzZutxUWy4Jm7HFspWyl3
VVdaO1wJ9GThTCpDJPAwJE4ZPjT0J/aZPxVxG9ow5p1NjINjgciWbvE1MHGw6UpteerXR0aWlq1a
VXucjcPGlRSFRGfQj4HUtm62rehMnphIzsxH2K2I2mZN2Fmez5g8yqgBgCqpIRVXFVVVVVVVVVRR
VVQAiKqqtmZMySTJ3uxqOKk951H1lG5uzqSuUT2K9To9DRnF6pdrvqyrw617+dLUYFj0iuUzrDeI
OD4tynUlNG5lFH+JR3MGTNy6lqHKVtSPztUkVUSOxmOpxBo1qLUiOUkeBvnGcg6VRvJD1q2Oc7Ue
Zc+opbNvf8Fu96ApzTihyk/1qPBo9Nd9w+9aq806JDT3q7DLem5HE5kwqyddskqbWjVONloYptPa
sWkNE0eBMk5m5kmxkXIp8J2fYuk27NsmoEMk+4VTeLHiyYYDrSZRMOEkebNvUt6osG1z9tSqS5Nq
ryI3NLjriT31Bor8UcmTCOp1pYN6ljelG86LeqVhUTzZ4LjGWqtniq2LbYttnX0PAe5WyRxno8Tc
8HFOjpLJKT0eDJhI8Lc3WgPASTY8n3KmvnVd4k8G9k+xwebOXld3iXWFqqqrFVQiqqgRRWKqowhA
UVVWAiKowwRVVVVVVgAqqqqqqqEVVVURVVVVYAAqqqqCqqxAFbu7u7u7u7u7vNyHmQmzehopGSdx
6GaaqUlI1iQ7xvnUow5VdN2L4d+cYmk0eHjj25IZZOJIojhCJHO04tkCJ1JIsO8eQni+j43pT/i2
a+tzPjenw8f4ngQHZ0ncw/uaniwzSieB5v2PM+Bl2s59l8YbP4okkkHR7d1Vm7sMUrRzGz1U4UqK
Psa61XyRJJIN5uR2FKqpdLWtq6gxhwRP7H5phkJvUjRKKTVkYO3EhzWt8Te00Sk2ZGY6iHNSE1G+
SihatiVKsFqNr3ub3S7E1VN7e5Wk41N7Q5P6PxD4vBpJs2Rl1qJaFutvNT+S/RWHU+1zS2T+lkH+
HJ4JwcKVRzeq8eC762J97LKq5O5CPTR2ux2/2h29369rs2e+ouOueWe77R5HDNy6WGvvbLPvITgk
4OeNC3WSSMjVObiyZ/g5oRRod4fV7fikDL7w3o9HM77xUteV33cRPB+RZ12kXRuTyup7bveCftGS
dGDjKolVDsbzzyWzPBHGz2SjceT5JO77w3t7Q2W+uk35s37cQZOEpFffcpTRGja8qQ5lN84bLXEj
gRp5LGx4tW9anhpuTkkJ+Lc23qt9SfPi2SmTqNEw3PFJ02U2RJJIP6FJTw4pbHU75ss3DyMgQGdv
W2TSQ2tm2OQhkJFWfPOXVbvv3ElkrpqRiiiiIwMAYowyDDAltZ2XPwCT76RvbWkWo7z4IPFMQ3qh
nKbej6PsRJJIPtZoavmgvZEkkgrhH5NzDrVydT4ncd5JNXo6o6bZLZbLZbuaoDe8W6JyO5Hi3pCb
z2UST9GrWQfhxcHtb8qcm4E+b3pyeh79U76fcp7ninA4UgWNE76tmQ5FSJ0LNHV2J1FqqqqijDov
zwu7kPFCMu/JOjd9qMmPktm+0YjDNUpQpam/D86NGjTVqzZtpO6bLZkJ1OY93rqB2aFiQhNHITdp
QjDDdllnf6cndOJJzz3dNEtkzuAybM9017/ejN5kkkkFGjyW8+iJJJBb3Hut6okkkHUiSSQfD83N
2E9yhrDkjR3u5o0YdxMjQz3pPVMMp6rU67kEm5sjyccmifFUjvd70ezUk/motwJuM2S5yNyVQ6JZ
cexSJPvpHzbEmo95wsJ4Oqu4nvyRHP6biVSSeSyEkZuasokmKJILb1EpJ9rb2NUmnueiQPsb/X9H
Libn1ut6uLX3iJk62k81VVUKUkl0m59czRDft8EIyZGkdjh77l3cWqlbh7kI+DNBjWqmaFeyDikJ
TDolMjJJvSWmb5JCa6s+pCNPp85wSE//4u5IpwoSAyNkRAA=

--MP_/ByHHwKh/.YaHjmiFc8hQDt/--

--Sig_/3aNY3EucdUCEh31=b3MEVzY
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlqoI64ACgkQ5xo1VCww
uqVqvAf/dHMacbdHNm0OuBqbRsEzH8FpFUGYcw84u9iSUJOAlSW3wrBc1kS/JVMD
m+ApWEbylvLt34ar3dEtBiKGIi4Mue6mGrsAcizqFlsYISJo7F+MKnZx3jDh0gb2
gqTtpp7p3YZGcQpMzzmz2KEF40NO8PMWxD8ESDHQKmzIks3NePfV9DAwBWUX/9qq
B0N7eO3cRYNxL7f4o8EFx9MfZQcZCGQqKoLnpIEEhWuBKRkC5M4uSEFDsqXf1RgQ
SSs7WA+IyeT4W8njEXLbnmmGD3dYg2OnOhBVL5bwwhqvzpbF7sjB60zxgnqtF8sz
01Swsb29wkfHaQMYIx9AJYukCoPG4Q==
=b/2o
-----END PGP SIGNATURE-----

--Sig_/3aNY3EucdUCEh31=b3MEVzY--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] Keyboard detection before =?UTF-8?Q?=E2=80=98cryptsetup=E2=80=99?= runs
In-Reply-To: <20180225114557.816-1-dannym@HIDDEN>
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sun, 18 Mar 2018 15:04:01 +0000
Resent-Message-ID: <handler.30604.B30604.152138539429209 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: 30604 <at> debbugs.gnu.org
Cc: Danny Milosavljevic <dannym@HIDDEN>
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152138539429209
          (code B ref 30604); Sun, 18 Mar 2018 15:04:01 +0000
Received: (at 30604) by debbugs.gnu.org; 18 Mar 2018 15:03:14 +0000
Received: from localhost ([127.0.0.1]:40272 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1exZq4-0007az-7r
	for submit <at> debbugs.gnu.org; Sun, 18 Mar 2018 11:03:12 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:54062)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1exZq1-0007aq-1c
 for 30604 <at> debbugs.gnu.org; Sun, 18 Mar 2018 11:03:09 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 14B7712144;
 Sun, 18 Mar 2018 16:03:08 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id LgJO4LfYHAja; Sun, 18 Mar 2018 16:03:07 +0100 (CET)
Received: from ribbon (unknown [IPv6:2a01:e0a:1d:7270:af76:b9b:ca24:c465])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id D644E1210F;
 Sun, 18 Mar 2018 16:03:06 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN>
Date: Sun, 18 Mar 2018 16:03:06 +0100
Message-ID: <87o9jlo28l.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Hi Danny,

ludo@HIDDEN (Ludovic Court=C3=A8s) skribis:

> Something annoying is that my external USB keyboard doesn=E2=80=99t work =
while
> in the initrd (when I type my passphrase).  I can see that it=E2=80=99s d=
etected
> early on, before I type my passphrase:

While experimenting with this on the bare metal, it became clear that
it=E2=80=99s a timing issue: the keyboard is detected right after the crypt=
setup
is displayed, so =E2=80=98load-needed-linux-modules=E2=80=99 didn=E2=80=99t=
 have a chance to
load the relevant modules.

Similarly, if I boot with =E2=80=98--repl=E2=80=99, and I manually type
(load-needed-linux-modules =E2=80=A6) from there, then the keyboard=E2=80=
=99s module
gets loaded as expected.  That=E2=80=99s because the device showed up in the
meantime and the kernel created a /sys entry for it.

In essence, we want a mini-udev and something akin to =E2=80=9Cudevadm sett=
le=E2=80=9D.
Merely calling =E2=80=98load-needed-linux-modules=E2=80=99 once isn=E2=80=
=99t enough.

One way to do that would be to have a separate thread that calls
=E2=80=98load-needed-linux-modules=E2=80=99 as appropriate.  Ideally it wou=
ld use
inotify on /sys like udev does, but a poor programmer=E2=80=99s version cou=
ld
simply call =E2=80=98load-needed-linux-modules=E2=80=99 every half a second=
 or so.

Alternately, before passing control to user code (pre-mount actions,
etc.), we could do a =E2=80=9Csettle=E2=80=9D kind of thing: call
=E2=80=98load-linux-modules-from-directory=E2=80=99 every 0.5 seconds until=
 its result
is the same as before.  There=E2=80=99s still a risk of missing devices, and
those devices will never show up later because nobody=E2=80=99s monitoring =
/sys.
But then again, =E2=80=9Cudevadm settle=E2=80=9D must have the same problem=
: it can=E2=80=99t
really know whether things have settled, I guess.

WDYT?

Thanks,
Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] Keyboard detection before =?UTF-8?Q?=E2=80=98cryptsetup=E2=80=99?= runs
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 23 Mar 2018 13:03:02 +0000
Resent-Message-ID: <handler.30604.B30604.152181017412202 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152181017412202
          (code B ref 30604); Fri, 23 Mar 2018 13:03:02 +0000
Received: (at 30604) by debbugs.gnu.org; 23 Mar 2018 13:02:54 +0000
Received: from localhost ([127.0.0.1]:48813 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ezMLN-0003Ai-IY
	for submit <at> debbugs.gnu.org; Fri, 23 Mar 2018 09:02:53 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:55762)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ezMLG-0003AR-HL
 for 30604 <at> debbugs.gnu.org; Fri, 23 Mar 2018 09:02:47 -0400
Received: from localhost (178.113.247.207.wireless.dyn.drei.com
 [178.113.247.207])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 7DB903360156;
 Fri, 23 Mar 2018 14:02:44 +0100 (CET)
Date: Fri, 23 Mar 2018 14:02:31 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180323140231.1c96615c@HIDDEN>
In-Reply-To: <87o9jlo28l.fsf@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN>
 <87o9jlo28l.fsf@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/AUxA6/_mgeP._IxBi/m+hEl"; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/AUxA6/_mgeP._IxBi/m+hEl
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Hi Ludo,

I thought about it for a bit...

On Sun, 18 Mar 2018 16:03:06 +0100
ludo@HIDDEN (Ludovic Court=C3=A8s) wrote:

> One way to do that would be to have a separate thread that calls
> =E2=80=98load-needed-linux-modules=E2=80=99 as appropriate.  Ideally it w=
ould use
> inotify on /sys like udev does, but a poor programmer=E2=80=99s version c=
ould
> simply call =E2=80=98load-needed-linux-modules=E2=80=99 every half a seco=
nd or so.
>=20
> Alternately, before passing control to user code (pre-mount actions,
> etc.), we could do a =E2=80=9Csettle=E2=80=9D kind of thing: call
> =E2=80=98load-linux-modules-from-directory=E2=80=99 every 0.5 seconds unt=
il its result
> is the same as before.  There=E2=80=99s still a risk of missing devices, =
and
> those devices will never show up later because nobody=E2=80=99s monitorin=
g /sys.
> But then again, =E2=80=9Cudevadm settle=E2=80=9D must have the same probl=
em: it can=E2=80=99t
> really know whether things have settled, I guess.

Yes, but udevd continues running and monitoring /sys anyway - so I guess
they don't really care (if I wrote it, I'd start up the monitoring first
and then traverse /sys for modalias - and make sure the modprobe is
idempotent).

I have to say what we have to do is much more complicated than I thought
it would be - and I kinda regret starting this patchset.  I didn't
want to make it less likely for people to boot than before :-(

I suggest we find out how the other distributions do it - if they do it.

A small bit of research shows that:

- Busybox uses a loop with timeout to try to mount over and over again,
depending on bus type [2].
- Alpine coldplugs twice [1].
- Fatdog has a "waitdev" boot parameter that specifies how long it sleeps
until it tries to mount the root.
- Redhat mkinitrd has an mkinitrd option like "--with=3Dscsi_wait_scan" whi=
ch
they use after they saw a modalias starting with "scsi:" - or add the
kernel option "scsi_mod.scan=3Dsync" to the command line [3] (but they say =
that
this is unreliable now and one is supposed to use udev inside the initrd).
Not sure what they do for USB.

The Linux kernel itself has a "rootdelay" parameter which
was specifically introduced because of USB devices that took 15 s (!)
to show up.

All in all, we have alternative ways to continue:

(a) Drop this patchset/feature entirely because it's too unreliable.
(b) Monitor /sys using inotify in an extra thread/process.
(c) Include udev into the initrd and have it do its thing.
(d) Monitor the netlink socket in our own thread and play udev ourselves.
(e) Find out how to, for each bus type, detect when enumeration is finished.
Find out which buses are there.  Wait for them to finish enumerating.
(f) Always modprobe usb-hid first, no matter what.  I think this would
become a whack-a-mole thing fast.

I'd prefer either (a) or (b) for reliability and simplicity.  WDYT?

(inotify is Linux-only, but so is /sys/devices :P)

[1] https://git.alpinelinux.org/cgit/abuild/tree/initramfs-init?id=3D9154b0=
d9b7251cca900f9e834ac9af9ae2ae61d9 (scan_drivers)
[2] http://lists.busybox.net/pipermail/busybox/2015-March/082688.html
[3] https://bugzilla.redhat.com/show_bug.cgi?id=3D466607

--Sig_/AUxA6/_mgeP._IxBi/m+hEl
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEzBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlq0+ucACgkQ5xo1VCww
uqWjAwf/ShXF09RtyD6sKDqunwq6f4RVl1YCwD+UXe4YpocIT2o3tmomD4Fo4ZI5
tXARLYRQLOl0K43+kXiwv2X7LHcFwkw8PSWMG6DoP/qoq9caOFUs5dS/XI/i/dUF
AUwck47T9kiEblAJi+rFL2Rkm2HSmAYOkG8nfCg9OmMFWOhIyuObA8YPsL1G+Qb7
uI+p+miA0m9l3QWCNS2eIO5EWKl6gWwHOHqWbyO/s+R6PeAC+vpdLkpCE/KlLgV3
P75p0mx+QMkCagcCfZsY3b4nnUOH3A63xEJ3nPqV7o6XrsND1XNVsnhFcot3bEc6
zdQZsljL1SHX4WcTLaFSBp2B3kEyoA==
=YjRi
-----END PGP SIGNATURE-----

--Sig_/AUxA6/_mgeP._IxBi/m+hEl--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] Keyboard detection before =?UTF-8?Q?=E2=80=98cryptsetup=E2=80=99?= runs
Resent-From: Danny Milosavljevic <dannym@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 23 Mar 2018 15:08:01 +0000
Resent-Message-ID: <handler.30604.B30604.152181762924105 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152181762924105
          (code B ref 30604); Fri, 23 Mar 2018 15:08:01 +0000
Received: (at 30604) by debbugs.gnu.org; 23 Mar 2018 15:07:09 +0000
Received: from localhost ([127.0.0.1]:49888 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ezOHd-0006Gj-C0
	for submit <at> debbugs.gnu.org; Fri, 23 Mar 2018 11:07:09 -0400
Received: from dd26836.kasserver.com ([85.13.145.193]:38312)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <dannym@HIDDEN>) id 1ezOHb-0006Ga-Nc
 for 30604 <at> debbugs.gnu.org; Fri, 23 Mar 2018 11:07:08 -0400
Received: from localhost (178.113.247.207.wireless.dyn.drei.com
 [178.113.247.207])
 by dd26836.kasserver.com (Postfix) with ESMTPSA id 1F364336108D;
 Fri, 23 Mar 2018 16:07:06 +0100 (CET)
Date: Fri, 23 Mar 2018 16:07:02 +0100
From: Danny Milosavljevic <dannym@HIDDEN>
Message-ID: <20180323160702.45fa3fe5@HIDDEN>
In-Reply-To: <20180323140231.1c96615c@HIDDEN>
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN>
 <87o9jlo28l.fsf@HIDDEN> <20180323140231.1c96615c@HIDDEN>
X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.31; x86_64-unknown-linux-gnu)
MIME-Version: 1.0
Content-Type: multipart/signed; micalg=pgp-sha256;
 boundary="Sig_/0MBcyLajkJ24wfPpyTJ+vA."; protocol="application/pgp-signature"
X-Spam-Score: -0.7 (/)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -0.7 (/)

--Sig_/0MBcyLajkJ24wfPpyTJ+vA.
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

> (b) Monitor /sys using inotify in an extra thread/process.

Oh - or loop { load-/sys ; sleep 1 }.  That's what you meant.

--Sig_/0MBcyLajkJ24wfPpyTJ+vA.
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----

iQEyBAEBCAAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAlq1GBYACgkQ5xo1VCww
uqVK/gf4iqTdvsTHWIySk+mGwEXRxx4/kTsuwGqybxyXmjgb7qVbcRCa8+8InGkS
FhAfpyYGRf584fnU8iLjDmVgt4dHvg1dI/W+icTH3hmovn0G8/iX9fsTtp/IkkoY
tE9PQx1sCvZdZBqxSI8nT/s7BWWBVMwt9KUeF9bCdXS+kESU3f8YygWiaVX0DpdV
q2iJsv8tCn6g12pojA/IMDZ7j14kGitU1Vt0TwBPP44cJK8Ll9lN87CkNjOpDvaS
woAgte3ZHCV51iEcRGAiMJtW8WfurtXdn2lh5Zd3PX83/c/4sb2DrkMRUOy7kV0r
o6peRbYCRcW+svANv/u1r2Wvl1oM
=duha
-----END PGP SIGNATURE-----

--Sig_/0MBcyLajkJ24wfPpyTJ+vA.--




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] Keyboard detection before =?UTF-8?Q?=E2=80=98cryptsetup=E2=80=99?= runs
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 24 Mar 2018 17:08:01 +0000
Resent-Message-ID: <handler.30604.B30604.152191126915681 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152191126915681
          (code B ref 30604); Sat, 24 Mar 2018 17:08:01 +0000
Received: (at 30604) by debbugs.gnu.org; 24 Mar 2018 17:07:49 +0000
Received: from localhost ([127.0.0.1]:51668 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ezmdx-00044r-Bo
	for submit <at> debbugs.gnu.org; Sat, 24 Mar 2018 13:07:49 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:53924)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1ezmdw-00044k-4R
 for 30604 <at> debbugs.gnu.org; Sat, 24 Mar 2018 13:07:48 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 84D1A130B9;
 Sat, 24 Mar 2018 18:07:47 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id EbmF6rqkig_q; Sat, 24 Mar 2018 18:07:46 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 8938D130B6;
 Sat, 24 Mar 2018 18:07:46 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN>
 <87o9jlo28l.fsf@HIDDEN> <20180323140231.1c96615c@HIDDEN>
 <20180323160702.45fa3fe5@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 4 Germinal an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Sat, 24 Mar 2018 18:07:44 +0100
In-Reply-To: <20180323160702.45fa3fe5@HIDDEN> (Danny Milosavljevic's
 message of "Fri, 23 Mar 2018 16:07:02 +0100")
Message-ID: <87po3tjtb3.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Hi Danny!

Danny Milosavljevic <dannym@HIDDEN> skribis:

>> (b) Monitor /sys using inotify in an extra thread/process.
>
> Oh - or loop { load-/sys ; sleep 1 }.  That's what you meant.

Yeah, though we wouldn=E2=80=99t know when to stop, but if I read your mess=
age
correctly, nobody does.  :-)

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] Keyboard detection before =?UTF-8?Q?=E2=80=98cryptsetup=E2=80=99?= runs
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Sat, 24 Mar 2018 17:13:02 +0000
Resent-Message-ID: <handler.30604.B30604.152191157816128 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152191157816128
          (code B ref 30604); Sat, 24 Mar 2018 17:13:02 +0000
Received: (at 30604) by debbugs.gnu.org; 24 Mar 2018 17:12:58 +0000
Received: from localhost ([127.0.0.1]:51673 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1ezmiv-0004C4-UJ
	for submit <at> debbugs.gnu.org; Sat, 24 Mar 2018 13:12:58 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:53978)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>) id 1ezmiu-0004Bw-9O
 for 30604 <at> debbugs.gnu.org; Sat, 24 Mar 2018 13:12:56 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id B70B11184B;
 Sat, 24 Mar 2018 18:12:55 +0100 (CET)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id vvmMvJ9da-Dn; Sat, 24 Mar 2018 18:12:54 +0100 (CET)
Received: from ribbon (vpn-0-27.aquilenet.fr [IPv6:2a0c:e300:4:27::])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 9D82D116E8;
 Sat, 24 Mar 2018 18:12:54 +0100 (CET)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87h8plkkkc.fsf@HIDDEN> <20180312221541.1886-1-ludo@HIDDEN>
 <20180312221541.1886-5-ludo@HIDDEN> <87fu54fjfj.fsf@HIDDEN>
 <87o9jlo28l.fsf@HIDDEN> <20180323140231.1c96615c@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 4 Germinal an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Sat, 24 Mar 2018 18:12:52 +0100
In-Reply-To: <20180323140231.1c96615c@HIDDEN> (Danny Milosavljevic's
 message of "Fri, 23 Mar 2018 14:02:31 +0100")
Message-ID: <87h8p5jt2j.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Heya,

Danny Milosavljevic <dannym@HIDDEN> skribis:

> I have to say what we have to do is much more complicated than I thought
> it would be - and I kinda regret starting this patchset.  I didn't
> want to make it less likely for people to boot than before :-(

Yeah, I had a nightmare where I dreamed of all the bug reports due to
devices not showing up quickly enough.  :-)

> A small bit of research shows that:
>
> - Busybox uses a loop with timeout to try to mount over and over again,
> depending on bus type [2].
> - Alpine coldplugs twice [1].
> - Fatdog has a "waitdev" boot parameter that specifies how long it sleeps
> until it tries to mount the root.
> - Redhat mkinitrd has an mkinitrd option like "--with=3Dscsi_wait_scan" w=
hich
> they use after they saw a modalias starting with "scsi:" - or add the
> kernel option "scsi_mod.scan=3Dsync" to the command line [3] (but they sa=
y that
> this is unreliable now and one is supposed to use udev inside the initrd).
> Not sure what they do for USB.
>
> The Linux kernel itself has a "rootdelay" parameter which
> was specifically introduced because of USB devices that took 15 s (!)
> to show up.

It=E2=80=99s a kludge fest, which is reassuring, in a way.

> All in all, we have alternative ways to continue:
>
> (a) Drop this patchset/feature entirely because it's too unreliable.
> (b) Monitor /sys using inotify in an extra thread/process.
> (c) Include udev into the initrd and have it do its thing.
> (d) Monitor the netlink socket in our own thread and play udev ourselves.
> (e) Find out how to, for each bus type, detect when enumeration is finish=
ed.
> Find out which buses are there.  Wait for them to finish enumerating.
> (f) Always modprobe usb-hid first, no matter what.  I think this would
> become a whack-a-mole thing fast.
>
> I'd prefer either (a) or (b) for reliability and simplicity.  WDYT?

Same here!  Sounds like (b) is something we could easily try, though we
won=E2=80=99t know how well it works until people start running it on the b=
are
metal.

I can adjust the branch I have to do that and push it for people to try.

Thanks a lot of your feedback!

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] bug#30922: LUKS-encrypted root fails using device numbering, needs luksUUID
Resent-From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Mon, 26 Mar 2018 13:38:01 +0000
Resent-Message-ID: <handler.30604.B30604.152207142926037 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Jan Nieuwenhuizen <janneke@HIDDEN>
Cc: 30922 <at> debbugs.gnu.org, 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.152207142926037
          (code B ref 30604); Mon, 26 Mar 2018 13:38:01 +0000
Received: (at 30604) by debbugs.gnu.org; 26 Mar 2018 13:37:09 +0000
Received: from localhost ([127.0.0.1]:53748 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1f0SJA-0006lr-O0
	for submit <at> debbugs.gnu.org; Mon, 26 Mar 2018 09:37:08 -0400
Received: from hera.aquilenet.fr ([185.233.100.1]:41000)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>)
 id 1f0SJ6-0006le-Gn; Mon, 26 Mar 2018 09:37:05 -0400
Received: from localhost (localhost [127.0.0.1])
 by hera.aquilenet.fr (Postfix) with ESMTP id 5C63812388;
 Mon, 26 Mar 2018 15:37:03 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at aquilenet.fr
Received: from hera.aquilenet.fr ([127.0.0.1])
 by localhost (hera.aquilenet.fr [127.0.0.1]) (amavisd-new, port 10024)
 with ESMTP id sqtncgtjmxpE; Mon, 26 Mar 2018 15:37:02 +0200 (CEST)
Received: from ribbon (unknown [193.50.110.93])
 by hera.aquilenet.fr (Postfix) with ESMTPSA id 1A24E1216A;
 Mon, 26 Mar 2018 15:37:02 +0200 (CEST)
From: ludo@HIDDEN (Ludovic =?UTF-8?Q?Court=C3=A8s?=)
References: <87tvt5dgsa.fsf@HIDDEN>
X-URL: http://www.fdn.fr/~lcourtes/
X-Revolutionary-Date: 6 Germinal an 226 de la =?UTF-8?Q?R=C3=A9volution?=
X-PGP-Key-ID: 0x090B11993D9AEBB5
X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc
X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4  0CFB 090B 1199 3D9A EBB5
X-OS: x86_64-pc-linux-gnu
Date: Mon, 26 Mar 2018 15:37:01 +0200
In-Reply-To: <87tvt5dgsa.fsf@HIDDEN> (Jan Nieuwenhuizen's message of "Sat, 24
 Mar 2018 09:22:29 +0100")
Message-ID: <87efk7dkle.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-Spam-Score: 1.0 (+)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: 1.0 (+)

Hello,

Jan Nieuwenhuizen <janneke@HIDDEN> skribis:

> After booting I get
>
>     Device /dev/nvme0n1p1 doesn't exist or access denied

This message comes from =E2=80=98cryptsetup=E2=80=99.

The =E2=80=98init=E2=80=99 script for the config you posted does this:

--8<---------------cut here---------------start------------->8---
(boot-system #:mounts (map spec->file-system
                           (quote (("/dev/mapper/guix"
                                    device "/" "ext4" ()
                                    #f #t))))
             #:pre-mount (lambda ()
                           (and (let ((source "/dev/nvme0n1p1"))
                                  (use-modules (rnrs bytevectors)
                                               ((gnu build file-systems)
                                                #:select
                                                (find-partition-by-luks-uui=
d)))
                                  (zero? (system*
                                          "/gnu/store/v5r0dx5v08847rcy033ky=
ish6m3b3621-cryptsetup-static-1.7.5/sbin/cryptsetup"
                                          "open" "--type" "luks"
                                          (if (bytevector? source)
                                              (or (let loop ((tries-left 10=
))
                                                    (and (positive? tries-l=
eft)
                                                         (or (find-partitio=
n-by-luks-uuid source)
                                                             (begin
                                                               (sleep 1)
                                                               (loop (- tri=
es-left 1))))))
                                                  (error "LUKS partition no=
t found" source))
                                              source)
                                          "guix")))))
             =E2=80=A6
--8<---------------cut here---------------end--------------->8---

IOW, it does the right thing whether or not you=E2=80=99re using a UUID.

However, when using a UUID, it waits for the device to show up, whereas
otherwise it assumes the /dev node is already there and invokes
=E2=80=98cryptsetup=E2=80=99 right away.

We should fix that and generalize the wait-for-device loop, which
already exists in a couple of instances.

There are connections with <https://bugs.gnu.org/30604>.

Ludo=E2=80=99.




Message sent to guix-patches@HIDDEN:


X-Loop: help-debbugs@HIDDEN
Subject: [bug#30604] bug#34902: guix cannot find a module on boot
Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
Original-Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
Resent-CC: guix-patches@HIDDEN
Resent-Date: Fri, 16 Aug 2019 21:11:02 +0000
Resent-Message-ID: <handler.30604.B30604.156598982619557 <at> debbugs.gnu.org>
Resent-Sender: help-debbugs@HIDDEN
X-GNU-PR-Message: followup 30604
X-GNU-PR-Package: guix-patches
X-GNU-PR-Keywords: patch
To: Danny Milosavljevic <dannym@HIDDEN>
Cc: Julien Lepiller <julien@HIDDEN>, 34902-done <at> debbugs.gnu.org, 30604 <at> debbugs.gnu.org
Received: via spool by 30604-submit <at> debbugs.gnu.org id=B30604.156598982619557
          (code B ref 30604); Fri, 16 Aug 2019 21:11:02 +0000
Received: (at 30604) by debbugs.gnu.org; 16 Aug 2019 21:10:26 +0000
Received: from localhost ([127.0.0.1]:55071 helo=debbugs.gnu.org)
	by debbugs.gnu.org with esmtp (Exim 4.84_2)
	(envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>)
	id 1hyjUQ-00055M-5q
	for submit <at> debbugs.gnu.org; Fri, 16 Aug 2019 17:10:26 -0400
Received: from eggs.gnu.org ([209.51.188.92]:47204)
 by debbugs.gnu.org with esmtp (Exim 4.84_2)
 (envelope-from <ludo@HIDDEN>)
 id 1hyjUO-000557-MQ; Fri, 16 Aug 2019 17:10:24 -0400
Received: from fencepost.gnu.org ([2001:470:142:3::e]:59360)
 by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from <ludo@HIDDEN>)
 id 1hyjUI-0006ff-97; Fri, 16 Aug 2019 17:10:18 -0400
Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=50870 helo=ribbon)
 by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256)
 (Exim 4.82) (envelope-from <ludo@HIDDEN>)
 id 1hyjUH-0007Zl-Sk; Fri, 16 Aug 2019 17:10:18 -0400
From: Ludovic =?UTF-8?Q?Court=C3=A8s?= <ludo@HIDDEN>
References: <813466538d530a38bddf60ed348cb75b@HIDDEN>
 <87o967lxsa.fsf@HIDDEN> <20190318231359.217af9f4@HIDDEN>
 <87wokq4ptt.fsf@HIDDEN> <20190404224217.5ddd00f7@HIDDEN>
Date: Fri, 16 Aug 2019 23:10:15 +0200
In-Reply-To: <20190404224217.5ddd00f7@HIDDEN> (Danny Milosavljevic's
 message of "Thu, 4 Apr 2019 22:42:17 +0200")
Message-ID: <874l2gg6ko.fsf@HIDDEN>
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.2 (gnu/linux)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]
X-Spam-Score: -2.3 (--)
X-BeenThere: debbugs-submit <at> debbugs.gnu.org
X-Mailman-Version: 2.1.18
Precedence: list
List-Id: <debbugs-submit.debbugs.gnu.org>
List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe>
List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/>
List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org>
List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help>
List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, 
 <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe>
Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org
Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org>
X-Spam-Score: -3.3 (---)

Hello!

Danny Milosavljevic <dannym@HIDDEN> skribis:

> Maybe I'm too paranoid but can we have "guix" in the file name "modules.n=
ame"
> somewhere?  Otherwise I see it coming that upstream uses modules.name for=
 an
> incompatible purpose and then we'd be with a guix interface that's broken
> and/or break their interface.
>
> (So much complexity for something so silly.  Honestly, I feel like E-mail=
ing
> the upstream author and telling him what I think.  WTF :P)
>
> Should we warn when we use the fallback?  I like the defensive programming
> but I feel we shouldn't have it *silently* fall back when the database is
> broken/missing.
>
> Otherwise LGTM!

So I went ahead and pushed these patches, derived from our beautiful
patch set at <https://issues.guix.gnu.org/issue/30604>:

  c85ccf60bf linux-modules: Define and use a module name database.
  e1a9a7f275 linux-modules: Add 'load-linux-modules-from-directory'.
  2a693b69ca linux-modules: Add "modules.devname" writer.
  4f8b9d1a6f linux-modules: Add "modules.alias" writer.

The actual fix for the hyphen/underscore mismatch that Julien reported
is commit c85ccf60bf.  The =E2=80=9Cmodules.devname=E2=80=9D and =E2=80=9Cm=
odules.alias=E2=80=9D are
actually unused so far but (1) it was easier to preserve them, and (2)
that=E2=80=99ll give us an incentive to finish
<https://issues.guix.gnu.org/issue/30604>.  :-)

I added an explicit comment that =E2=80=9Cmodules.name=E2=80=9D uses a Guix=
-specific
format.  We can always rename it if the kernel folks decide to acquire
that file name.

Julien, could you please confirm that your initial issue is fixed?

Thanks,
Ludo=E2=80=99.





Last modified: Mon, 25 Nov 2019 12:00:02 UTC

GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997 nCipher Corporation Ltd, 1994-97 Ian Jackson.