Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Oct 2010 19:58:29 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r214357 - in projects/binutils-2.17: . bin/sh contrib/bsnmp/snmpd contrib/top etc/mtree lib/libc/mips lib/libfetch lib/libthr/thread sbin/camcontrol sbin/geom/class/part sbin/hastd shar...
Message-ID:  <201010251958.o9PJwTSg075854@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Mon Oct 25 19:58:28 2010
New Revision: 214357
URL: http://svn.freebsd.org/changeset/base/214357

Log:
  Sync: merge r214221 through r214352 from ^/head.

Added:
  projects/binutils-2.17/share/examples/jails/
     - copied from r214352, head/share/examples/jails/
  projects/binutils-2.17/share/examples/netgraph/virtual.chain
     - copied unchanged from r214352, head/share/examples/netgraph/virtual.chain
  projects/binutils-2.17/share/examples/netgraph/virtual.lan
     - copied unchanged from r214352, head/share/examples/netgraph/virtual.lan
  projects/binutils-2.17/sys/net/if_debug.c
     - copied unchanged from r214352, head/sys/net/if_debug.c
  projects/binutils-2.17/sys/netinet/in_debug.c
     - copied unchanged from r214352, head/sys/netinet/in_debug.c
  projects/binutils-2.17/tools/regression/bin/sh/execution/func3.0
     - copied unchanged from r214352, head/tools/regression/bin/sh/execution/func3.0
  projects/binutils-2.17/tools/regression/bin/sh/execution/redir3.0
     - copied unchanged from r214352, head/tools/regression/bin/sh/execution/redir3.0
  projects/binutils-2.17/tools/regression/bin/sh/execution/redir4.0
     - copied unchanged from r214352, head/tools/regression/bin/sh/execution/redir4.0
  projects/binutils-2.17/tools/regression/bin/sh/parser/alias1.0
     - copied unchanged from r214352, head/tools/regression/bin/sh/parser/alias1.0
  projects/binutils-2.17/tools/regression/bin/sh/parser/alias2.0
     - copied unchanged from r214352, head/tools/regression/bin/sh/parser/alias2.0
  projects/binutils-2.17/tools/regression/bin/sh/parser/func1.0
     - copied unchanged from r214352, head/tools/regression/bin/sh/parser/func1.0
  projects/binutils-2.17/tools/regression/bin/sh/parser/pipe-not1.0
     - copied unchanged from r214352, head/tools/regression/bin/sh/parser/pipe-not1.0
Modified:
  projects/binutils-2.17/UPDATING
  projects/binutils-2.17/bin/sh/mksyntax.c
  projects/binutils-2.17/bin/sh/parser.c
  projects/binutils-2.17/bin/sh/redir.c
  projects/binutils-2.17/contrib/bsnmp/snmpd/bsnmpd.1
  projects/binutils-2.17/etc/mtree/BSD.usr.dist
  projects/binutils-2.17/lib/libc/mips/SYS.h
  projects/binutils-2.17/lib/libfetch/common.c
  projects/binutils-2.17/lib/libthr/thread/thr_attr.c
  projects/binutils-2.17/lib/libthr/thread/thr_private.h
  projects/binutils-2.17/sbin/camcontrol/camcontrol.c
  projects/binutils-2.17/sbin/geom/class/part/geom_part.c
  projects/binutils-2.17/sbin/geom/class/part/gpart.8
  projects/binutils-2.17/sbin/hastd/hastd.c
  projects/binutils-2.17/sbin/hastd/nv.c
  projects/binutils-2.17/sbin/hastd/nv.h
  projects/binutils-2.17/sbin/hastd/parse.y
  projects/binutils-2.17/sbin/hastd/primary.c
  projects/binutils-2.17/sbin/hastd/secondary.c
  projects/binutils-2.17/sbin/hastd/synch.h
  projects/binutils-2.17/share/examples/Makefile
  projects/binutils-2.17/share/man/man4/ada.4
  projects/binutils-2.17/share/man/man9/Makefile
  projects/binutils-2.17/share/man/man9/make_dev.9
  projects/binutils-2.17/sys/amd64/amd64/fpu.c
  projects/binutils-2.17/sys/amd64/include/profile.h
  projects/binutils-2.17/sys/boot/pc98/boot2/boot2.c
  projects/binutils-2.17/sys/cam/ata/ata_da.c
  projects/binutils-2.17/sys/cam/cam_xpt.c
  projects/binutils-2.17/sys/cam/scsi/scsi_da.c
  projects/binutils-2.17/sys/conf/files
  projects/binutils-2.17/sys/dev/ahci/ahci.c
  projects/binutils-2.17/sys/dev/bge/if_bge.c
  projects/binutils-2.17/sys/dev/bge/if_bgereg.h
  projects/binutils-2.17/sys/dev/fxp/if_fxp.c
  projects/binutils-2.17/sys/dev/iwi/if_iwi.c
  projects/binutils-2.17/sys/dev/mii/mii_physubr.c
  projects/binutils-2.17/sys/dev/mii/miivar.h
  projects/binutils-2.17/sys/dev/mii/mlphy.c
  projects/binutils-2.17/sys/dev/mii/pnaphy.c
  projects/binutils-2.17/sys/dev/mii/smcphy.c
  projects/binutils-2.17/sys/dev/mii/tlphy.c
  projects/binutils-2.17/sys/dev/pci/pci.c
  projects/binutils-2.17/sys/dev/siis/siis.c
  projects/binutils-2.17/sys/dev/sound/pcm/channel.c
  projects/binutils-2.17/sys/dev/tl/if_tl.c
  projects/binutils-2.17/sys/dev/tl/if_tlreg.h
  projects/binutils-2.17/sys/dev/usb/controller/ehci.c
  projects/binutils-2.17/sys/dev/usb/controller/ehcireg.h
  projects/binutils-2.17/sys/dev/usb/usb_device.c
  projects/binutils-2.17/sys/dev/usb/usb_freebsd.h
  projects/binutils-2.17/sys/fs/nfs/nfs_var.h
  projects/binutils-2.17/sys/fs/nfs/nfsdport.h
  projects/binutils-2.17/sys/fs/nfsserver/nfs_nfsdport.c
  projects/binutils-2.17/sys/geom/eli/g_eli.c
  projects/binutils-2.17/sys/geom/eli/g_eli_ctl.c
  projects/binutils-2.17/sys/geom/eli/g_eli_key.c
  projects/binutils-2.17/sys/geom/part/g_part.c
  projects/binutils-2.17/sys/geom/part/g_part.h
  projects/binutils-2.17/sys/geom/part/g_part_gpt.c
  projects/binutils-2.17/sys/geom/part/g_part_if.m
  projects/binutils-2.17/sys/i386/i386/elan-mmcr.c
  projects/binutils-2.17/sys/i386/i386/identcpu.c
  projects/binutils-2.17/sys/i386/i386/initcpu.c
  projects/binutils-2.17/sys/i386/i386/longrun.c
  projects/binutils-2.17/sys/i386/i386/perfmon.c
  projects/binutils-2.17/sys/i386/include/profile.h
  projects/binutils-2.17/sys/i386/isa/npx.c
  projects/binutils-2.17/sys/kern/kern_cpuset.c
  projects/binutils-2.17/sys/kern/kern_kthread.c
  projects/binutils-2.17/sys/kern/kern_shutdown.c
  projects/binutils-2.17/sys/kern/kern_thr.c
  projects/binutils-2.17/sys/kern/subr_acl_nfs4.c
  projects/binutils-2.17/sys/kern/vfs_bio.c
  projects/binutils-2.17/sys/net/if.c
  projects/binutils-2.17/sys/netinet/ip_ipsec.c
  projects/binutils-2.17/sys/netinet6/ip6_ipsec.c
  projects/binutils-2.17/sys/netipsec/ipsec_input.c
  projects/binutils-2.17/sys/netipsec/ipsec_output.c
  projects/binutils-2.17/sys/netipsec/key.c
  projects/binutils-2.17/sys/netipsec/keydb.h
  projects/binutils-2.17/sys/pc98/pc98/machdep.c
  projects/binutils-2.17/sys/powerpc/mambo/mambo_console.c
  projects/binutils-2.17/sys/security/mac/mac_vfs.c
  projects/binutils-2.17/sys/x86/x86/local_apic.c
  projects/binutils-2.17/tools/tools/syscall_timing/syscall_timing.c
  projects/binutils-2.17/usr.bin/lex/flex.skl
  projects/binutils-2.17/usr.sbin/usbconfig/usbconfig.c
Directory Properties:
  projects/binutils-2.17/   (props changed)
  projects/binutils-2.17/cddl/contrib/opensolaris/   (props changed)
  projects/binutils-2.17/contrib/bind9/   (props changed)
  projects/binutils-2.17/contrib/binutils/   (props changed)
  projects/binutils-2.17/contrib/bzip2/   (props changed)
  projects/binutils-2.17/contrib/ee/   (props changed)
  projects/binutils-2.17/contrib/expat/   (props changed)
  projects/binutils-2.17/contrib/file/   (props changed)
  projects/binutils-2.17/contrib/gdb/   (props changed)
  projects/binutils-2.17/contrib/gdtoa/   (props changed)
  projects/binutils-2.17/contrib/gnu-sort/   (props changed)
  projects/binutils-2.17/contrib/groff/   (props changed)
  projects/binutils-2.17/contrib/less/   (props changed)
  projects/binutils-2.17/contrib/libpcap/   (props changed)
  projects/binutils-2.17/contrib/llvm/   (props changed)
  projects/binutils-2.17/contrib/llvm/tools/clang/   (props changed)
  projects/binutils-2.17/contrib/ncurses/   (props changed)
  projects/binutils-2.17/contrib/netcat/   (props changed)
  projects/binutils-2.17/contrib/ntp/   (props changed)
  projects/binutils-2.17/contrib/one-true-awk/   (props changed)
  projects/binutils-2.17/contrib/openbsm/   (props changed)
  projects/binutils-2.17/contrib/openpam/   (props changed)
  projects/binutils-2.17/contrib/pf/   (props changed)
  projects/binutils-2.17/contrib/sendmail/   (props changed)
  projects/binutils-2.17/contrib/tcpdump/   (props changed)
  projects/binutils-2.17/contrib/tcsh/   (props changed)
  projects/binutils-2.17/contrib/top/   (props changed)
  projects/binutils-2.17/contrib/top/install-sh   (props changed)
  projects/binutils-2.17/contrib/tzcode/stdtime/   (props changed)
  projects/binutils-2.17/contrib/tzcode/zic/   (props changed)
  projects/binutils-2.17/contrib/tzdata/   (props changed)
  projects/binutils-2.17/contrib/wpa/   (props changed)
  projects/binutils-2.17/contrib/xz/   (props changed)
  projects/binutils-2.17/crypto/openssh/   (props changed)
  projects/binutils-2.17/crypto/openssl/   (props changed)
  projects/binutils-2.17/lib/libc/   (props changed)
  projects/binutils-2.17/lib/libc/stdtime/   (props changed)
  projects/binutils-2.17/lib/libutil/   (props changed)
  projects/binutils-2.17/lib/libz/   (props changed)
  projects/binutils-2.17/sbin/   (props changed)
  projects/binutils-2.17/sbin/ipfw/   (props changed)
  projects/binutils-2.17/share/mk/bsd.arch.inc.mk   (props changed)
  projects/binutils-2.17/share/zoneinfo/   (props changed)
  projects/binutils-2.17/sys/   (props changed)
  projects/binutils-2.17/sys/amd64/include/xen/   (props changed)
  projects/binutils-2.17/sys/cddl/contrib/opensolaris/   (props changed)
  projects/binutils-2.17/sys/contrib/dev/acpica/   (props changed)
  projects/binutils-2.17/sys/contrib/pf/   (props changed)
  projects/binutils-2.17/sys/contrib/x86emu/   (props changed)
  projects/binutils-2.17/sys/dev/xen/xenpci/   (props changed)
  projects/binutils-2.17/usr.bin/calendar/   (props changed)
  projects/binutils-2.17/usr.bin/csup/   (props changed)
  projects/binutils-2.17/usr.bin/procstat/   (props changed)
  projects/binutils-2.17/usr.sbin/zic/   (props changed)

Modified: projects/binutils-2.17/UPDATING
==============================================================================
--- projects/binutils-2.17/UPDATING	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/UPDATING	Mon Oct 25 19:58:28 2010	(r214357)
@@ -35,10 +35,10 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 9.
 20100915:
 	A workaround for a fixed ld bug has been removed in kernel code,
 	so make sure that your system ld is built from sources after
-	revision 210245 (r211583 if building head kernel on stable/8,
-	r211584 for stable/7).  A symptom of incorrect ld version is
-	different addresses for set_pcpu section and __start_set_pcpu
-	symbol in kernel and/or modules.
+	revision 210245 from 2010-07-19 (r211583 if building head kernel
+	on stable/8, r211584 for stable/7; both from 2010-08-21).
+	A symptom of incorrect ld version is different addresses for
+	set_pcpu section and __start_set_pcpu symbol in kernel and/or modules.
 
 20100913:
 	The $ipv6_prefer variable in rc.conf(5) has been split into

Modified: projects/binutils-2.17/bin/sh/mksyntax.c
==============================================================================
--- projects/binutils-2.17/bin/sh/mksyntax.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/bin/sh/mksyntax.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -75,6 +75,7 @@ struct synclass synclass[] = {
 	{ "CEOF",	"end of file" },
 	{ "CCTL",	"like CWORD, except it must be escaped" },
 	{ "CSPCL",	"these terminate a word" },
+	{ "CIGN",       "character should be ignored" },
 	{ NULL,		NULL }
 };
 
@@ -232,7 +233,7 @@ main(int argc __unused, char **argv __un
 	add("\n", "CNL");
 	add("\\", "CBACK");
 	add("`", "CBQUOTE");
-	add("\"", "CDQUOTE");
+	add("\"", "CIGN");
 	add("$", "CVAR");
 	add("}", "CENDVAR");
 	add("(", "CLP");

Modified: projects/binutils-2.17/bin/sh/parser.c
==============================================================================
--- projects/binutils-2.17/bin/sh/parser.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/bin/sh/parser.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
 #include "alias.h"
 #include "show.h"
 #include "eval.h"
+#include "exec.h"	/* to check for special builtins */
 #ifndef NO_HISTORY
 #include "myhistedit.h"
 #endif
@@ -328,7 +329,7 @@ pipeline(void)
 {
 	union node *n1, *n2, *pipenode;
 	struct nodelist *lp, *prev;
-	int negate;
+	int negate, t;
 
 	negate = 0;
 	checkkwd = 2;
@@ -347,7 +348,13 @@ pipeline(void)
 		do {
 			prev = lp;
 			lp = (struct nodelist *)stalloc(sizeof (struct nodelist));
-			lp->n = command();
+			checkkwd = 2;
+			t = readtoken();
+			tokpushback++;
+			if (t == TNOT)
+				lp->n = pipeline();
+			else
+				lp->n = command();
 			prev->next = lp;
 		} while (readtoken() == TPIPE);
 		lp->next = NULL;
@@ -372,7 +379,7 @@ command(void)
 	union node *ap, **app;
 	union node *cp, **cpp;
 	union node *redir, **rpp;
-	int t, negate = 0;
+	int t;
 
 	checkkwd = 2;
 	redir = NULL;
@@ -387,12 +394,6 @@ command(void)
 	}
 	tokpushback++;
 
-	while (readtoken() == TNOT) {
-		TRACE(("command: TNOT recognized\n"));
-		negate = !negate;
-	}
-	tokpushback++;
-
 	switch (readtoken()) {
 	case TIF:
 		n1 = (union node *)stalloc(sizeof (struct nif));
@@ -573,7 +574,7 @@ TRACE(("expecting DO got %s %s\n", tokna
 	case TRP:
 		tokpushback++;
 		n1 = simplecmd(rpp, redir);
-		goto checkneg;
+		return n1;
 	default:
 		synexpect(-1);
 	}
@@ -596,15 +597,7 @@ TRACE(("expecting DO got %s %s\n", tokna
 		n1->nredir.redirect = redir;
 	}
 
-checkneg:
-	if (negate) {
-		n2 = (union node *)stalloc(sizeof (struct nnot));
-		n2->type = NNOT;
-		n2->nnot.com = n1;
-		return n2;
-	}
-	else
-		return n1;
+	return n1;
 }
 
 
@@ -614,6 +607,7 @@ simplecmd(union node **rpp, union node *
 	union node *args, **app;
 	union node **orig_rpp = rpp;
 	union node *n = NULL;
+	int special;
 
 	/* If we don't have any redirections already, then we must reset */
 	/* rpp to be the address of the local redir variable.  */
@@ -647,10 +641,17 @@ simplecmd(union node **rpp, union node *
 			if (readtoken() != TRP)
 				synexpect(TRP);
 			funclinno = plinno;
-#ifdef notdef
-			if (! goodname(n->narg.text))
+			/*
+			 * - Require plain text.
+			 * - Functions with '/' cannot be called.
+			 */
+			if (!noexpand(n->narg.text) || quoteflag ||
+			    strchr(n->narg.text, '/'))
 				synerror("Bad function name");
-#endif
+			rmescapes(n->narg.text);
+			if (find_builtin(n->narg.text, &special) >= 0 &&
+			    special)
+				synerror("Cannot override a special builtin with a function");
 			n->type = NDEFUN;
 			n->narg.next = command();
 			funclinno = 0;
@@ -1223,10 +1224,7 @@ readtoken1(int firstc, char const *initi
 				if (eofmark != NULL && newvarnest == 0)
 					USTPUTC(c, out);
 				else {
-					if (state[level].category == TSTATE_ARITH)
-						state[level].syntax = ARISYNTAX;
-					else
-						state[level].syntax = BASESYNTAX;
+					state[level].syntax = BASESYNTAX;
 					quotef++;
 				}
 				break;
@@ -1281,6 +1279,8 @@ readtoken1(int firstc, char const *initi
 				break;
 			case CEOF:
 				goto endword;		/* exit outer loop */
+			case CIGN:
+				break;
 			default:
 				if (level == 0)
 					goto endword;	/* exit outer loop */

Modified: projects/binutils-2.17/bin/sh/redir.c
==============================================================================
--- projects/binutils-2.17/bin/sh/redir.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/bin/sh/redir.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -217,8 +217,11 @@ movefd:
 		if (redir->ndup.dupfd >= 0) {	/* if not ">&-" */
 			if (memory[redir->ndup.dupfd])
 				memory[fd] = 1;
-			else
-				dup2(redir->ndup.dupfd, fd);
+			else {
+				if (dup2(redir->ndup.dupfd, fd) < 0)
+					error("%d: %s", redir->ndup.dupfd,
+							strerror(errno));
+			}
 		} else {
 			close(fd);
 		}

Modified: projects/binutils-2.17/contrib/bsnmp/snmpd/bsnmpd.1
==============================================================================
--- projects/binutils-2.17/contrib/bsnmp/snmpd/bsnmpd.1	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/contrib/bsnmp/snmpd/bsnmpd.1	Mon Oct 25 19:58:28 2010	(r214357)
@@ -31,7 +31,7 @@
 .\"
 .\" $Begemot: bsnmp/snmpd/bsnmpd.1,v 1.12 2006/02/27 09:50:03 brandt_h Exp $
 .\"
-.Dd August 16, 2010
+.Dd October 23, 2010
 .Dt BSNMPD 1
 .Os
 .Sh NAME
@@ -68,11 +68,9 @@ Use
 .Ar file
 as configuration file instead of the standard one.
 .It Fl D Ar options
-Debugging options are specified with a
-.Fl o
-flag followed by a comma separated string of options.
+Debugging options are specified as a comma separated string.
 The following options are available.
-.Bl -tag -width ".It Cm trace Ns Cm = Ns Cm level"
+.Bl -tag -width "trace=level"
 .It Cm dump
 Dump all sent and received PDUs to the terminal.
 .It Cm events

Modified: projects/binutils-2.17/etc/mtree/BSD.usr.dist
==============================================================================
--- projects/binutils-2.17/etc/mtree/BSD.usr.dist	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/etc/mtree/BSD.usr.dist	Mon Oct 25 19:58:28 2010	(r214357)
@@ -227,6 +227,8 @@
             ..
             iscsi
             ..
+            jails
+            ..
             kld
                 cdev
                     module

Modified: projects/binutils-2.17/lib/libc/mips/SYS.h
==============================================================================
--- projects/binutils-2.17/lib/libc/mips/SYS.h	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/lib/libc/mips/SYS.h	Mon Oct 25 19:58:28 2010	(r214357)
@@ -91,7 +91,7 @@
 #else
 # define PIC_PROLOGUE(x)
 # define PIC_TAILCALL(l)	j  _C_LABEL(l)
-# define PIC_RETURN()
+# define PIC_RETURN()		j ra
 #endif /* __ABICALLS__ */
 
 # define SYSTRAP(x)	li v0,SYS_ ## x; syscall;

Modified: projects/binutils-2.17/lib/libfetch/common.c
==============================================================================
--- projects/binutils-2.17/lib/libfetch/common.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/lib/libfetch/common.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -321,9 +321,9 @@ fetch_connect(const char *host, int port
 int
 fetch_ssl(conn_t *conn, int verbose)
 {
+#ifdef WITH_SSL
 	int ret, ssl_err;
 
-#ifdef WITH_SSL
 	/* Init the SSL library and context */
 	if (!SSL_library_init()){
 		fprintf(stderr, "SSL library init failed\n");

Modified: projects/binutils-2.17/lib/libthr/thread/thr_attr.c
==============================================================================
--- projects/binutils-2.17/lib/libthr/thread/thr_attr.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/lib/libthr/thread/thr_attr.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -104,6 +104,8 @@
 
 #include "thr_private.h"
 
+static size_t	_get_kern_cpuset_size(void);
+
 __weak_reference(_pthread_attr_destroy, pthread_attr_destroy);
 
 int
@@ -116,6 +118,8 @@ _pthread_attr_destroy(pthread_attr_t *at
 		/* Invalid argument: */
 		ret = EINVAL;
 	else {
+		if ((*attr)->cpuset != NULL)
+			free((*attr)->cpuset);
 		/* Free the memory allocated to the attribute object: */
 		free(*attr);
 
@@ -132,28 +136,43 @@ _pthread_attr_destroy(pthread_attr_t *at
 __weak_reference(_pthread_attr_get_np, pthread_attr_get_np);
 
 int
-_pthread_attr_get_np(pthread_t pthread, pthread_attr_t *dst)
+_pthread_attr_get_np(pthread_t pthread, pthread_attr_t *dstattr)
 {
 	struct pthread *curthread;
-	struct pthread_attr attr;
+	struct pthread_attr attr, *dst;
 	int	ret;
+	size_t	cpusetsize;
 
-	if (pthread == NULL || dst == NULL || *dst == NULL)
+	if (pthread == NULL || dstattr == NULL || (dst = *dstattr) == NULL)
 		return (EINVAL);
-
+	cpusetsize = _get_kern_cpuset_size();
+	if (dst->cpusetsize < cpusetsize) {
+		char *newset = realloc(dst->cpuset, cpusetsize);
+		if (newset == NULL)
+			return (errno);
+		memset(newset + dst->cpusetsize, 0, cpusetsize -
+			dst->cpusetsize);
+		dst->cpuset = (cpuset_t *)newset;
+		dst->cpusetsize = cpusetsize;
+	}
 	curthread = _get_curthread();
 	if ((ret = _thr_find_thread(curthread, pthread, /*include dead*/0)) != 0)
 		return (ret);
 	attr = pthread->attr;
 	if (pthread->flags & THR_FLAGS_DETACHED)
 		attr.flags |= PTHREAD_DETACHED;
+	ret = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, TID(pthread),
+		dst->cpusetsize, dst->cpuset);
+	if (ret == -1)
+		ret = errno;
 	THR_THREAD_UNLOCK(curthread, pthread);
-
-	memcpy(*dst, &attr, sizeof(struct pthread_attr));
-	/* XXX */
-	(*dst)->cpuset = NULL;
-	(*dst)->cpusetsize = 0;
-	return (0);
+	if (ret == 0) {
+		memcpy(&dst->pthread_attr_start_copy, 
+			&attr.pthread_attr_start_copy, 
+			offsetof(struct pthread_attr, pthread_attr_end_copy) -
+			offsetof(struct pthread_attr, pthread_attr_start_copy));
+	}
+	return (ret);
 }
 
 __weak_reference(_pthread_attr_getdetachstate, pthread_attr_getdetachstate);

Modified: projects/binutils-2.17/lib/libthr/thread/thr_private.h
==============================================================================
--- projects/binutils-2.17/lib/libthr/thread/thr_private.h	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/lib/libthr/thread/thr_private.h	Mon Oct 25 19:58:28 2010	(r214357)
@@ -230,6 +230,7 @@ struct pthread_atfork {
 };
 
 struct pthread_attr {
+#define pthread_attr_start_copy	sched_policy
 	int	sched_policy;
 	int	sched_inherit;
 	int	prio;
@@ -239,6 +240,7 @@ struct pthread_attr {
 	void	*stackaddr_attr;
 	size_t	stacksize_attr;
 	size_t	guardsize_attr;
+#define pthread_attr_end_copy	cpuset
 	cpuset_t	*cpuset;
 	size_t	cpusetsize;
 };

Modified: projects/binutils-2.17/sbin/camcontrol/camcontrol.c
==============================================================================
--- projects/binutils-2.17/sbin/camcontrol/camcontrol.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/sbin/camcontrol/camcontrol.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -116,7 +116,7 @@ typedef enum {
 } cam_argmask;
 
 struct camcontrol_opts {
-	const char	*optname;	
+	const char	*optname;
 	cam_cmdmask	cmdnum;
 	cam_argmask	argnum;
 	const char	*subopt;
@@ -204,7 +204,7 @@ static int readdefects(struct cam_device
 		       char *combinedopt, int retry_count, int timeout);
 static void modepage(struct cam_device *device, int argc, char **argv,
 		     char *combinedopt, int retry_count, int timeout);
-static int scsicmd(struct cam_device *device, int argc, char **argv, 
+static int scsicmd(struct cam_device *device, int argc, char **argv,
 		   char *combinedopt, int retry_count, int timeout);
 static int tagcontrol(struct cam_device *device, int argc, char **argv,
 		      char *combinedopt);
@@ -234,7 +234,7 @@ static int atapm(struct cam_device *devi
 #endif
 
 camcontrol_optret
-getoption(char *arg, cam_cmdmask *cmdnum, cam_argmask *argnum, 
+getoption(char *arg, cam_cmdmask *cmdnum, cam_argmask *argnum,
 	  const char **subopt)
 {
 	struct camcontrol_opts *opts;
@@ -622,7 +622,7 @@ scsistart(struct cam_device *device, int
 		else
 			fprintf(stdout,
 				"Error received from stop unit command\n");
-			
+
 		if (arglist & CAM_ARG_VERBOSE) {
 			cam_error_print(device, ccb, CAM_ESF_ALL,
 					CAM_EPF_ALL, stderr);
@@ -688,7 +688,7 @@ scsiinquiry(struct cam_device *device, i
 	union ccb *ccb;
 	struct scsi_inquiry_data *inq_buf;
 	int error = 0;
-	
+
 	ccb = cam_getccb(device);
 
 	if (ccb == NULL) {
@@ -721,13 +721,13 @@ scsiinquiry(struct cam_device *device, i
 	 *    scsi_inquiry() will convert an inq_len (which is passed in as
 	 *    a u_int32_t, but the field in the CDB is only 1 byte) of 256
 	 *    to 0.  Evidently, very few devices meet the spec in that
-	 *    regard.  Some devices, like many Seagate disks, take the 0 as 
+	 *    regard.  Some devices, like many Seagate disks, take the 0 as
 	 *    0, and don't return any data.  One Pioneer DVD-R drive
 	 *    returns more data than the command asked for.
 	 *
 	 *    So, since there are numerous devices that just don't work
 	 *    right with the full inquiry size, we don't send the full size.
-	 * 
+	 *
 	 *  - The second reason not to use the full inquiry data length is
 	 *    that we don't need it here.  The only reason we issue a
 	 *    standard inquiry is to get the vendor name, device name,
@@ -1181,7 +1181,7 @@ atacapprint(struct ata_params *parm)
 	}
 
 	printf("\nFeature                      "
-		"Support  Enable    Value           Vendor\n");
+		"Support  Enabled   Value           Vendor\n");
 	printf("read ahead                     %s	%s\n",
 		parm->support.command1 & ATA_SUPPORT_LOOKAHEAD ? "yes" : "no",
 		parm->enabled.command1 & ATA_SUPPORT_LOOKAHEAD ? "yes" : "no");
@@ -1201,16 +1201,13 @@ atacapprint(struct ata_params *parm)
 			    ATA_QUEUE_LEN(parm->queue) + 1);
 		} else
 			printf("\n");
-	if (parm->satacapabilities && parm->satacapabilities != 0xffff) {
-		printf("Native Command Queuing (NCQ)   %s	",
-			parm->satacapabilities & ATA_SUPPORT_NCQ ?
-				"yes" : "no");
-		if (parm->satacapabilities & ATA_SUPPORT_NCQ) {
-			printf("	%d tags\n",
-			    ATA_QUEUE_LEN(parm->queue) + 1);
-		} else
-			printf("\n");
-	}
+	printf("Native Command Queuing (NCQ)   ");
+	if (parm->satacapabilities != 0xffff &&
+	    (parm->satacapabilities & ATA_SUPPORT_NCQ)) {
+		printf("yes		%d tags\n",
+		    ATA_QUEUE_LEN(parm->queue) + 1);
+	} else
+		printf("no\n");
 	printf("SMART                          %s	%s\n",
 		parm->support.command1 & ATA_SUPPORT_SMART ? "yes" : "no",
 		parm->enabled.command1 & ATA_SUPPORT_SMART ? "yes" : "no");
@@ -1223,28 +1220,39 @@ atacapprint(struct ata_params *parm)
 	printf("power management               %s	%s\n",
 		parm->support.command1 & ATA_SUPPORT_POWERMGT ? "yes" : "no",
 		parm->enabled.command1 & ATA_SUPPORT_POWERMGT ? "yes" : "no");
-	printf("advanced power management      %s	%s	%d/0x%02X\n",
+	printf("advanced power management      %s	%s",
 		parm->support.command2 & ATA_SUPPORT_APM ? "yes" : "no",
-		parm->enabled.command2 & ATA_SUPPORT_APM ? "yes" : "no",
-		parm->apm_value, parm->apm_value);
-	printf("automatic acoustic management  %s	%s	"
-		"%d/0x%02X	%d/0x%02X\n",
+		parm->enabled.command2 & ATA_SUPPORT_APM ? "yes" : "no");
+		if (parm->support.command2 & ATA_SUPPORT_APM) {
+			printf("	%d/0x%02X\n",
+			    parm->apm_value, parm->apm_value);
+		} else
+			printf("\n");
+	printf("automatic acoustic management  %s	%s",
 		parm->support.command2 & ATA_SUPPORT_AUTOACOUSTIC ? "yes" :"no",
-		parm->enabled.command2 & ATA_SUPPORT_AUTOACOUSTIC ? "yes" :"no",
-		ATA_ACOUSTIC_CURRENT(parm->acoustic),
-		ATA_ACOUSTIC_CURRENT(parm->acoustic),
-		ATA_ACOUSTIC_VENDOR(parm->acoustic),
-		ATA_ACOUSTIC_VENDOR(parm->acoustic));
+		parm->enabled.command2 & ATA_SUPPORT_AUTOACOUSTIC ? "yes" :"no");
+		if (parm->support.command2 & ATA_SUPPORT_AUTOACOUSTIC) {
+			printf("	%d/0x%02X	%d/0x%02X\n",
+			    ATA_ACOUSTIC_CURRENT(parm->acoustic),
+			    ATA_ACOUSTIC_CURRENT(parm->acoustic),
+			    ATA_ACOUSTIC_VENDOR(parm->acoustic),
+			    ATA_ACOUSTIC_VENDOR(parm->acoustic));
+		} else
+			printf("\n");
 	printf("media status notification      %s	%s\n",
 		parm->support.command2 & ATA_SUPPORT_NOTIFY ? "yes" : "no",
 		parm->enabled.command2 & ATA_SUPPORT_NOTIFY ? "yes" : "no");
 	printf("power-up in Standby            %s	%s\n",
 		parm->support.command2 & ATA_SUPPORT_STANDBY ? "yes" : "no",
 		parm->enabled.command2 & ATA_SUPPORT_STANDBY ? "yes" : "no");
-	printf("write-read-verify              %s	%s	%d/0x%x\n",
+	printf("write-read-verify              %s	%s",
 		parm->support2 & ATA_SUPPORT_WRITEREADVERIFY ? "yes" : "no",
-		parm->enabled2 & ATA_SUPPORT_WRITEREADVERIFY ? "yes" : "no",
-		parm->wrv_mode, parm->wrv_mode);
+		parm->enabled2 & ATA_SUPPORT_WRITEREADVERIFY ? "yes" : "no");
+		if (parm->support2 & ATA_SUPPORT_WRITEREADVERIFY) {
+			printf("	%d/0x%x\n",
+			    parm->wrv_mode, parm->wrv_mode);
+		} else
+			printf("\n");
 	printf("unload                         %s	%s\n",
 		parm->support.extension & ATA_SUPPORT_UNLOAD ? "yes" : "no",
 		parm->enabled.extension & ATA_SUPPORT_UNLOAD ? "yes" : "no");
@@ -1255,7 +1263,6 @@ atacapprint(struct ata_params *parm)
 		parm->support_dsm & ATA_SUPPORT_DSM_TRIM ? "yes" : "no");
 }
 
-
 static int
 ataidentify(struct cam_device *device, int retry_count, int timeout)
 {
@@ -1902,7 +1909,7 @@ readdefects(struct cam_device *device, i
 
 	/*
 	 * XXX KDM  I should probably clean up the printout format for the
-	 * disk defects. 
+	 * disk defects.
 	 */
 	switch (returned_format & SRDDH10_DLIST_FORMAT_MASK){
 		case SRDDH10_PHYSICAL_SECTOR_FORMAT:
@@ -2011,7 +2018,7 @@ void
 reassignblocks(struct cam_device *device, u_int32_t *blocks, int num_blocks)
 {
 	union ccb *ccb;
-	
+
 	ccb = cam_getccb(device);
 
 	cam_freeccb(ccb);
@@ -2114,7 +2121,7 @@ mode_select(struct cam_device *device, i
 			err(1, "error sending mode select command");
 		else
 			errx(1, "error sending mode select command");
-		
+
 	}
 
 	cam_freeccb(ccb);
@@ -2294,7 +2301,7 @@ scsicmd(struct cam_device *device, int a
 			if (arglist & CAM_ARG_CMD_IN) {
 				warnx("command must either be "
 				      "read or write, not both");
-				error = 1;	
+				error = 1;
 				goto scsicmd_bailout;
 			}
 			arglist |= CAM_ARG_CMD_OUT;
@@ -2611,7 +2618,7 @@ camdebug(int argc, char **argv, char *co
 			warnx("bus:target, or bus:target:lun to debug");
 		}
 	}
-	
+
 	if (error == 0) {
 
 		ccb.ccb_h.func_code = XPT_DEBUG;
@@ -2874,7 +2881,7 @@ cts_print(struct cam_device *device, str
 }
 
 /*
- * Get a path inquiry CCB for the specified device.  
+ * Get a path inquiry CCB for the specified device.
  */
 static int
 get_cpi(struct cam_device *device, struct ccb_pathinq *cpi)
@@ -2913,7 +2920,7 @@ get_cpi_bailout:
 }
 
 /*
- * Get a get device CCB for the specified device.  
+ * Get a get device CCB for the specified device.
  */
 static int
 get_cgd(struct cam_device *device, struct ccb_getdev *cgd)
@@ -3764,9 +3771,9 @@ doreport:
 					fprintf(stdout,
 						"\rFormatting:  %ju.%02u %% "
 						"(%d/%d) done",
-						(uintmax_t)(percentage / 
+						(uintmax_t)(percentage /
 						(0x10000 * 100)),
-						(unsigned)((percentage / 
+						(unsigned)((percentage /
 						0x10000) % 100),
 						val, 0x10000);
 					fflush(stdout);
@@ -3956,7 +3963,7 @@ retry:
 			case RPL_LUNDATA_ATYP_PERIPH:
 				if ((lundata->luns[i].lundata[j] &
 				    RPL_LUNDATA_PERIPH_BUS_MASK) != 0)
-					fprintf(stdout, "%d:", 
+					fprintf(stdout, "%d:",
 						lundata->luns[i].lundata[j] &
 						RPL_LUNDATA_PERIPH_BUS_MASK);
 				else if ((j == 0)
@@ -3994,7 +4001,7 @@ retry:
 				field_len_code = (lundata->luns[i].lundata[j] &
 					RPL_LUNDATA_EXT_LEN_MASK) >> 4;
 				field_len = field_len_code * 2;
-		
+
 				if ((eam_code == RPL_LUNDATA_EXT_EAM_WK)
 				 && (field_len_code == 0x00)) {
 					fprintf(stdout, "%d",
@@ -4352,7 +4359,7 @@ bailout:
 
 #endif /* MINIMALISTIC */
 
-void 
+void
 usage(int verbose)
 {
 	fprintf(verbose ? stdout : stderr,
@@ -4494,7 +4501,7 @@ usage(int verbose)
 #endif /* MINIMALISTIC */
 }
 
-int 
+int
 main(int argc, char **argv)
 {
 	int c;
@@ -4544,7 +4551,7 @@ main(int argc, char **argv)
 	 * this.  getopt is kinda braindead, so you end up having to run
 	 * through the options twice, and give each invocation of getopt
 	 * the option string for the other invocation.
-	 * 
+	 *
 	 * You would think that you could just have two groups of options.
 	 * The first group would get parsed by the first invocation of
 	 * getopt, and the second group would get parsed by the second
@@ -4553,13 +4560,13 @@ main(int argc, char **argv)
 	 * to the argument _after_ the first argument in the second group.
 	 * So when the second invocation of getopt comes around, it doesn't
 	 * recognize the first argument it gets and then bails out.
-	 * 
+	 *
 	 * A nice alternative would be to have a flag for getopt that says
 	 * "just keep parsing arguments even when you encounter an unknown
 	 * argument", but there isn't one.  So there's no real clean way to
 	 * easily parse two sets of arguments without having one invocation
 	 * of getopt know about the other.
-	 * 
+	 *
 	 * Without this hack, the first invocation of getopt would work as
 	 * long as the generic arguments are first, but the second invocation
 	 * (in the subfunction) would fail in one of two ways.  In the case
@@ -4573,14 +4580,14 @@ main(int argc, char **argv)
 	 * whether optind had been incremented one option too far.  The
 	 * mechanics of that, however, are more daunting than just giving
 	 * both invocations all of the expect options for either invocation.
-	 * 
+	 *
 	 * Needless to say, I wouldn't mind if someone invented a better
 	 * (non-GPL!) command line parsing interface than getopt.  I
 	 * wouldn't mind if someone added more knobs to getopt to make it
 	 * work better.  Who knows, I may talk myself into doing it someday,
 	 * if the standards weenies let me.  As it is, it just leads to
 	 * hackery like this and causes people to avoid it in some cases.
-	 * 
+	 *
 	 * KDM, September 8th, 1998
 	 */
 	if (subopt != NULL)

Modified: projects/binutils-2.17/sbin/geom/class/part/geom_part.c
==============================================================================
--- projects/binutils-2.17/sbin/geom/class/part/geom_part.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/sbin/geom/class/part/geom_part.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -67,7 +67,6 @@ static char ssize[32];
 #define	GPART_PARAM_BOOTCODE	"bootcode"
 #define	GPART_PARAM_INDEX	"index"
 #define	GPART_PARAM_PARTCODE	"partcode"
-#define	GPART_PARAM_FORCE	"force"
 
 static struct gclass *find_class(struct gmesh *, const char *);
 static struct ggeom * find_geom(struct gclass *, const char *);
@@ -85,7 +84,6 @@ static void gpart_show_geom(struct ggeom
 static int gpart_show_hasopt(struct gctl_req *, const char *, const char *);
 static void gpart_write_partcode(struct ggeom *, int, void *, ssize_t);
 static void gpart_write_partcode_vtoc8(struct ggeom *, int, void *);
-static void gpart_destroy(struct gctl_req *, unsigned int);
 static void gpart_print_error(const char *);
 
 struct g_command PUBSYM(class_commands)[] = {
@@ -123,8 +121,8 @@ struct g_command PUBSYM(class_commands)[
 		G_OPT_SENTINEL },
 	    "-i index [-f flags] geom"
 	},
-	{ "destroy", 0, gpart_destroy, {
-		{ 'F', GPART_PARAM_FORCE, NULL, G_TYPE_BOOL },
+	{ "destroy", 0, gpart_issue, {
+		{ 'F', "force", NULL, G_TYPE_BOOL },
 		{ 'f', "flags", GPART_FLAGS, G_TYPE_STRING },
 		G_OPT_SENTINEL },
 	    "[-F] [-f flags] geom"
@@ -167,6 +165,11 @@ struct g_command PUBSYM(class_commands)[
 		G_OPT_SENTINEL },
 	    "[-s size] -i index [-f flags] geom"
 	},
+	{ "recover", 0, gpart_issue, {
+		{ 'f', "flags", GPART_FLAGS, G_TYPE_STRING },
+		G_OPT_SENTINEL },
+	    "[-f flags] geom"
+	},
 	G_CMD_SENTINEL
 };
 
@@ -539,13 +542,17 @@ gpart_show_geom(struct ggeom *gp, const 
 	s = find_geomcfg(gp, "last");
 	last = (off_t)strtoimax(s, NULL, 0);
 	wblocks = strlen(s);
+	s = find_geomcfg(gp, "state");
+	if (s != NULL && *s != 'C')
+		s = NULL;
 	wname = strlen(gp->lg_name);
 	pp = LIST_FIRST(&gp->lg_consumer)->lg_provider;
 	secsz = pp->lg_sectorsize;
-	printf("=>%*jd  %*jd  %*s  %s  (%s)\n",
+	printf("=>%*jd  %*jd  %*s  %s  (%s)%s\n",
 	    wblocks, (intmax_t)first, wblocks, (intmax_t)(last - first + 1),
 	    wname, gp->lg_name,
-	    scheme, fmtsize(pp->lg_mediasize));
+	    scheme, fmtsize(pp->lg_mediasize),
+	    s ? " [CORRUPT]": "");
 
 	while ((pp = find_provider(gp, first)) != NULL) {
 		s = find_provcfg(pp, "start");
@@ -858,83 +865,6 @@ gpart_bootcode(struct gctl_req *req, uns
 }
 
 static void
-gpart_destroy(struct gctl_req *req, unsigned int fl)
-{
-	struct gmesh mesh;
-	struct gclass *classp;
-	struct gctl_req *req2;
-	struct ggeom *gp;
-	struct gprovider *pp;
-	const char *s;
-	int error, val;
-	intmax_t idx;
-
-	if (gctl_has_param(req, GPART_PARAM_FORCE)) {
-		val = gctl_get_int(req, GPART_PARAM_FORCE);
-		error = gctl_delete_param(req, GPART_PARAM_FORCE);
-		if (error)
-			errc(EXIT_FAILURE, error, "internal error");
-		if (val == 0)
-			goto done;
-		s = gctl_get_ascii(req, "class");
-		if (s == NULL)
-			abort();
-		error = geom_gettree(&mesh);
-		if (error != 0)
-			errc(EXIT_FAILURE, error, "Cannot get GEOM tree");
-		classp = find_class(&mesh, s);
-		if (classp == NULL) {
-			geom_deletetree(&mesh);
-			errx(EXIT_FAILURE, "Class %s not found.", s);
-		}
-		s = gctl_get_ascii(req, "arg0");
-		if (s == NULL)
-			abort();
-		gp = find_geom(classp, s);
-		if (gp == NULL)
-			errx(EXIT_FAILURE, "No such geom: %s.", s);
-		val = 0;
-		LIST_FOREACH(pp, &gp->lg_provider, lg_provider){
-			s = find_provcfg(pp, "index");
-			if (s == NULL)
-				errx(EXIT_FAILURE, "Index not found for %s.",
-				    pp->lg_name);
-			idx = strtoimax(s, NULL, 0);
-			req2 = gctl_get_handle();
-			gctl_ro_param(req2, "class", -1, classp->lg_name);
-			gctl_ro_param(req2, "arg0", -1, gp->lg_name);
-			gctl_ro_param(req2, "verb", -1, "delete");
-			gctl_ro_param(req2, GPART_PARAM_INDEX,
-			    sizeof(intmax_t), &idx);
-			gctl_ro_param(req2, "flags", -1, "X");
-			s = gctl_issue(req2);
-			if (s != NULL && s[0] != '\0') {
-				gpart_print_error(s);
-				gctl_free(req2);
-				if (val) { /* try to undo changes */
-					req2 = gctl_get_handle();
-					gctl_ro_param(req2, "verb", -1,
-					    "undo");
-					gctl_ro_param(req2, "class", -1,
-					    classp->lg_name);
-					gctl_ro_param(req2, "arg0", -1,
-					    gp->lg_name);
-					gctl_issue(req2);
-					gctl_free(req2);
-				}
-				geom_deletetree(&mesh);
-				exit(EXIT_FAILURE);
-			}
-			gctl_free(req2);
-			val = 1;
-		}
-		geom_deletetree(&mesh);
-	}
-done:
-	gpart_issue(req, fl);
-}
-
-static void
 gpart_print_error(const char *errstr)
 {
 	char *errmsg;

Modified: projects/binutils-2.17/sbin/geom/class/part/gpart.8
==============================================================================
--- projects/binutils-2.17/sbin/geom/class/part/gpart.8	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/sbin/geom/class/part/gpart.8	Mon Oct 25 19:58:28 2010	(r214357)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd September 28, 2010
+.Dd October 25, 2010
 .Dt GPART 8
 .Os
 .Sh NAME
@@ -129,6 +129,11 @@ utility:
 .Op Fl t Ar type
 .Op Fl f Ar flags
 .Ar geom
+.\" ==== RECOVER ====
+.Nm
+.Cm recover
+.Op Fl f Ar flags
+.Ar geom
 .\" ==== RESIZE ====
 .Nm
 .Cm resize
@@ -353,6 +358,23 @@ See the section entitled
 below for a discussion
 about its use.
 .El
+.\" ==== RECOVER ====
+.It Cm recover
+Recover corrupt partition's scheme metadata on the geom
+.Ar geom .
+See the section entitled
+.Sx "RECOVERING"
+below for the additional information.
+.Pp
+Additional options include:
+.Bl -tag -width 10n
+.It Fl f Ar flags
+Additional operational flags.
+See the section entitled
+.Sx "OPERATIONAL FLAGS"
+below for a discussion
+about its use.
+.El
 .\" ==== RESIZE ====
 .It Cm resize
 Resize a partition from geom
@@ -629,6 +651,68 @@ the
 action or reverted with the
 .Cm undo
 action.
+.Sh RECOVERING
+The GEOM class PART supports recovering of partition tables only for GPT.
+The GUID partition table has a primary and secondary (backup) copy of
+metadata for redundance. They are stored in the begining and in the end
+of device respectively. Therefore it is acceptable to have some corruptions
+in the metadata that are not fatal to work with GPT. When kernel detects
+corrupt metadata it marks this table as corrupt and reports about corruption.
+Any changes in corrupt table are prohibited except
+.Cm destroy
+and
+.Cm recover . 
+.Pp
+In case when only first sector is corrupt kernel can not detect GPT even
+if partition table is not corrupt. You can write protective MBR with
+.Xr dd 1
+command to restore ability of GPT detection. The copy of protective MBR is
+usually located in the
+.Pa /boot/pmbr
+file.
+.Pp
+In case when some of metadata is corrupt you will get to know about this
+from kernel's messages like these:
+.Bd -literal -offset indent
+GEOM: provider: the primary GPT table is corrupt or invalid.
+GEOM: provider: using the secondary instead -- recovery strongly advised.
+.Ed
+.Pp
+or
+.Bd -literal -offset indent
+GEOM: provider: the secondary GPT table is corrupt or invalid.
+GEOM: provider: using the primary only -- recovery suggested.
+.Ed
+.Pp
+Also 
+.Cm gpart 
+commands like 
+.Cm show ,
+.Cm status
+and
+.Cm list
+will report about corrupt table.
+.Pp
+In case when the size of device has changed (e.g. volume expansion) the 
+secondary GPT header will become located not in the last sector. This is 
+not a metadata corruption, but it is dangerous because any corruption of 
+the primary GPT will lead to lost of partition table. Kernel reports about 
+this problem with message:
+.Bd -literal -offset indent
+GEOM: provider: the secondary GPT header is not in the last LBA.
+.Ed
+.Pp
+A corrupt table can be recovered with 
+.Cm gpart recover 
+command. This command does reconstruction of corrupt metadata using 
+known valid metadata. Also it can relocate secondary GPT to the end of 
+device.
+.Pp
+.Pa NOTE :
+The GEOM class PART can detect the same partition table on different GEOM 
+providers and some of them will marked as corrupt. Be careful when choising 
+a provider for recovering. If you did incorrect choise you can destroy 
+metadata of another GEOM class, e.g. GEOM MIRROR or GEOM LABEL.
 .Sh EXIT STATUS
 Exit status is 0 on success, and 1 if the command fails.
 .Sh EXAMPLES
@@ -687,6 +771,7 @@ After having created all required partit
 /sbin/gpart bootcode -p /boot/boot1 da0
 .Ed
 .Sh SEE ALSO
+.Xr dd 1 ,
 .Xr geom 4 ,
 .Xr geom 8
 .Sh HISTORY

Modified: projects/binutils-2.17/sbin/hastd/hastd.c
==============================================================================
--- projects/binutils-2.17/sbin/hastd/hastd.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/sbin/hastd/hastd.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -701,8 +701,6 @@ main(int argc, char *argv[])
 	int debuglevel;
 	sigset_t mask;
 
-	g_gate_load();
-
 	foreground = false;
 	debuglevel = 0;
 	pidfile = HASTD_PIDFILE;
@@ -736,6 +734,8 @@ main(int argc, char *argv[])
 
 	pjdlog_debug_set(debuglevel);
 
+	g_gate_load();
+
 	pfh = pidfile_open(pidfile, 0600, &otherpid);
 	if (pfh == NULL) {
 		if (errno == EEXIST) {

Modified: projects/binutils-2.17/sbin/hastd/nv.c
==============================================================================
--- projects/binutils-2.17/sbin/hastd/nv.c	Mon Oct 25 19:56:02 2010	(r214356)
+++ projects/binutils-2.17/sbin/hastd/nv.c	Mon Oct 25 19:58:28 2010	(r214357)
@@ -46,6 +46,35 @@ __FBSDID("$FreeBSD$");
 #include <ebuf.h>
 #include <nv.h>
 
+#define	NV_TYPE_NONE		0
+
+#define	NV_TYPE_INT8		1
+#define	NV_TYPE_UINT8		2
+#define	NV_TYPE_INT16		3
+#define	NV_TYPE_UINT16		4
+#define	NV_TYPE_INT32		5
+#define	NV_TYPE_UINT32		6
+#define	NV_TYPE_INT64		7
+#define	NV_TYPE_UINT64		8
+#define	NV_TYPE_INT8_ARRAY	9
+#define	NV_TYPE_UINT8_ARRAY	10
+#define	NV_TYPE_INT16_ARRAY	11
+#define	NV_TYPE_UINT16_ARRAY	12
+#define	NV_TYPE_INT32_ARRAY	13
+#define	NV_TYPE_UINT32_ARRAY	14
+#define	NV_TYPE_INT64_ARRAY	15
+#define	NV_TYPE_UINT64_ARRAY	16
+#define	NV_TYPE_STRING		17
+
+#define	NV_TYPE_MASK		0x7f
+#define	NV_TYPE_FIRST		NV_TYPE_INT8
+#define	NV_TYPE_LAST		NV_TYPE_STRING
+
+#define	NV_ORDER_NETWORK	0x00
+#define	NV_ORDER_HOST		0x80
+
+#define	NV_ORDER_MASK		0x80
+
 #define	NV_MAGIC	0xaea1e
 struct nv {
 	int	nv_magic;
@@ -534,6 +563,29 @@ nv_get_string(struct nv *nv, const char 
 	return (str);
 }
 
+bool
+nv_exists(struct nv *nv, const char *namefmt, ...)
+{
+	struct nvhdr *nvh;
+	va_list nameap;
+	int snverror, serrno;
+
+	if (nv == NULL)
+		return (false);
+
+	serrno = errno;
+	snverror = nv->nv_error;
+
+	va_start(nameap, namefmt);
+	nvh = nv_find(nv, NV_TYPE_NONE, namefmt, nameap);
+	va_end(nameap);
+
+	errno = serrno;
+	nv->nv_error = snverror;
+
+	return (nvh != NULL);
+}
+

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010251958.o9PJwTSg075854>