svn commit: r199227 - head/sys/kern

Attilio Rao attilio at FreeBSD.org
Thu Nov 12 15:59:05 UTC 2009


Author: attilio
Date: Thu Nov 12 15:59:05 2009
New Revision: 199227
URL: http://svn.freebsd.org/changeset/base/199227

Log:
  Add the possibility for vfs.root.mountfrom tunable to accept a list of
  items rather than a single one. The list is a space separated collection
  of items defined as the current one accepted.
  
  While there fix also a nit in a comment.
  
  Obtained from:	Sandvine Incorporated
  Reviewed by:	emaste
  Tested by:	Giovanni Trematerra
  		<giovanni dot trematerra at gmail dot com>
  Sponsored by:	Sandvine Incorporated
  MFC:		2 weeks

Modified:
  head/sys/kern/vfs_mount.c

Modified: head/sys/kern/vfs_mount.c
==============================================================================
--- head/sys/kern/vfs_mount.c	Thu Nov 12 15:19:09 2009	(r199226)
+++ head/sys/kern/vfs_mount.c	Thu Nov 12 15:59:05 2009	(r199227)
@@ -104,13 +104,17 @@ struct vnode	*rootvnode;
  * The root filesystem is detailed in the kernel environment variable
  * vfs.root.mountfrom, which is expected to be in the general format
  *
- * <vfsname>:[<path>]
+ * <vfsname>:[<path>][	<vfsname>:[<path>] ...]
  * vfsname   := the name of a VFS known to the kernel and capable
  *              of being mounted as root
  * path      := disk device name or other data used by the filesystem
  *              to locate its physical store
  *
- * The environment variable vfs.root.mountfrom options is a comma delimited
+ * If the environment variable vfs.root.mountfrom is a space separated list,
+ * each list element is tried in turn and the root filesystem will be mounted
+ * from the first one that suceeds.
+ *
+ * The environment variable vfs.root.mountfrom.options is a comma delimited
  * set of string mount options.  These mount options must be parseable
  * by nmount() in the kernel.
  */
@@ -1643,7 +1647,7 @@ vfs_opterror(struct vfsoptlist *opts, co
 void
 vfs_mountroot(void)
 {
-	char *cp, *options;
+	char *cp, *cpt, *options, *tmpdev;
 	int error, i, asked = 0;
 
 	options = NULL;
@@ -1695,10 +1699,15 @@ vfs_mountroot(void)
 	 */
 	cp = getenv("vfs.root.mountfrom");
 	if (cp != NULL) {
-		error = vfs_mountroot_try(cp, options);
+		cpt = cp;
+		while ((tmpdev = strsep(&cpt, " \t")) != NULL) {
+			error = vfs_mountroot_try(tmpdev, options);
+			if (error == 0) {
+				freeenv(cp);
+				goto mounted;
+			}
+		}
 		freeenv(cp);
-		if (!error)
-			goto mounted;
 	}
 
 	/*


More information about the svn-src-all mailing list