diff --git a/src/freenas/etc/systemd/system/nvmf-connect@.service.d/override.conf b/src/freenas/etc/systemd/system/nvmf-connect@.service.d/override.conf new file mode 100644 index 0000000000000..e216fa3ee6e30 --- /dev/null +++ b/src/freenas/etc/systemd/system/nvmf-connect@.service.d/override.conf @@ -0,0 +1,3 @@ +[Service] +ExecStart= +ExecStart=/bin/sh -c "/usr/local/bin/nvmf-wrapper.sh `/bin/echo -e '${CONNECT_ARGS}'`" diff --git a/src/freenas/usr/local/bin/nvmf-connect.sh b/src/freenas/usr/local/bin/nvmf-connect.sh new file mode 100755 index 0000000000000..17dc6db2cc023 --- /dev/null +++ b/src/freenas/usr/local/bin/nvmf-connect.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +RECONNECT_TIMEOUT_SEC=5 +discovery_dev=$(echo "$@" | grep -oP '(?<=--device=)\w+') +discovery_addr=$( $queue diff --git a/src/freenas/usr/local/bin/nvmf-wrapper.sh b/src/freenas/usr/local/bin/nvmf-wrapper.sh new file mode 100755 index 0000000000000..4b4ae990576f9 --- /dev/null +++ b/src/freenas/usr/local/bin/nvmf-wrapper.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +if [ "$#" -eq 0 ]; then + echo "Error: No arguments provided." + exit 1 +fi + +discovery_nqn="nqn.2014-08.org.nvmexpress.discovery" +discovery_dev=$(echo "$@" | grep -oP '(?<=--device=)\w+') + +if [[ $( $queue +systemd-run --unit=${discovery_dev}-of.service /bin/bash -c "/usr/local/bin/nvmf-connect.sh $*" + +# If service is still active and queue reads EXIT, we have a race. Wait for small interval since +# we already know that nvmf-connect.sh is about to exit. +if [ $? != 0 ] && [ "EXIT" = $(<$queue) ]; then + sleep 0.1 + systemd-run --unit=${discovery_dev}-of.service /bin/bash -c "/usr/local/bin/nvmf-connect.sh $*" + + if [ $? != 0 ]; then + echo "Error: ${discovery_dev}-of.service failed to start after waiting for 100 milliseconds" + fi +fi