ZFS booting without partitions

Henri Hennebert hlh at restart.be
Fri Jun 5 19:34:12 UTC 2009


Kip Macy wrote:
> On Mon, Jun 1, 2009 at 10:21 AM, Adam McDougall <mcdouga9 at egr.msu.edu> wrote:
>> I'm thinking that too.  I spent some time taking stabs at figuring it out
>> yesterday but didn't get anywhere useful.  I did try compiling the -current
>> src/sys/boot tree on 7.2 after a couple header tweaks to make it compile but
>> the loader still didn't work.  The working loader is the same file size as
>> the broken loader unless it was compiled on i386 and then it is ~30k bigger
>> for some reason (it shrinks to the same size as the rest if I force it to
>> use the same 32bit compilation flags as used on amd64).  Just mentioning
>> this in case it saves someone else some time.  I'm real pleased it works at
>> all.
> 
> If someone has the time to track down the differences I'll MFC them.
> I'm not using ZFS boot at the moment so I have no way of testing.
> 
At last I get this F.....G diff!!!

The problem was in libstand.a. By the way , the patch also take into 
account the update of Doug Rabson to answer my problem with too many 
devices / pools.

Happy to help on this one.


> Cheers,
> Kip

-------------- next part --------------
--- lib/libstand/stand.h.orig	2007-01-09 02:02:04.000000000 +0100
+++ lib/libstand/stand.h	2009-06-03 17:24:42.627552341 +0200
@@ -167,7 +167,7 @@
 #define SOPEN_RASIZE	512
 };
 
-#define	SOPEN_MAX	8
+#define	SOPEN_MAX	64
 extern struct open_file files[];
 
 /* f_flags values */
--- lib/libstand/nfs.c.orig	2004-01-21 21:12:23.000000000 +0100
+++ lib/libstand/nfs.c	2009-06-05 20:36:26.001368421 +0200
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/lib/libstand/nfs.c,v 1.12 2004/01/21 20:12:23 jhb Exp $");
+__FBSDID("$FreeBSD: src/lib/libstand/nfs.c,v 1.14 2008/11/21 09:14:29 luigi Exp $");
 
 #include <sys/param.h>
 #include <sys/time.h>
@@ -405,16 +405,23 @@
 
 #ifdef NFS_DEBUG
  	if (debug)
- 	    printf("nfs_open: %s (rootpath=%s)\n", path, rootpath);
+ 	    printf("nfs_open: %s (rootpath=%s)\n", upath, rootpath);
 #endif
 	if (!rootpath[0]) {
 		printf("no rootpath, no nfs\n");
 		return (ENXIO);
 	}
 
+	/*
+	 * This is silly - we should look at dv_type but that value is
+	 * arch dependant and we can't use it here.
+	 */
 #ifndef __i386__
 	if (strcmp(f->f_dev->dv_name, "net") != 0)
 		return(EINVAL);
+#else
+	if (strcmp(f->f_dev->dv_name, "pxe") != 0)
+		return(EINVAL);
 #endif
 
 	if (!(desc = socktodesc(*(int *)(f->f_devdata))))


More information about the freebsd-stable mailing list