Harald Hoyer 460d2c
From 480aa9695f8c2e2b30c8f41ae8483140020d23db Mon Sep 17 00:00:00 2001
Harald Hoyer 460d2c
From: Daniel Molkentin <dmolkentin@suse.com>
Harald Hoyer 460d2c
Date: Tue, 4 Aug 2020 10:20:51 +0200
Harald Hoyer 460d2c
Subject: [PATCH] 95resume: Do not resume on iSCSI, FCoE or NBD
Harald Hoyer 460d2c
Harald Hoyer 460d2c
The iSCSI configuration is started after dracut checks for resume,
Harald Hoyer 460d2c
so we run into a timeout here. Additionally it's questionable if
Harald Hoyer 460d2c
resume on iSCSI makes sense (or is even supported on the platform).
Harald Hoyer 460d2c
Harald Hoyer 460d2c
Same holds true for Network Block Devices and FcOE, cover those as well
Harald Hoyer 460d2c
Harald Hoyer 460d2c
References: bsc#999663
Harald Hoyer 460d2c
Harald Hoyer 460d2c
Original-patch-by: Hannes Reinecke <hare@suse.com>
Harald Hoyer 460d2c
Signed-off-by: Daniel Molkentin <daniel.molkentin@suse.com>
Harald Hoyer 460d2c
---
Harald Hoyer 460d2c
 dracut-functions.sh                | 44 ++++++++++++++++++++++++++++++++++++++
Harald Hoyer 460d2c
 modules.d/95iscsi/module-setup.sh  | 14 ++----------
Harald Hoyer 460d2c
 modules.d/95nbd/module-setup.sh    |  4 +---
Harald Hoyer 460d2c
 modules.d/95resume/module-setup.sh | 11 +++++++++-
Harald Hoyer 460d2c
 4 files changed, 57 insertions(+), 16 deletions(-)
Harald Hoyer 460d2c
Harald Hoyer 460d2c
diff --git a/dracut-functions.sh b/dracut-functions.sh
Harald Hoyer 460d2c
index 07ae88c0..e0ca7574 100755
Harald Hoyer 460d2c
--- a/dracut-functions.sh
Harald Hoyer 460d2c
+++ b/dracut-functions.sh
Harald Hoyer 460d2c
@@ -842,3 +842,47 @@ ip_params_for_remote_addr() {
Harald Hoyer 460d2c
     fi
Harald Hoyer 460d2c
 
Harald Hoyer 460d2c
 }
Harald Hoyer 460d2c
+
Harald Hoyer 460d2c
+# block_is_nbd <maj:min>
Harald Hoyer 460d2c
+# Check whether $1 is an nbd device
Harald Hoyer 460d2c
+block_is_nbd() {
Harald Hoyer 460d2c
+    [[ -b /dev/block/$1 && $1 == 43:* ]]
Harald Hoyer 460d2c
+}
Harald Hoyer 460d2c
+
Harald Hoyer 460d2c
+# block_is_iscsi <maj:min>
Harald Hoyer 460d2c
+# Check whether $1 is an nbd device
Harald Hoyer 460d2c
+block_is_iscsi() {
Harald Hoyer 460d2c
+    local _dir
Harald Hoyer 460d2c
+    local _dev=$1
Harald Hoyer 460d2c
+    [[ -L "/sys/dev/block/$_dev" ]] || return
Harald Hoyer 460d2c
+    _dir="$(readlink -f "/sys/dev/block/$_dev")" || return
Harald Hoyer 460d2c
+    until [[ -d "$_dir/sys" || -d "$_dir/iscsi_session" ]]; do
Harald Hoyer 460d2c
+        _dir="$_dir/.."
Harald Hoyer 460d2c
+    done
Harald Hoyer 460d2c
+    [[ -d "$_dir/iscsi_session" ]]
Harald Hoyer 460d2c
+}
Harald Hoyer 460d2c
+
Harald Hoyer 460d2c
+# block_is_fcoe <maj:min>
Harald Hoyer 460d2c
+# Check whether $1 is an FCoE device
Harald Hoyer 460d2c
+# Will not work for HBAs that hide the ethernet aspect
Harald Hoyer 460d2c
+# completely and present a pure FC device
Harald Hoyer 460d2c
+block_is_fcoe() {
Harald Hoyer 460d2c
+    local _dir
Harald Hoyer 460d2c
+    local _dev=$1
Harald Hoyer 460d2c
+    [[ -L "/sys/dev/block/$_dev" ]] || return
Harald Hoyer 460d2c
+    _dir="$(readlink -f "/sys/dev/block/$_dev")"
Harald Hoyer 460d2c
+    until [[ -d "$_dir/sys" ]]; do
Harald Hoyer 460d2c
+        _dir="$_dir/.."
Harald Hoyer 460d2c
+        if [[ -d "$_dir/subsystem" ]]; then
Harald Hoyer 460d2c
+            subsystem=$(basename $(readlink $_dir/subsystem))
Harald Hoyer 460d2c
+            [[ $subsystem == "fcoe" ]] && return 0
Harald Hoyer 460d2c
+        fi
Harald Hoyer 460d2c
+    done
Harald Hoyer 460d2c
+    return 1
Harald Hoyer 460d2c
+}
Harald Hoyer 460d2c
+
Harald Hoyer 460d2c
+# block_is_netdevice <maj:min>
Harald Hoyer 460d2c
+# Check whether $1 is a net device
Harald Hoyer 460d2c
+block_is_netdevice() {
Harald Hoyer 460d2c
+    block_is_nbd "$1" || block_is_iscsi "$1" || block_is_fcoe "$1"
Harald Hoyer 460d2c
+}
Harald Hoyer 460d2c
diff --git a/modules.d/95iscsi/module-setup.sh b/modules.d/95iscsi/module-setup.sh
Harald Hoyer 460d2c
index dfacd797..20922442 100755
Harald Hoyer 460d2c
--- a/modules.d/95iscsi/module-setup.sh
Harald Hoyer 460d2c
+++ b/modules.d/95iscsi/module-setup.sh
Harald Hoyer 460d2c
@@ -9,20 +9,9 @@ check() {
Harald Hoyer 460d2c
     # If hostonly was requested, fail the check if we are not actually
Harald Hoyer 460d2c
     # booting from root.
Harald Hoyer 460d2c
 
Harald Hoyer 460d2c
-    is_iscsi() {
Harald Hoyer 460d2c
-        local _dev=$1
Harald Hoyer 460d2c
-
Harald Hoyer 460d2c
-        [[ -L "/sys/dev/block/$_dev" ]] || return
Harald Hoyer 460d2c
-        cd "$(readlink -f "/sys/dev/block/$_dev")"
Harald Hoyer 460d2c
-        until [[ -d sys || -d iscsi_session ]]; do
Harald Hoyer 460d2c
-            cd ..
Harald Hoyer 460d2c
-        done
Harald Hoyer 460d2c
-        [[ -d iscsi_session ]]
Harald Hoyer 460d2c
-    }
Harald Hoyer 460d2c
-
Harald Hoyer 460d2c
     [[ $hostonly ]] || [[ $mount_needs ]] && {
Harald Hoyer 460d2c
         pushd . >/dev/null
Harald Hoyer 460d2c
-        for_each_host_dev_and_slaves is_iscsi
Harald Hoyer 460d2c
+        for_each_host_dev_and_slaves block_is_iscsi
Harald Hoyer 460d2c
         local _is_iscsi=$?
Harald Hoyer 460d2c
         popd >/dev/null
Harald Hoyer 460d2c
         [[ $_is_iscsi == 0 ]] || return 255
Harald Hoyer 460d2c
@@ -223,6 +212,7 @@ install() {
Harald Hoyer 460d2c
     inst_hook cmdline 90 "$moddir/parse-iscsiroot.sh"
Harald Hoyer 460d2c
     inst_hook cleanup 90 "$moddir/cleanup-iscsi.sh"
Harald Hoyer 460d2c
     inst "$moddir/iscsiroot.sh" "/sbin/iscsiroot"
Harald Hoyer 460d2c
+
Harald Hoyer 460d2c
     if ! dracut_module_included "systemd"; then
Harald Hoyer 460d2c
         inst "$moddir/mount-lun.sh" "/bin/mount-lun.sh"
Harald Hoyer 460d2c
     else
Harald Hoyer 460d2c
diff --git a/modules.d/95nbd/module-setup.sh b/modules.d/95nbd/module-setup.sh
Harald Hoyer 460d2c
index 22f6a3bf..9254b49a 100755
Harald Hoyer 460d2c
--- a/modules.d/95nbd/module-setup.sh
Harald Hoyer 460d2c
+++ b/modules.d/95nbd/module-setup.sh
Harald Hoyer 460d2c
@@ -7,11 +7,9 @@ check() {
Harald Hoyer 460d2c
     # if an nbd device is not somewhere in the chain of devices root is
Harald Hoyer 460d2c
     # mounted on, fail the hostonly check.
Harald Hoyer 460d2c
     [[ $hostonly ]] || [[ $mount_needs ]] && {
Harald Hoyer 460d2c
-        is_nbd() { [[ -b /dev/block/$1 && $1 == 43:* ]] ;}
Harald Hoyer 460d2c
-
Harald Hoyer 460d2c
         _rootdev=$(find_root_block_device)
Harald Hoyer 460d2c
         [[ -b /dev/block/$_rootdev ]] || return 1
Harald Hoyer 460d2c
-        check_block_and_slaves is_nbd "$_rootdev" || return 255
Harald Hoyer 460d2c
+        check_block_and_slaves block_is_nbd "$_rootdev" || return 255
Harald Hoyer 460d2c
     }
Harald Hoyer 460d2c
     require_binaries nbd-client || return 1
Harald Hoyer 460d2c
 
Harald Hoyer 460d2c
diff --git a/modules.d/95resume/module-setup.sh b/modules.d/95resume/module-setup.sh
Harald Hoyer 460d2c
index cb06b567..96c2573e 100755
Harald Hoyer 460d2c
--- a/modules.d/95resume/module-setup.sh
Harald Hoyer 460d2c
+++ b/modules.d/95resume/module-setup.sh
Harald Hoyer 460d2c
@@ -2,9 +2,18 @@
Harald Hoyer 460d2c
 
Harald Hoyer 460d2c
 # called by dracut
Harald Hoyer 460d2c
 check() {
Harald Hoyer 460d2c
+    swap_on_netdevice() {
Harald Hoyer 460d2c
+        local _dev
Harald Hoyer 460d2c
+        for _dev in "${swap_devs[@]}"; do
Harald Hoyer 460d2c
+            block_is_netdevice $_dev && return 0
Harald Hoyer 460d2c
+        done
Harald Hoyer 460d2c
+        return 1
Harald Hoyer 460d2c
+    }
Harald Hoyer 460d2c
+
Harald Hoyer 460d2c
     # Only support resume if hibernation is currently on
Harald Hoyer 460d2c
+    # and no swap is mounted on a net device
Harald Hoyer 460d2c
     [[ $hostonly ]] || [[ $mount_needs ]] && {
Harald Hoyer 460d2c
-        [[ "$(cat /sys/power/resume)" == "0:0" ]] && return 255
Harald Hoyer 460d2c
+        swap_on_netdevice || [[ "$(cat /sys/power/resume)" == "0:0" ]] && return 255
Harald Hoyer 460d2c
     }
Harald Hoyer 460d2c
 
Harald Hoyer 460d2c
     return 0
Harald Hoyer 460d2c