changeset 10928:eb060666c73f

6885689 syseventd: [daemon.error] Fatal:attempting to dump core on snv_124 6874078 fminject should always add __injected payload 6874080 fmd_case_add_ereport() should add any __injected payload from ereports into the suspect list 6796601 fmadm faulty doesn't show the year when events happen 6820523 fmdump -V should display the complete time for all files, not just errlog files 6881060 Subdirectories in /var/fm/fmd/ have overly restrictive permissions 6890955 oodles of FMA messages upon fmd start-up
author Stephen Hanson <Stephen.Hanson@Sun.COM>
date Mon, 02 Nov 2009 09:11:35 -0800
parents ac35db8a7412
children 2e39e3d31413
files usr/src/cmd/fm/fmadm/common/faulty.c usr/src/cmd/fm/fmd/Makefile.fmd usr/src/cmd/fm/fmd/common/fmd.c usr/src/cmd/fm/fmd/common/fmd_asru.c usr/src/cmd/fm/fmd/common/fmd_case.c usr/src/cmd/fm/fmd/common/fmd_case.h usr/src/cmd/fm/fmd/common/fmd_protocol.c usr/src/cmd/fm/fmd/common/fmd_protocol.h usr/src/cmd/fm/fmd/common/fmd_xprt.c usr/src/cmd/fm/fmdump/common/asru.c usr/src/cmd/fm/fmdump/common/fault.c usr/src/cmd/fm/fmdump/common/fmdump.c usr/src/cmd/fm/fminject/common/inj_cmds.c usr/src/cmd/syseventd/daemons/syseventd/syseventd.c usr/src/pkgdefs/SUNWfmdr/prototype_com usr/src/uts/common/sys/fm/protocol.h
diffstat 16 files changed, 154 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/fm/fmadm/common/faulty.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmadm/common/faulty.c	Mon Nov 02 09:11:35 2009 -0800
@@ -215,6 +215,7 @@
 	name_list_t *fru;
 	name_list_t *serial;
 	uint8_t not_suppressed;
+	uint8_t injected;
 } status_record_t;
 
 typedef struct sr_list {
@@ -229,6 +230,7 @@
 	sr_list_t *status_rec_list;
 	char *resource;
 	uint8_t not_suppressed;
+	uint8_t injected;
 	uint8_t max_pct;
 } resource_list_t;
 
@@ -259,7 +261,14 @@
 		(void) snprintf(buf, len, "0x%llx", sec);
 	} else {
 		time_t tod = (time_t)sec;
-		(void) strftime(buf, len, "%b %d %T", localtime(&tod));
+		time_t now = time(NULL);
+		if (tod > now+60 ||
+		    tod < now - 6L*30L*24L*60L*60L) { /* 6 months ago */
+			(void) strftime(buf, len, "%b %d %Y    ",
+			    localtime(&tod));
+		} else {
+			(void) strftime(buf, len, "%b %d %T", localtime(&tod));
+		}
 	}
 
 	return (buf);
@@ -612,7 +621,7 @@
 new_record_init(uurec_t *uurec_p, char *msgid, name_list_t *class,
     name_list_t *fru, name_list_t *asru, name_list_t *resource,
     name_list_t *serial, boolean_t not_suppressed,
-    hostid_t *hostid)
+    hostid_t *hostid, boolean_t injected)
 {
 	status_record_t *status_rec_p;
 
@@ -633,6 +642,7 @@
 	status_rec_p->serial = serial;
 	status_rec_p->msgid = strdup(msgid);
 	status_rec_p->not_suppressed = not_suppressed;
+	status_rec_p->injected = injected;
 	return (status_rec_p);
 }
 
@@ -732,6 +742,7 @@
 	while (np) {
 		if (strcmp(fp->name, np->resource) == 0) {
 			np->not_suppressed |= status_rec_p->not_suppressed;
+			np->injected |= status_rec_p->injected;
 			srp = np->status_rec_list->status_record;
 			order = cmp_priority(status_rec_p->severity,
 			    srp->severity, status_rec_p->uurec->sec,
@@ -761,6 +772,7 @@
 		np = malloc(sizeof (resource_list_t));
 		np->resource = fp->name;
 		np->not_suppressed = status_rec_p->not_suppressed;
+		np->injected = status_rec_p->injected;
 		np->status_rec_list = NULL;
 		np->max_pct = fp->max_pct;
 		add_resource(status_rec_p, rpp, np);
@@ -790,12 +802,12 @@
 catalog_new_record(uurec_t *uurec_p, char *msgid, name_list_t *class,
     name_list_t *fru, name_list_t *asru, name_list_t *resource,
     name_list_t *serial, boolean_t not_suppressed,
-    hostid_t *hostid)
+    hostid_t *hostid, boolean_t injected)
 {
 	status_record_t *status_rec_p;
 
 	status_rec_p = new_record_init(uurec_p, msgid, class, fru, asru,
-	    resource, serial, not_suppressed, hostid);
+	    resource, serial, not_suppressed, hostid, injected);
 	add_rec_list(status_rec_p, &status_rec_list);
 	if (status_rec_p->fru)
 		add_list(status_rec_p, status_rec_p->fru, &status_fru_list);
@@ -924,11 +936,13 @@
 	hostid_t *host;
 	boolean_t not_suppressed = 1;
 	boolean_t any_present = 0;
+	boolean_t injected = 0;
 
 	(void) nvlist_lookup_string(nvl, FM_SUSPECT_DIAG_CODE, &msgid);
 	(void) nvlist_lookup_uint32(nvl, FM_SUSPECT_FAULT_SZ, &size);
 	(void) nvlist_lookup_boolean_value(nvl, FM_SUSPECT_MESSAGE,
 	    &not_suppressed);
+	(void) nvlist_lookup_boolean_value(nvl, FM_SUSPECT_INJECTED, &injected);
 
 	if (size != 0) {
 		(void) nvlist_lookup_nvlist_array(nvl, FM_SUSPECT_FAULT_LIST,
@@ -957,7 +971,7 @@
 	(void) nvlist_dup(nvl, &uurec_p->event, 0);
 	host = find_hostid(nvl);
 	catalog_new_record(uurec_p, msgid, class, fru, asru,
-	    resource, serial, not_suppressed, host);
+	    resource, serial, not_suppressed, host, injected);
 }
 
 static void
@@ -1423,15 +1437,17 @@
 	if (opt_i) {
 		ari_list = uurp->ari_uuid_list;
 		while (ari_list) {
-			(void) printf("%-15s %-37s %-14s %-9s\n",
+			(void) printf("%-15s %-37s %-14s %-9s %s\n",
 			    format_date(buf, sizeof (buf), uurp->sec),
-			    ari_list->ari_uuid, srp->msgid, srp->severity);
+			    ari_list->ari_uuid, srp->msgid, srp->severity,
+			    srp->injected ? dgettext("FMD", "injected") : "");
 			ari_list = ari_list->next;
 		}
 	} else {
-		(void) printf("%-15s %-37s %-14s %-9s\n",
+		(void) printf("%-15s %-37s %-14s %-9s %s\n",
 		    format_date(buf, sizeof (buf), uurp->sec),
-		    uurp->uuid, srp->msgid, srp->severity);
+		    uurp->uuid, srp->msgid, srp->severity,
+		    srp->injected ? dgettext("FMD", "injected") : "");
 	}
 
 	if (!summary)
@@ -1551,18 +1567,23 @@
 				slp = slp->next;
 			} while (slp != end);
 			if (status & FM_SUSPECT_NOT_PRESENT)
-				(void) printf(dgettext("FMD", "not present\n"));
+				(void) printf(dgettext("FMD", "not present"));
 			else if (status & FM_SUSPECT_FAULTY)
-				(void) printf(dgettext("FMD", "faulty\n"));
+				(void) printf(dgettext("FMD", "faulty"));
 			else if (status & FM_SUSPECT_REPLACED)
-				(void) printf(dgettext("FMD", "replaced\n"));
+				(void) printf(dgettext("FMD", "replaced"));
 			else if (status & FM_SUSPECT_REPAIRED)
 				(void) printf(dgettext("FMD",
-				    "repair attempted\n"));
+				    "repair attempted"));
 			else if (status & FM_SUSPECT_ACQUITTED)
-				(void) printf(dgettext("FMD", "acquitted\n"));
+				(void) printf(dgettext("FMD", "acquitted"));
 			else
-				(void) printf(dgettext("FMD", "removed\n"));
+				(void) printf(dgettext("FMD", "removed"));
+
+			if (tp->injected)
+				(void) printf(dgettext("FMD", " injected\n"));
+			else
+				(void) printf(dgettext("FMD", "\n"));
 
 			slp = tp->status_rec_list;
 			end = slp;
@@ -1663,7 +1684,11 @@
 				msg = "";
 				break;
 			}
-			(void) printf("%-69s %s\n", tp->resource, msg);
+			(void) printf("%-69s %s", tp->resource, msg);
+			if (tp->injected)
+				(void) printf(dgettext("FMD", " injected\n"));
+			else
+				(void) printf(dgettext("FMD", "\n"));
 		}
 		tp = tp->next;
 		if (tp == status_asru_list)
--- a/usr/src/cmd/fm/fmd/Makefile.fmd	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmd/Makefile.fmd	Mon Nov 02 09:11:35 2009 -0800
@@ -104,7 +104,7 @@
 ROOTHDRS = $(HDRS:%=$(ROOTHDIR)/%)
 
 $(ROOTHDRS) := FILEMODE = 0644
-$(ROOTVSUB) := DIRMODE = 0700
+$(ROOTVSUB) := DIRMODE = 0755
 $(ROOTMANIFEST) := FILEMODE = 0444
 
 $(NOT_RELEASE_BUILD)CPPFLAGS += -DDEBUG
--- a/usr/src/cmd/fm/fmd/common/fmd.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd.c	Mon Nov 02 09:11:35 2009 -0800
@@ -231,8 +231,8 @@
 { "product_sn", &fmd_conf_string, _fmd_psn },	/* product serial number */
 { "chassis", &fmd_conf_string, _fmd_csn },	/* chassis serial number */
 { "ckpt.dir", &fmd_conf_string, "var/fm/fmd/ckpt" }, /* ckpt directory path */
-{ "ckpt.dirmode", &fmd_conf_int32, "0700" },	/* ckpt directory perm mode */
-{ "ckpt.mode", &fmd_conf_int32, "0400" },	/* ckpt file perm mode */
+{ "ckpt.dirmode", &fmd_conf_int32, "0755" },	/* ckpt directory perm mode */
+{ "ckpt.mode", &fmd_conf_int32, "0644" },	/* ckpt file perm mode */
 { "ckpt.restore", &fmd_conf_bool, "true" },	/* restore checkpoints? */
 { "ckpt.save", &fmd_conf_bool, "true" },	/* save checkpoints? */
 { "ckpt.zero", &fmd_conf_bool, "false" },	/* zero checkpoints on start? */
--- a/usr/src/cmd/fm/fmd/common/fmd_asru.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_asru.c	Mon Nov 02 09:11:35 2009 -0800
@@ -454,6 +454,7 @@
 	char *class;
 	nvlist_t *rsrc;
 	int err;
+	boolean_t injected;
 
 	/*
 	 * Extract the most recent values of 'faulty' from the event log.
@@ -497,6 +498,9 @@
 	    case_code);
 	fmd_case_hold(cp);
 	fmd_module_unlock(fmd.d_rmod);
+	if (nvlist_lookup_boolean_value(nvl, FM_SUSPECT_INJECTED,
+	    &injected) == 0 && injected)
+		fmd_case_set_injected(cp);
 	if (nvlist_lookup_int64_array(nvl, FM_SUSPECT_DIAG_TIME, &diag_time,
 	    &nelem) == 0 && nelem >= 2)
 		fmd_case_settime(cp, diag_time[0], diag_time[1]);
@@ -1529,7 +1533,7 @@
 	    alp->al_asru_fmri, cip->ci_uuid, cip->ci_code, faulty, unusable,
 	    message, alp->al_event, &cip->ci_tv, repaired, replaced, acquitted,
 	    cip->ci_state == FMD_CASE_RESOLVED, cip->ci_diag_de == NULL ?
-	    cip->ci_mod->mod_fmri : cip->ci_diag_de);
+	    cip->ci_mod->mod_fmri : cip->ci_diag_de, cip->ci_injected == 1);
 
 	(void) nvlist_lookup_string(nvl, FM_CLASS, &class);
 	e = fmd_event_create(FMD_EVT_PROTOCOL, FMD_HRT_NOW, nvl, class);
--- a/usr/src/cmd/fm/fmd/common/fmd_case.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_case.c	Mon Nov 02 09:11:35 2009 -0800
@@ -480,7 +480,7 @@
 	 */
 	nvl = fmd_protocol_list(class, cip->ci_diag_de == NULL ?
 	    cip->ci_mod->mod_fmri : cip->ci_diag_de, cip->ci_uuid, code, count,
-	    nva, ba, msg, &cip->ci_tv);
+	    nva, ba, msg, &cip->ci_tv, cip->ci_injected);
 
 	(void) pthread_mutex_unlock(&cip->ci_lock);
 	return (nvl);
@@ -1607,6 +1607,7 @@
 	fmd_case_item_t *cit;
 	uint_t state;
 	int new;
+	boolean_t injected;
 
 	(void) pthread_mutex_lock(&cip->ci_lock);
 
@@ -1635,6 +1636,10 @@
 	cit = fmd_alloc(sizeof (fmd_case_item_t), FMD_SLEEP);
 	fmd_event_hold(ep);
 
+	if (nvlist_lookup_boolean_value(((fmd_event_impl_t *)ep)->ev_nvl,
+	    "__injected", &injected) == 0 && injected)
+		fmd_case_set_injected(cp);
+
 	cit->cit_next = cip->ci_items;
 	cit->cit_event = ep;
 
@@ -2389,6 +2394,12 @@
 }
 
 void
+fmd_case_set_injected(fmd_case_t *cp)
+{
+	((fmd_case_impl_t *)cp)->ci_injected = 1;
+}
+
+void
 fmd_case_set_de_fmri(fmd_case_t *cp, nvlist_t *nvl)
 {
 	fmd_case_impl_t *cip = (fmd_case_impl_t *)cp;
@@ -2453,6 +2464,8 @@
 			TRACE((FMD_DBG_CASE, "replay sending list.resolved %s",
 			    cip->ci_uuid));
 			fmd_case_publish(cp, FMD_CASE_RESOLVED);
+			fmd_asru_hash_apply_by_case(fmd.d_asrus, cp,
+			    fmd_asru_log_resolved, NULL);
 			cip->ci_flags |= FMD_CF_RES_CMPL;
 		} else {
 			TRACE((FMD_DBG_CASE, "replay sending list.repaired %s",
--- a/usr/src/cmd/fm/fmd/common/fmd_case.h	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_case.h	Mon Nov 02 09:11:35 2009 -0800
@@ -78,6 +78,7 @@
 	fmd_buf_hash_t ci_bufs;		/* hash of bufs associated with case */
 	struct timeval ci_tv;		/* time of original diagnosis */
 	int ci_tv_valid;		/* time of original diagnosis valid */
+	int ci_injected;		/* was the fault injected */
 } fmd_case_impl_t;
 
 #define	FMD_CASE_CURRENT	-1u	/* flag for current state */
@@ -150,6 +151,7 @@
 extern void fmd_case_settime(fmd_case_t *, time_t, suseconds_t);
 extern void fmd_case_setcode(fmd_case_t *, char *);
 extern void fmd_case_set_de_fmri(fmd_case_t *, nvlist_t *);
+extern void fmd_case_set_injected(fmd_case_t *);
 extern void fmd_case_update_status(fmd_case_t *, uint8_t *, uint8_t *,
     uint8_t *);
 extern void fmd_case_update_containees(fmd_case_t *);
--- a/usr/src/cmd/fm/fmd/common/fmd_protocol.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_protocol.c	Mon Nov 02 09:11:35 2009 -0800
@@ -142,7 +142,7 @@
 nvlist_t *
 fmd_protocol_list(const char *class, nvlist_t *de_fmri, const char *uuid,
     const char *code, uint_t argc, nvlist_t **argv, uint8_t *flagv, int domsg,
-    struct timeval *tvp)
+    struct timeval *tvp, int injected)
 {
 	int64_t tod[2];
 	nvlist_t *nvl;
@@ -164,6 +164,10 @@
 	err |= nvlist_add_nvlist(nvl, FM_SUSPECT_DE, de_fmri);
 	err |= nvlist_add_uint32(nvl, FM_SUSPECT_FAULT_SZ, argc);
 
+	if (injected)
+		err |= nvlist_add_boolean_value(nvl, FM_SUSPECT_INJECTED,
+		    B_TRUE);
+
 	if (!domsg) {
 		err |= nvlist_add_boolean_value(nvl,
 		    FM_SUSPECT_MESSAGE, B_FALSE);
@@ -206,7 +210,8 @@
     nvlist_t *fmri, const char *uuid, const char *code,
     boolean_t faulty, boolean_t unusable, boolean_t message, nvlist_t *event,
     struct timeval *tvp, boolean_t repaired, boolean_t replaced,
-    boolean_t acquitted, boolean_t resolved, nvlist_t *diag_de)
+    boolean_t acquitted, boolean_t resolved, nvlist_t *diag_de,
+    boolean_t injected)
 {
 	nvlist_t *nvl;
 	int64_t tod[2];
@@ -240,6 +245,9 @@
 
 	if (diag_de != NULL)
 		err |= nvlist_add_nvlist(nvl, FM_SUSPECT_DE, diag_de);
+	if (injected)
+		err |= nvlist_add_boolean_value(nvl, FM_SUSPECT_INJECTED,
+		    B_TRUE);
 
 	if (event != NULL)
 		err |= nvlist_add_nvlist(nvl, FM_RSRC_ASRU_EVENT, event);
--- a/usr/src/cmd/fm/fmd/common/fmd_protocol.h	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_protocol.h	Mon Nov 02 09:11:35 2009 -0800
@@ -71,10 +71,11 @@
     uint8_t, nvlist_t *, nvlist_t *, nvlist_t *, const char *);
 extern nvlist_t *fmd_protocol_list(const char *, nvlist_t *,
     const char *, const char *, uint_t, nvlist_t **, uint8_t *, int,
-    struct timeval *);
+    struct timeval *, int);
 extern nvlist_t *fmd_protocol_rsrc_asru(const char *, nvlist_t *,
     const char *, const char *, boolean_t, boolean_t, boolean_t, nvlist_t *,
-    struct timeval *m, boolean_t, boolean_t, boolean_t, boolean_t, nvlist_t *);
+    struct timeval *m, boolean_t, boolean_t, boolean_t, boolean_t, nvlist_t *,
+    boolean_t);
 extern nvlist_t *fmd_protocol_fmderror(int, const char *, va_list);
 extern nvlist_t *fmd_protocol_moderror(struct fmd_module *, int, const char *);
 extern nvlist_t *fmd_protocol_xprt_ctl(struct fmd_module *,
--- a/usr/src/cmd/fm/fmd/common/fmd_xprt.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmd/common/fmd_xprt.c	Mon Nov 02 09:11:35 2009 -0800
@@ -1063,6 +1063,7 @@
 	fmd_xprt_impl_t *xip = (fmd_xprt_impl_t *)xp;
 	fmd_case_t *cp;
 	uint_t nelem = 0, nelem2 = 0, i;
+	boolean_t injected;
 
 	fmd_module_lock(xip->xi_queue->eq_mod);
 	cp = fmd_case_create(xip->xi_queue->eq_mod, NULL);
@@ -1149,6 +1150,13 @@
 		fmd_case_set_de_fmri(cp, de_fmri_dup);
 	}
 
+	/*
+	 * copy injected if present
+	 */
+	if (nvlist_lookup_boolean_value(nvl, FM_SUSPECT_INJECTED,
+	    &injected) == 0 && injected)
+		fmd_case_set_injected(cp);
+
 	fmd_case_transition(cp, FMD_CASE_SOLVED, FMD_CF_SOLVED);
 	fmd_module_unlock(xip->xi_queue->eq_mod);
 }
@@ -1182,6 +1190,7 @@
 	fmd_case_t *cp;
 	fmd_case_impl_t *cip;
 	int need_update = 0;
+	boolean_t injected;
 
 	if (nvlist_lookup_string(nvl, FM_SUSPECT_UUID, &uuid) != 0)
 		return;
@@ -1363,6 +1372,13 @@
 	}
 
 	/*
+	 * copy injected if present
+	 */
+	if (nvlist_lookup_boolean_value(nvl, FM_SUSPECT_INJECTED,
+	    &injected) == 0 && injected)
+		fmd_case_set_injected(cp);
+
+	/*
 	 * Transition to solved. This will log the suspect list and create
 	 * the resource cache entries.
 	 */
--- a/usr/src/cmd/fm/fmdump/common/asru.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmdump/common/asru.c	Mon Nov 02 09:11:35 2009 -0800
@@ -69,10 +69,31 @@
 	return (0);
 }
 
+/*ARGSUSED*/
 static int
 asru_verb2(fmd_log_t *lp, const fmd_log_record_t *rp, FILE *fp)
 {
-	(void) asru_verb1(lp, rp, fp);
+	char *uuid = "-";
+	boolean_t f = 0, u = 0;
+	char buf[32], state[32];
+
+	(void) nvlist_lookup_string(rp->rec_nvl, FM_RSRC_ASRU_UUID, &uuid);
+	(void) nvlist_lookup_boolean_value(rp->rec_nvl,
+	    FM_RSRC_ASRU_FAULTY, &f);
+	(void) nvlist_lookup_boolean_value(rp->rec_nvl,
+	    FM_RSRC_ASRU_UNUSABLE, &u);
+
+	state[0] = '\0';
+
+	if (f)
+		(void) strcat(state, ",faulty");
+	if (u)
+		(void) strcat(state, ",unusable");
+	if (!f && !u)
+		(void) strcat(state, ",ok");
+
+	fmdump_printf(fp, "%-20s.%9.9llu %-36s %s\n",
+	    fmdump_year(buf, sizeof (buf), rp), rp->rec_nsec, uuid, state + 1);
 
 	nvlist_print(fp, rp->rec_nvl);
 	fmdump_printf(fp, "\n");
@@ -89,7 +110,7 @@
 "TIME                 UUID                                 STATE",
 (fmd_log_rec_f *)asru_verb1
 }, {
-"TIME                 UUID                                 STATE",
+"TIME                           UUID                                 STATE",
 (fmd_log_rec_f *)asru_verb2
 }, {
 NULL, NULL
--- a/usr/src/cmd/fm/fmdump/common/fault.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmdump/common/fault.c	Mon Nov 02 09:11:35 2009 -0800
@@ -141,11 +141,31 @@
 flt_verb2(fmd_log_t *lp, const fmd_log_record_t *rp, FILE *fp)
 {
 	const struct fmdump_fmt *efp = &fmdump_err_ops.do_formats[FMDUMP_VERB1];
-	const struct fmdump_fmt *ffp = &fmdump_flt_ops.do_formats[FMDUMP_VERB1];
+	const struct fmdump_fmt *ffp = &fmdump_flt_ops.do_formats[FMDUMP_VERB2];
 	uint_t i;
+	char buf[32], str[32];
+	char *class = NULL, *uuid = "-", *code = "-";
+
+	(void) nvlist_lookup_string(rp->rec_nvl, FM_SUSPECT_UUID, &uuid);
+	(void) nvlist_lookup_string(rp->rec_nvl, FM_SUSPECT_DIAG_CODE, &code);
+
+	(void) nvlist_lookup_string(rp->rec_nvl, FM_CLASS, &class);
+	if (class != NULL && strcmp(class, FM_LIST_REPAIRED_CLASS) == 0) {
+		(void) snprintf(str, sizeof (str), "%s %s", code, "Repaired");
+		code = str;
+	}
+	if (class != NULL && strcmp(class, FM_LIST_RESOLVED_CLASS) == 0) {
+		(void) snprintf(str, sizeof (str), "%s %s", code, "Resolved");
+		code = str;
+	}
+	if (class != NULL && strcmp(class, FM_LIST_UPDATED_CLASS) == 0) {
+		(void) snprintf(str, sizeof (str), "%s %s", code, "Updated");
+		code = str;
+	}
 
 	fmdump_printf(fp, "%s\n", ffp->do_hdr);
-	(void) flt_short(lp, rp, fp);
+	fmdump_printf(fp, "%-20s.%9.9llu %-32s %s\n",
+	    fmdump_year(buf, sizeof (buf), rp), rp->rec_nsec, uuid, code);
 
 	if (rp->rec_nrefs != 0)
 		fmdump_printf(fp, "\n  %s\n", efp->do_hdr);
@@ -216,7 +236,8 @@
 "TIME                 UUID                                 SUNW-MSG-ID",
 (fmd_log_rec_f *)flt_verb1
 }, {
-NULL,
+"TIME                           UUID"
+"                                 SUNW-MSG-ID",
 (fmd_log_rec_f *)flt_verb2
 }, {
 NULL,
--- a/usr/src/cmd/fm/fmdump/common/fmdump.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fmdump/common/fmdump.c	Mon Nov 02 09:11:35 2009 -0800
@@ -730,7 +730,7 @@
 	if (iflags & FMD_LOG_XITER_OFFS)
 		fmdump_printf(arg.da_fp, "%16s ", "OFFSET");
 
-	if (arg.da_fmt->do_hdr)
+	if (arg.da_fmt->do_hdr && !(opt_V && ops == &fmdump_flt_ops))
 		fmdump_printf(arg.da_fp, "%s\n", arg.da_fmt->do_hdr);
 
 	if (opt_e && opt_u) {
--- a/usr/src/cmd/fm/fminject/common/inj_cmds.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/fm/fminject/common/inj_cmds.c	Mon Nov 02 09:11:35 2009 -0800
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -21,12 +20,10 @@
  */
 
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * The "program" executed by the injector consists of a tree of commands.
  * Routines in this file build and execute said command tree.
@@ -191,6 +188,10 @@
 		(void) fflush(stdout);
 	}
 
+	if ((errno = nvlist_add_boolean_value(ev->defn_nvl, "__injected",
+	    1)) != 0)
+		warn("failed to add __injected to %s", ev->defn_name);
+
 	if (ev->defn_decl && (ev->defn_decl->decl_flags & DECL_F_AUTOENA) &&
 	    (errno = nvlist_add_uint64(ev->defn_nvl, "ena", inj_ena())) != 0)
 		warn("failed to add ena to %s", ev->defn_name);
--- a/usr/src/cmd/syseventd/daemons/syseventd/syseventd.c	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/cmd/syseventd/daemons/syseventd/syseventd.c	Mon Nov 02 09:11:35 2009 -0800
@@ -696,7 +696,6 @@
 			d_pkg->completion_state = SE_OUTSTANDING;
 			scp->eventq = eventq->next;
 			free(eventq);
-			eventq = scp->eventq;
 			(void) mutex_unlock(&scp->client_lock);
 
 
@@ -775,6 +774,7 @@
 			(void) sema_post(d_pkg->completion_sema);
 			syseventd_print(3, "Completed delivery with "
 			    "error %d\n", error);
+			eventq = scp->eventq;
 		}
 
 		syseventd_print(3, "No more events to process for client %d\n",
--- a/usr/src/pkgdefs/SUNWfmdr/prototype_com	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/pkgdefs/SUNWfmdr/prototype_com	Mon Nov 02 09:11:35 2009 -0800
@@ -43,6 +43,6 @@
 f none kernel/drv/fm.conf 644 root sys
 d none var/fm 755 root sys
 d none var/fm/fmd 755 root sys
-d none var/fm/fmd/ckpt 700 root sys
-d none var/fm/fmd/rsrc 700 root sys
-d none var/fm/fmd/xprt 700 root sys
+d none var/fm/fmd/ckpt 755 root sys
+d none var/fm/fmd/rsrc 755 root sys
+d none var/fm/fmd/xprt 755 root sys
--- a/usr/src/uts/common/sys/fm/protocol.h	Mon Nov 02 06:49:25 2009 -0800
+++ b/usr/src/uts/common/sys/fm/protocol.h	Mon Nov 02 09:11:35 2009 -0800
@@ -83,6 +83,7 @@
 #define	FM_SUSPECT_FAULT_LIST		"fault-list"
 #define	FM_SUSPECT_FAULT_SZ		"fault-list-sz"
 #define	FM_SUSPECT_FAULT_STATUS		"fault-status"
+#define	FM_SUSPECT_INJECTED		"__injected"
 #define	FM_SUSPECT_MESSAGE		"message"
 #define	FM_SUSPECT_RETIRE		"retire"
 #define	FM_SUSPECT_RESPONSE		"response"