From 712e62c2608908cfda471cb8fe409ac65c4844e4 Mon Sep 17 00:00:00 2001
From: Sebastian Hagen <sh_github@memespace.net>
Date: Mon, 9 Jan 2017 09:32:23 +0000
Subject: [PATCH] nixos/stage2: Check for each special mount individually and
 mount missing ones. (#21370)

---
 nixos/modules/system/boot/stage-2-init.sh | 28 +++++++++++++----------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/nixos/modules/system/boot/stage-2-init.sh b/nixos/modules/system/boot/stage-2-init.sh
index f827e530f877..7a54bb03e297 100644
--- a/nixos/modules/system/boot/stage-2-init.sh
+++ b/nixos/modules/system/boot/stage-2-init.sh
@@ -34,20 +34,24 @@ if [ -z "$container" ]; then
 fi
 
 
-# Likewise, stage 1 mounts /proc, /dev and /sys, so if we don't have a
+# Likewise, stage 1 mounts /proc, /dev, /sys and /run, so if we don't have a
 # stage 1, we need to do that here.
-if [ ! -e /proc/1 ]; then
-    specialMount() {
-        local device="$1"
-        local mountPoint="$2"
-        local options="$3"
-        local fsType="$4"
+# We check for each mountpoint separately to avoid esoteric failure modes
+# if only a subset was mounted by whatever called us.
+specialMount() {
+    local device="$1"
+    local mountPoint="$2"
+    local options="$3"
+    local fsType="$4"
 
-        mkdir -m 0755 -p "$mountPoint"
-        mount -n -t "$fsType" -o "$options" "$device" "$mountPoint"
-    }
-    source @earlyMountScript@
-fi
+    if mountpoint -q "$mountpoint"; then
+        return 0
+    fi
+
+    mkdir -m 0755 -p "$mountPoint"
+    mount -n -t "$fsType" -o "$options" "$device" "$mountPoint"
+}
+source @earlyMountScript@
 
 
 echo "booting system configuration $systemConfig" > /dev/kmsg