From 3cb9f1976c260821e43e6eae9d46e4ec97a8d4f1 Mon Sep 17 00:00:00 2001 From: Alfredo Dal'Ava Junior Date: Tue, 31 May 2022 16:03:43 -0300 Subject: [PATCH] nfs: skip bootpc when vfs.root.mountfrom is other than nfs If "vfs.root.mountfrom" is set and the value is something other than "nfs:*", it means the user doesn't want to mount root via nfs, there's no reason to continue with bootpc This fixes the powerpcspe kernel (MPC85XXSPE) that's compiled with BOOTP_NFSROOT by default and gets stuck on bootpc/dhcp request loop when no DHCP server is available on the network, even when user specifies a local disk via "vfs.root.mountfrom" kernel parameter. Reviewed by: imp MFC after: 2 weeks Sponsored by: Instituto de Pesquisas Eldorado (eldorado.org.br) Differential Revision: https://reviews.freebsd.org/D35098 --- sys/nfs/bootp_subr.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sys/nfs/bootp_subr.c b/sys/nfs/bootp_subr.c index e64a6b40640c..62fcb06fbc5d 100644 --- a/sys/nfs/bootp_subr.c +++ b/sys/nfs/bootp_subr.c @@ -1514,6 +1514,7 @@ bootpc_init(void) struct thread *td; int timeout; int delay; + char *s; timeout = BOOTP_IFACE_WAIT_TIMEOUT * hz; delay = hz / 10; @@ -1527,6 +1528,21 @@ bootpc_init(void) if (nfs_diskless_valid != 0) return; + /* + * If "vfs.root.mountfrom" is set and the value is something other + * than "nfs:", it means the user doesn't want to mount root via nfs, + * there's no reason to continue with bootpc + */ + if ((s = kern_getenv("vfs.root.mountfrom")) != NULL) { + if ((strncmp(s, "nfs:", 4)) != 0) { + printf("%s: vfs.root.mountfrom set to %s. " + "BOOTP aborted.\n", __func__, s); + freeenv(s); + return; + } + freeenv(s); + } + gctx = malloc(sizeof(*gctx), M_TEMP, M_WAITOK | M_ZERO); STAILQ_INIT(&gctx->interfaces); gctx->xid = ~0xFFFF;