From a5ad360ff9b7fb2ef3f7f31b8c29c332026b0e01 Mon Sep 17 00:00:00 2001 From: Mateusz Piotrowski <0mp@FreeBSD.org> Date: Wed, 23 Oct 2024 14:57:29 +0200 Subject: [PATCH] rc: Remove rc_fast_and_loose The rc_fast_and_loose variable allowed rc(8) to start services by sourcing them into rc's own shell environment. Normally, each rc service script is started by being sourced into its own subshell instead. The feature was meant to speed up rc(8) by avoiding the extra forking necessary to spawn subshells. In practice, the feature has been broken for a long time now. One of the reasons is that some rc service scripts call the exit builtin to return non-zero error codes, which not only terminates the service subshell but also rc(8) when rc_fast_and_loose is enabled. For example, a system running any of the supported FreeBSD releases with rc_fast_and_loose=yes would abort rc(8) as early as rc.d/hostid, due to an "exit 0". Fixing rc_fast_and_loose support would require rewriting some rc scripts to support being sourced directly into rc(8) process. This would muddy the code base and also would prove difficult to maintain long term as this is simply not how rc(8) users write scripts. The potential performance benefits are unlikely to be significant even for use cases such as Morello under qemu. Instead, remove support for rc_fast_and_loose completely from rc(8) and inform users about the change. PR: 282255 Reviewed by: brooks, christos, mhorne Approved by: christos (mentor), markj (mentor) MFC after: 2 weeks Relnotes: yes Differential Revision: https://reviews.freebsd.org/D47264 --- UPDATING | 7 +++++++ libexec/rc/rc.subr | 20 ++------------------ share/man/man8/rc.subr.8 | 36 +++++++++++------------------------- 3 files changed, 20 insertions(+), 43 deletions(-) diff --git a/UPDATING b/UPDATING index c2e7a658c65e..1fb14a96880b 100644 --- a/UPDATING +++ b/UPDATING @@ -27,6 +27,13 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 15.x IS SLOW: world, or to merely disable the most expensive debugging functionality at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20241025: + The support for the rc_fast_and_loose variable has been removed from + rc.subr(8). Users setting rc_fast_and_loose on their systems are + advised to make sure their customizations to rc service scripts + do not depend on having a single shell environment shared across + all the rc service scripts during booting and shutdown. + 20241013: The ciss driver was updated to cope better with hotplug events that caused it to panic before, and to support more than 48 drives attached diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr index 58e30c897897..dc2cc06bb806 100644 --- a/libexec/rc/rc.subr +++ b/libexec/rc/rc.subr @@ -1798,9 +1798,6 @@ _run_rc_killcmd() # return value from the script. # If `file' ends with `.sh' and lives in /etc/rc.d, ignore it as it's # an old-style startup file. -# If `file' ends with `.sh' and does not live in /etc/rc.d, it's sourced -# into the current environment if $rc_fast_and_loose is set; otherwise -# it is run as a child process. # If `file' appears to be a backup or scratch file, ignore it. # Otherwise if it is executable run as a child process. # @@ -1836,8 +1833,6 @@ run_rc_script() if [ -n "$rc_boottrace" ]; then boottrace_fn "$_file" "$_arg" - elif [ -n "$rc_fast_and_loose" ]; then - set $_arg; . $_file else ( trap "echo Script $_file interrupted >&2 ; kill -QUIT $$" 3 trap "echo Script $_file interrupted >&2 ; exit 1" 2 @@ -1909,19 +1904,8 @@ boottrace_fn() _file=$1 _arg=$2 - if [ -n "$rc_fast_and_loose" ]; then - boottrace_sysctl "$_file start" - set $_arg; . $_file - boottrace_sysctl "$_file done" - else - _boot="${_boot}" rc_fast="${rc_fast}" autoboot="${autoboot}" \ - $boottrace_cmd "$_file" "$_arg" - fi -} - -boottrace_sysctl() -{ - ${SYSCTL} kern.boottrace.boottrace="$1" + _boot="${_boot}" rc_fast="${rc_fast}" autoboot="${autoboot}" \ + $boottrace_cmd "$_file" "$_arg" } # diff --git a/share/man/man8/rc.subr.8 b/share/man/man8/rc.subr.8 index 36d7d4543e52..1fd5041cecd8 100644 --- a/share/man/man8/rc.subr.8 +++ b/share/man/man8/rc.subr.8 @@ -27,7 +27,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.Dd September 22, 2024 +.Dd October 23, 2024 .Dt RC.SUBR 8 .Os .Sh NAME @@ -1017,41 +1017,27 @@ and to enable tracing if any of those tags appear in .Va DEBUG_SH . .Pp -The startup behaviour of +.Ic run_rc_script +executes .Ar file -depends upon the following checks: +unless: .Bl -enum .It -If .Ar file ends in -.Pa .sh , -it is sourced into the current shell. +.Pa .sh +and lives in +.Pa /etc/rc.d . .It -If .Ar file appears to be a backup or scratch file -(e.g., with a suffix of -.Pa ~ , # , .OLD , +.Po e.g., with a suffix of +.Pa ~ , # , .OLD , ,v , or -.Pa .orig ) , -ignore it. +.Pa .orig Pc . .It -If .Ar file -is not executable, ignore it. -.It -If the -.Xr rc.conf 5 -variable -.Va rc_fast_and_loose -is empty, -source -.Ar file -in a sub shell, -otherwise source -.Ar file -into the current shell. +is not executable. .El .It Ic run_rc_scripts Oo options Oc file ... Call