mounting root from NFS via ROOTDEVNAME

Eggert, Lars lars at netapp.com
Tue May 28 15:15:53 UTC 2013


Hi,

to conclude this thread, the patch below allows one to specify an nfs rootfs via the ROOTDEVNAME kernel option, which will be mounted when BOOTP does not return a root-path option.

Lars


diff --git a/sys/nfs/bootp_subr.c b/sys/nfs/bootp_subr.c
index 2c57a91..972fb12 100644
--- a/sys/nfs/bootp_subr.c
+++ b/sys/nfs/bootp_subr.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 
 #include "opt_bootp.h"
 #include "opt_nfs.h"
+#include "opt_rootdevname.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -870,8 +871,20 @@ bootpc_call(struct bootpc_globalcontext *gctx, struct thread *td)
 					rtimo = time_second +
 						BOOTP_SETTLE_DELAY;
 					printf(" (got root path)");
-				} else
+				} else {
 					printf(" (no root path)");
+#ifdef ROOTDEVNAME
+					/*
+					 * If we'll mount rootfs from
+					 * ROOTDEVNAME, we can accept
+					 * offers without root paths.
+					 */
+					gotrootpath = 1;
+					rtimo = time_second +
+						BOOTP_SETTLE_DELAY;
+					printf(" (ROOTDEVNAME)");
+#endif
+				}
 				printf("\n");
 			}
 		} /* while secs */
@@ -1440,6 +1453,16 @@ bootpc_decode_reply(struct nfsv3_diskless *nd, struct bootpc_ifcontext *ifctx,
 
 	p = bootpc_tag(&gctx->tag, &ifctx->reply, ifctx->replylen,
 		       TAG_ROOT);
+#ifdef ROOTDEVNAME
+	/*
+	 * If there was no root path in BOOTP, use the one in ROOTDEVNAME.
+	 */
+	if (p == NULL) {
+		p = strdup(ROOTDEVNAME, M_TEMP);
+		if (strcmp(strsep(&p, ":"), "nfs") != 0)
+			panic("ROOTDEVNAME is not an NFS mount point");
+	}
+#endif
 	if (p != NULL) {
 		if (gctx->setrootfs != NULL) {
 			printf("rootfs %s (ignored) ", p);



More information about the freebsd-current mailing list