usr/src/uts/common/fs/nfs/nfs4_client_debug.c
author jpk
Fri, 24 Mar 2006 12:29:20 -0800
changeset 1676 37f4a3e2bd99
parent 0 68f95e015346
child 3517 79d66aa80b8b
permissions -rw-r--r--
PSARC/2002/762 Layered Trusted Solaris PSARC/2005/060 TSNET: Trusted Networking with Security Labels PSARC/2005/259 Layered Trusted Solaris Label Interfaces PSARC/2005/573 Solaris Trusted Extensions for Printing PSARC/2005/691 Trusted Extensions for Device Allocation PSARC/2005/723 Solaris Trusted Extensions Filesystem Labeling PSARC/2006/009 Labeled Auditing PSARC/2006/155 Trusted Extensions RBAC Changes PSARC/2006/191 is_system_labeled 6293271 Zone processes should use zone_kcred instead of kcred 6394554 integrate Solaris Trusted Extensions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 *	Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 *	Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/cred.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/kstat.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/list.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/vfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/vnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <nfs/nfs4_clnt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <nfs/rnode4.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * Recovery kstats
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
typedef struct rkstat {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
	kstat_named_t	badhandle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
	kstat_named_t	badowner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
	kstat_named_t	clientid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
	kstat_named_t	dead_file;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	kstat_named_t	delay;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
	kstat_named_t	fail_relock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
	kstat_named_t	file_diff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
	kstat_named_t	no_grace;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
	kstat_named_t	not_responding;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	kstat_named_t	opens_changed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
	kstat_named_t	siglost;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	kstat_named_t	unexp_action;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	kstat_named_t	unexp_errno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	kstat_named_t	unexp_status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	kstat_named_t	wrongsec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	kstat_named_t	lost_state_bad_op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
} rkstat_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
static rkstat_t rkstat_template = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	{ "badhandle",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
	{ "badowner",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
	{ "clientid",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
	{ "dead_file",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
	{ "delay",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
	{ "fail_relock",	KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	{ "file_diff",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	{ "no_grace",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	{ "not_responding",	KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
	{ "opens_changed",	KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
	{ "siglost",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
	{ "unexp_action",	KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
	{ "unexp_errno",	KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
	{ "unexp_status",	KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
	{ "wrongsec",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
	{ "bad_op",		KSTAT_DATA_ULONG },
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
/* maximum number of messages allowed on the mi's mi_msg_list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
int nfs4_msg_max = NFS4_MSG_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
#define	DEFAULT_LEASE	180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
static char *strdup(const char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * Sets the appropiate fields of "ep", given "id" and various parameters.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 * Assumes that ep's fields have been initialized to zero/null, except for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 * re_type and mount point info, which are already set.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
set_event(nfs4_event_type_t id, nfs4_revent_t *ep, mntinfo4_t *mi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
    rnode4_t *rp1, rnode4_t *rp2, uint_t count, pid_t pid, nfsstat4 nfs4_error,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
    char *server1, char *why, nfs4_tag_type_t tag1, nfs4_tag_type_t tag2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
    seqid4 seqid1, seqid4 seqid2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	switch (id) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	case RE_BAD_SEQID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		ep->re_mi = mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		/* bad seqid'd file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		if (rp1 && rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
		/* for LOCK/LOCKU */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
		ep->re_pid = pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
		ep->re_stat4 = nfs4_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		ep->re_tag1 = tag1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
		ep->re_tag2 = tag2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		ep->re_seqid1 = seqid1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
		ep->re_seqid2 = seqid2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	case RE_BADHANDLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
		ASSERT(rp1 != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
		/* dead file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
		if (rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	case RE_CLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
		ep->re_mi = mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
		/* the error we failed with */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
		ep->re_uint = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
		ep->re_stat4 = nfs4_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	case RE_DEAD_FILE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
		ASSERT(rp1 != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
		/* dead file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		if (rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		/* why the file got killed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
		if (why) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
			len = strlen(why);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
			ep->re_char2 = kmem_alloc(len + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
			bcopy(why, ep->re_char2, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
			ep->re_char2[len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
			ep->re_char2 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		ep->re_stat4 = nfs4_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	case RE_END:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		/* first rnode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
		if (rp1 && rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		/* second rnode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
		if (rp2 && rp2->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
			ep->re_char2 = fn_path(rp2->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
			ep->re_char2 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
		ep->re_rp2 = rp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		ep->re_mi = mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	case RE_FAIL_RELOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
		ASSERT(rp1 != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
		/* error on fail relock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
		ep->re_uint = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
		/* process that failed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
		ep->re_pid = pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
		/* nfs4 error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
		ep->re_stat4 = nfs4_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
		/* file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
		if (rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	case RE_FAIL_REMAP_LEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		/* length of returned filehandle */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		ep->re_uint = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	case RE_FAIL_REMAP_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	case RE_FAILOVER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
		/* server we're failing over to (if not picking original) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
		if (server1 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
			len = strlen(server1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
			ep->re_char1 = kmem_alloc(len + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
			bcopy(server1, ep->re_char1, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
			ep->re_char1[len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	case RE_FILE_DIFF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		ASSERT(rp1 != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
		/* dead file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
		if (rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	case RE_LOST_STATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		ep->re_uint = count;		/* op number */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		if (rp1 && rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		if (rp2 && rp2->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
			ep->re_char2 = fn_path(rp2->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
			ep->re_char2 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		ep->re_rp2 = rp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	case RE_OPENS_CHANGED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
		ep->re_mi = mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
		/* original number of open files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
		ep->re_uint = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
		/* new number of open files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
		ep->re_pid = pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
	case RE_SIGLOST:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	case RE_SIGLOST_NO_DUMP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		ASSERT(rp1 != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		/* file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		if (rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		ep->re_pid = pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		ep->re_uint = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
		ep->re_stat4 = nfs4_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
	case RE_START:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		/* file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
		if (rp1 && rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		/* file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		if (rp2 && rp2->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
			ep->re_char2 = fn_path(rp2->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
			ep->re_char2 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		ep->re_rp2 = rp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		ep->re_mi = mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
		ep->re_uint = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
	case RE_UNEXPECTED_ACTION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
	case RE_UNEXPECTED_ERRNO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
		/* the error that is unexpected */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
		ep->re_uint = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	case RE_UNEXPECTED_STATUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
		/* nfsstat4 error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
		ep->re_stat4 = nfs4_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
	case RE_WRONGSEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		/* the error we failed with */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		ep->re_uint = count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		/* file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		if (rp1 && rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
			ep->re_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		/* file <path/component name> */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		if (rp2 && rp2->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
			ep->re_char2 = fn_path(rp2->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
			ep->re_char2 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
		ep->re_rp2 = rp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	case RE_LOST_STATE_BAD_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
		ep->re_uint = count;	/* the unexpected op */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
		ep->re_pid = pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
		ep->re_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
		if (rp1 != NULL && rp1->r_svnode.sv_name != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
			ep->re_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
		ep->re_rp2 = rp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		if (rp2 != NULL && rp2->r_svnode.sv_name != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
			ep->re_char2 = fn_path(rp2->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
 * Sets the appropiate fields of the 'fact' for this 'id'.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
set_fact(nfs4_fact_type_t id, nfs4_rfact_t *fp, nfsstat4 stat4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
    nfs4_recov_t raction, nfs_opnum4 op, bool_t reboot, int error,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
    vnode_t *vp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	rnode4_t *rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
	switch (id) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
	case RF_BADOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		fp->rf_op = op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		fp->rf_reboot = reboot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		fp->rf_stat4 = stat4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	case RF_RENEW_EXPIRED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	case RF_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		fp->rf_op = op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
		fp->rf_reboot = reboot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
		fp->rf_stat4 = stat4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		fp->rf_action = raction;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		fp->rf_error = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
	case RF_SRV_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	case RF_SRV_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	case RF_SRVS_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	case RF_SRVS_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
		gethrestime(&fp->rf_time);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	case RF_DELMAP_CB_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
		fp->rf_op = op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
		fp->rf_stat4 = stat4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
		rp1 = VTOR4(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
		fp->rf_rp1 = rp1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
		if (rp1 && rp1->r_svnode.sv_name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
			fp->rf_char1 = fn_path(rp1->r_svnode.sv_name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
			fp->rf_char1 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
		zcmn_err(getzoneid(), CE_NOTE, "illegal fact %d", id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
 * Returns 1 if the event/fact is of a successful communication
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
 * from the server; 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
successful_comm(nfs4_debug_msg_t *msgp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	if (msgp->msg_type == RM_EVENT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		switch (msgp->rmsg_u.msg_event.re_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
		case RE_BAD_SEQID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		case RE_BADHANDLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
		case RE_FAIL_REMAP_LEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
		case RE_FAIL_REMAP_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
		case RE_FILE_DIFF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		case RE_START:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
		case RE_UNEXPECTED_ACTION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		case RE_UNEXPECTED_ERRNO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		case RE_UNEXPECTED_STATUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
		case RE_WRONGSEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
		case RE_CLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
		case RE_DEAD_FILE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
		case RE_END:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
		case RE_FAIL_RELOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
		case RE_FAILOVER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
		case RE_LOST_STATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
		case RE_OPENS_CHANGED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
		case RE_SIGLOST:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
		case RE_SIGLOST_NO_DUMP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
		case RE_LOST_STATE_BAD_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		switch (msgp->rmsg_u.msg_fact.rf_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		case RF_BADOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		case RF_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
		case RF_RENEW_EXPIRED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
		case RF_SRV_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
		case RF_SRVS_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
		case RF_DELMAP_CB_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
			return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
		case RF_SRV_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
		case RF_SRVS_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
 * Iterate backwards through the mi's mi_msg_list to find the earliest
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
 * message that we should find relevant facts to investigate.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
static nfs4_debug_msg_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
find_beginning(nfs4_debug_msg_t *first_msg, mntinfo4_t *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	nfs4_debug_msg_t	*oldest_msg, *cur_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	time_t			lease;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	ASSERT(mutex_owned(&mi->mi_msg_list_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
	if (mi->mi_lease_period > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
		lease = 2 * mi->mi_lease_period;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
		lease = DEFAULT_LEASE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	oldest_msg = first_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
	cur_msg = list_prev(&mi->mi_msg_list, first_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
	while (cur_msg &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
	    first_msg->msg_time.tv_sec - cur_msg->msg_time.tv_sec < lease) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		oldest_msg = cur_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		if ((cur_msg->msg_type == RM_FACT) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
		    (cur_msg->rmsg_u.msg_fact.rf_type == RF_SRV_OK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
			/* find where we lost contact with the server */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
			while (cur_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
				if ((cur_msg->msg_type == RM_FACT) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
				    (cur_msg->rmsg_u.msg_fact.rf_type ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
				    RF_SRV_NOT_RESPOND))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
					break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
				oldest_msg = cur_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
				cur_msg = list_prev(&mi->mi_msg_list, cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
			 * Find the first successful message before
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
			 * we lost contact with the server.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
			if (cur_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
				cur_msg = list_prev(&mi->mi_msg_list, cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
				while (cur_msg && !successful_comm(cur_msg)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
					oldest_msg = cur_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
					cur_msg = list_prev(&mi->mi_msg_list,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
					    cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
			 * If we're not at the dummy head pointer,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			 * set the oldest and current message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
			if (cur_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
				first_msg = cur_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
				oldest_msg = cur_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
				cur_msg = list_prev(&mi->mi_msg_list, cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
			cur_msg = list_prev(&mi->mi_msg_list, cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	return (oldest_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
 * Returns 1 if facts have been found; 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
get_facts(nfs4_debug_msg_t *msgp, nfs4_rfact_t *ret_fp, char **mnt_pt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
mntinfo4_t *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	nfs4_debug_msg_t	*cur_msg, *oldest_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	nfs4_rfact_t		*cur_fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	int			found_a_fact = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	int			len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	cur_msg = msgp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	/* find the oldest msg to search backwards to */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	oldest_msg = find_beginning(cur_msg, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	ASSERT(oldest_msg != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	 * Create a fact sheet by searching from our current message
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	 * backwards to the 'oldest_msg', recording facts along the way
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	 * until we found facts that have been inspected by another time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	while (cur_msg && cur_msg != list_prev(&mi->mi_msg_list, oldest_msg)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		if (cur_msg->msg_type != RM_FACT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
			cur_msg = list_prev(&mi->mi_msg_list, cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
		cur_fp = &cur_msg->rmsg_u.msg_fact;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
		 * If this fact has already been looked at, then so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		 * have all preceding facts.  Return Now.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
		if (cur_fp->rf_status == RFS_INSPECT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
			return (found_a_fact);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
		cur_fp->rf_status = RFS_INSPECT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
		found_a_fact = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
		switch (cur_fp->rf_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
		case RF_BADOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
		case RF_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
			 * Don't want to overwrite a fact that was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
			 * previously found during our current search.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
			if (!ret_fp->rf_reboot)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
				ret_fp->rf_reboot = cur_fp->rf_reboot;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
			if (!ret_fp->rf_stat4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
				ret_fp->rf_stat4 = cur_fp->rf_stat4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
			if (!ret_fp->rf_action)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
				ret_fp->rf_action = cur_fp->rf_action;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		case RF_RENEW_EXPIRED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
			if (cur_msg->msg_mntpt && !(*mnt_pt)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
				len = strlen(cur_msg->msg_mntpt) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
				*mnt_pt = kmem_alloc(len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
				bcopy(cur_msg->msg_mntpt, *mnt_pt, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
		case RF_SRV_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
		case RF_SRV_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
			 * Okay to overwrite this fact as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
			 * we want the earliest time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
			ret_fp->rf_time = cur_fp->rf_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
		case RF_SRVS_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
		case RF_SRVS_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
		case RF_DELMAP_CB_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
			zcmn_err(getzoneid(), CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
			    "get facts: illegal fact %d", cur_fp->rf_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
		cur_msg = list_prev(&mi->mi_msg_list, cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
	return (found_a_fact);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
 * Returns 1 if this fact is identical to the last fact recorded
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
 * (only checks for a match within the last 2 lease periods).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
facts_same(nfs4_debug_msg_t *cur_msg, nfs4_debug_msg_t *new_msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
    mntinfo4_t *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	nfs4_rfact_t	*fp1, *fp2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	int		lease, len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	ASSERT(mutex_owned(&mi->mi_msg_list_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	if (mi->mi_lease_period > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
		lease = 2 * mi->mi_lease_period;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
		lease = DEFAULT_LEASE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	fp2 = &new_msg->rmsg_u.msg_fact;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	while (cur_msg &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	    new_msg->msg_time.tv_sec - cur_msg->msg_time.tv_sec < lease) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		if (cur_msg->msg_type != RM_FACT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
			cur_msg = list_prev(&mi->mi_msg_list, cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		fp1 = &cur_msg->rmsg_u.msg_fact;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		if (fp1->rf_type != fp2->rf_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
		/* now actually compare the facts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		if (fp1->rf_action != fp2->rf_action)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
		if (fp1->rf_stat4 != fp2->rf_stat4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
		if (fp1->rf_reboot != fp2->rf_reboot)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
		if (fp1->rf_op != fp2->rf_op)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
		if (fp1->rf_time.tv_sec != fp2->rf_time.tv_sec)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
		if (fp1->rf_error != fp2->rf_error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
		if (fp1->rf_rp1 != fp2->rf_rp1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
		if (cur_msg->msg_srv != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
			if (new_msg->msg_srv == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
			len = strlen(cur_msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
			if (strncmp(cur_msg->msg_srv, new_msg->msg_srv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
				len) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
		} else if (new_msg->msg_srv != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
		if (cur_msg->msg_mntpt != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
			if (new_msg->msg_mntpt == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
			len = strlen(cur_msg->msg_mntpt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
			if (strncmp(cur_msg->msg_mntpt, new_msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
				len) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
		} else if (new_msg->msg_mntpt != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
		if (fp1->rf_char1 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
			if (fp2->rf_char1 == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
			len = strlen(fp1->rf_char1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
			if (strncmp(fp1->rf_char1, fp2->rf_char1, len) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
				return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		} else if (fp2->rf_char1 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
 * Returns 1 if these two messages are identical; 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
events_same(nfs4_debug_msg_t *cur_msg, nfs4_debug_msg_t *new_msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
    mntinfo4_t *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	nfs4_revent_t	*ep1, *ep2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
	int		len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	/* find the last event, bypassing all facts */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
	while (cur_msg && cur_msg->msg_type != RM_EVENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
		cur_msg = list_prev(&mi->mi_msg_list, cur_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	if (!cur_msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	if (cur_msg->msg_type != RM_EVENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	ep1 = &cur_msg->rmsg_u.msg_event;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	ep2 = &new_msg->rmsg_u.msg_event;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	if (ep1->re_type != ep2->re_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	 * Since we zalloc the buffer, then the two nfs4_debug_msg's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	 * must match up even if all the fields weren't filled in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
	 * the first place.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
	if (ep1->re_mi != ep2->re_mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	if (ep1->re_uint != ep2->re_uint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	if (ep1->re_stat4 != ep2->re_stat4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	if (ep1->re_pid != ep2->re_pid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	if (ep1->re_rp1 != ep2->re_rp1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
	if (ep1->re_rp2 != ep2->re_rp2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
	if (ep1->re_tag1 != ep2->re_tag1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	if (ep1->re_tag2 != ep2->re_tag2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	if (ep1->re_seqid1 != ep2->re_seqid1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	if (ep1->re_seqid2 != ep2->re_seqid2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
	if (cur_msg->msg_srv != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		if (new_msg->msg_srv == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
		len = strlen(cur_msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
		if (strncmp(cur_msg->msg_srv, new_msg->msg_srv, len) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	} else if (new_msg->msg_srv != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	if (ep1->re_char1 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		if (ep2->re_char1 == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
		len = strlen(ep1->re_char1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
		if (strncmp(ep1->re_char1, ep2->re_char1, len) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	} else if (ep2->re_char1 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
	if (ep1->re_char2 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
		if (ep2->re_char2 == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
		len = strlen(ep1->re_char2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
		if (strncmp(ep1->re_char2, ep2->re_char2, len) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
	} else if (ep2->re_char2 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
	if (cur_msg->msg_mntpt != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
		if (new_msg->msg_mntpt == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
		len = strlen(cur_msg->msg_mntpt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
		if (strncmp(cur_msg->msg_mntpt, cur_msg->msg_mntpt, len) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
			return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
	} else if (new_msg->msg_mntpt != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
	return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
 * Free up a recovery event.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
free_event(nfs4_revent_t *ep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
	int	len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
	if (ep->re_char1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
		len = strlen(ep->re_char1) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
		kmem_free(ep->re_char1, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
	if (ep->re_char2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
		len = strlen(ep->re_char2) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
		kmem_free(ep->re_char2, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
 * Free up a recovery fact.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
free_fact(nfs4_rfact_t *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
	int	len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
	if (fp->rf_char1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
		len = strlen(fp->rf_char1) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
		kmem_free(fp->rf_char1, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
 * Free up the message.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
nfs4_free_msg(nfs4_debug_msg_t *msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
	if (msg->msg_type == RM_EVENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
		free_event(&msg->rmsg_u.msg_event);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
		free_fact(&msg->rmsg_u.msg_fact);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
	if (msg->msg_srv) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
		len = strlen(msg->msg_srv) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
		kmem_free(msg->msg_srv, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
	if (msg->msg_mntpt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
		len = strlen(msg->msg_mntpt) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
		kmem_free(msg->msg_mntpt, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	/* free up the data structure itself */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	kmem_free(msg, sizeof (*msg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
 * Prints out the interesting facts for recovery events:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
 * -DEAD_FILE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
 * -SIGLOST(_NO_DUMP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
print_facts(nfs4_debug_msg_t *msg, mntinfo4_t *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	nfs4_rfact_t *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	char *mount_pt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	if (msg->rmsg_u.msg_event.re_type != RE_DEAD_FILE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
	    msg->rmsg_u.msg_event.re_type != RE_SIGLOST &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
	    msg->rmsg_u.msg_event.re_type != RE_SIGLOST_NO_DUMP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
	fp = kmem_zalloc(sizeof (*fp), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
	mount_pt = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
	if (get_facts(msg, fp, &mount_pt, mi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
		char	time[256];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
		if (fp->rf_time.tv_sec)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
			(void) snprintf(time, 256, "%ld",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
			    (gethrestime_sec() - fp->rf_time.tv_sec)/60);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
		zcmn_err(mi->mi_zone->zone_id, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
		    "!NFS4 FACT SHEET: %s%s %s%s %s %s%s%s %s%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
		    fp->rf_action ? "\n Action: " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
		    fp->rf_action ? nfs4_recov_action_to_str(fp->rf_action) :
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
		    "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
		    fp->rf_stat4 ? "\n NFS4 error: " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
		    fp->rf_stat4 ? nfs4_stat_to_str(fp->rf_stat4) : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
		    fp->rf_reboot ? "\n Suspected server reboot. " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
		    fp->rf_time.tv_sec ? "\n Server was down for " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
		    fp->rf_time.tv_sec ? time : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
		    fp->rf_time.tv_sec ? " minutes." : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
		    mount_pt ? " \n Client's lease expired on mount " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
		    mount_pt ? mount_pt : "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
	if (mount_pt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
		len = strlen(mount_pt) + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
		kmem_free(mount_pt, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	/* free the fact struct itself */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
	if (fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
		kmem_free(fp, sizeof (*fp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
 * Print an event message to /var/adm/messages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
 * The last argument to this fuction dictates the repeat status
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
 * of the event. If set to 1, it means that we are dumping this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
 * event and it will _never_ be printed after this time. Else if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
 * set to 0 it will be printed again.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
queue_print_event(nfs4_debug_msg_t *msg, mntinfo4_t *mi, int dump)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
	nfs4_revent_t		*ep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
	zoneid_t		zoneid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
	ep = &msg->rmsg_u.msg_event;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	zoneid = mi->mi_zone->zone_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
	switch (ep->re_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
	case RE_BAD_SEQID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
		    "Operation %s for file %s (rnode_pt 0x%p), pid %d using "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
		    "seqid %d got %s.  Last good seqid was %d for "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
		    "operation %s.",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
		    msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
		    nfs4_ctags[ep->re_tag1].ct_str, ep->re_char1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
		    (void *)ep->re_rp1, ep->re_pid, ep->re_seqid1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
		    nfs4_stat_to_str(ep->re_stat4), ep->re_seqid2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
		    nfs4_ctags[ep->re_tag2].ct_str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
	case RE_BADHANDLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
		ASSERT(ep->re_rp1 != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
		if (ep->re_char1 != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
			zcmn_err(zoneid, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
			    "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
			    "server %s said filehandle was "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
			    "invalid for file: %s (rnode_pt 0x%p) on mount %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
			    msg->msg_srv, msg->msg_mntpt, msg->msg_srv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
			    ep->re_char1, (void *)ep->re_rp1, msg->msg_mntpt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
			zcmn_err(zoneid, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
			    "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
			    "server %s said filehandle was "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
			    "invalid for file: (rnode_pt 0x%p) on mount %s"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
			    " for fh:", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
			    msg->msg_srv, (void *)ep->re_rp1, msg->msg_mntpt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
			sfh4_printfhandle(ep->re_rp1->r_fh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
	case RE_CLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
		    "Can't recover clientid on mount point %s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
		    "(mi 0x%p) due to error %d (%s), for server %s.  Marking "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
		    "file system as unusable.",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
		    msg->msg_srv, msg->msg_mntpt, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
		    (void *)ep->re_mi, ep->re_uint,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
		    nfs4_stat_to_str(ep->re_stat4),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
		    msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	case RE_DEAD_FILE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
		    "File %s (rnode_pt: %p) was closed due to NFS "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
		    "recovery error on server %s(%s %s)", msg->msg_srv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
		    msg->msg_mntpt, ep->re_char1, (void *)ep->re_rp1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		    msg->msg_srv, ep->re_char2 ? ep->re_char2 : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
		    ep->re_stat4 ? nfs4_stat_to_str(ep->re_stat4) : "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
	case RE_END:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
		    "NFS Recovery done for mount %s (mi 0x%p) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
		    "on server %s, rnode_pt1 %s (0x%p), "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
		    "rnode_pt2 %s (0x%p)", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
		    msg->msg_mntpt, (void *)ep->re_mi, msg->msg_srv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
		    ep->re_char1, (void *)ep->re_rp1, ep->re_char2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
		    (void *)ep->re_rp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	case RE_FAIL_RELOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
		    "Couldn't reclaim lock for pid %d for "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
		    "file %s (rnode_pt 0x%p) on (server %s): error %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
		    msg->msg_srv, msg->msg_mntpt, ep->re_pid, ep->re_char1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
		    (void *)ep->re_rp1, msg->msg_srv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
		    ep->re_uint ? ep->re_uint : ep->re_stat4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
	case RE_FAIL_REMAP_LEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
		    "remap_lookup: server %s returned bad "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
		    "fhandle length (%d)", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
		    msg->msg_srv, ep->re_uint);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
	case RE_FAIL_REMAP_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
		    "remap_lookup: didn't get expected OP_GETFH"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
		    " for server %s", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
		    msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
	case RE_FAILOVER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
		if (ep->re_char1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
			zcmn_err(zoneid, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
			    "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
			    "failing over from %s to %s", msg->msg_srv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
			    msg->msg_mntpt, msg->msg_srv, ep->re_char1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
			zcmn_err(zoneid, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
			    "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
			    "NFS4: failing over: selecting "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
			    "original server %s", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
			    msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
	case RE_FILE_DIFF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
		    "File %s (rnode_pt: %p) on server %s was closed "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
		    "and failed attempted failover since its is different than "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
		    "the original file", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
		    ep->re_char1, (void *)ep->re_rp1, msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
	case RE_LOST_STATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
		    "Lost %s request for fs %s, file %s (rnode_pt: 0x%p), "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
		    "dir %s (0x%p) for server %s", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
		    nfs4_op_to_str(ep->re_uint), msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
		    ep->re_char1, (void *)ep->re_rp1, ep->re_char2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
		    (void *)ep->re_rp2, msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
	case RE_OPENS_CHANGED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
		    "The number of open files to reopen changed "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
		    "for mount %s mi 0x%p (old %d, new %d) on server %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
		    msg->msg_srv, msg->msg_mntpt, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
		    (void *)ep->re_mi, ep->re_uint, ep->re_pid, msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
	case RE_SIGLOST:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	case RE_SIGLOST_NO_DUMP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
		if (ep->re_uint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
			zcmn_err(zoneid, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
			    "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
			    "Process %d lost its locks on "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
			    "file %s (rnode_pt: %p) due to NFS recovery error "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
			    "(%d) on server %s.", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
			    ep->re_pid, ep->re_char1, (void *)ep->re_rp1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
			    ep->re_uint, msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
			zcmn_err(zoneid, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
			    "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
			    "Process %d lost its locks on "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
			    "file %s (rnode_pt: %p) due to NFS recovery error "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
			    "(%s) on server %s.", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
			    ep->re_pid, ep->re_char1, (void *)ep->re_rp1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
			    nfs4_stat_to_str(ep->re_stat4), msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
	case RE_START:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
		    "NFS Starting recovery for mount %s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
		    "(mi 0x%p mi_recovflags [0x%x]) on server %s, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
		    "rnode_pt1 %s (0x%p), rnode_pt2 %s (0x%p)", msg->msg_srv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
		    msg->msg_mntpt, msg->msg_mntpt, (void *)ep->re_mi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
		    ep->re_uint, msg->msg_srv, ep->re_char1, (void *)ep->re_rp1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
		    ep->re_char2, (void *)ep->re_rp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
	case RE_UNEXPECTED_ACTION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
		    "NFS recovery: unexpected action (%s) on server %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
		    msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
		    nfs4_recov_action_to_str(ep->re_uint), msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
	case RE_UNEXPECTED_ERRNO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
		    "NFS recovery: unexpected errno (%d) on server %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
		    msg->msg_srv, msg->msg_mntpt, ep->re_uint, msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
	case RE_UNEXPECTED_STATUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
		    "NFS recovery: unexpected NFS status code (%s) "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
		    "on server %s", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
		    nfs4_stat_to_str(ep->re_stat4),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
		    msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
	case RE_WRONGSEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
		    "NFS can't recover from NFS4ERR_WRONGSEC."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
		    "  error %d for server %s: rnode_pt1 %s (0x%p)"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
		    " rnode_pt2 %s (0x%p)", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
		    ep->re_uint, msg->msg_srv, ep->re_char1, (void *)ep->re_rp1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
		    ep->re_char2, (void *)ep->re_rp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	case RE_LOST_STATE_BAD_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
		    "NFS lost state with unrecognized op (%d)."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
		    "  fs %s, server %s, pid %d, file %s (rnode_pt: 0x%p), "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
		    "dir %s (0x%p)", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
		    ep->re_uint, msg->msg_mntpt, msg->msg_srv, ep->re_pid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
		    ep->re_char1, (void *)ep->re_rp1, ep->re_char2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
		    (void *)ep->re_rp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
		zcmn_err(zoneid, CE_WARN,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
		    "!queue_print_event: illegal event %d", ep->re_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
	print_facts(msg, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
	 * If set this event will not be printed again and is considered
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
	 * dumped.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
	if (dump)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
		msg->msg_status = NFS4_MS_NO_DUMP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
 * Print a fact message to /var/adm/messages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
queue_print_fact(nfs4_debug_msg_t *msg, int dump)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	nfs4_rfact_t	*fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
	zoneid_t	zoneid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
	fp = &msg->rmsg_u.msg_fact;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
	zoneid = getzoneid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
	switch (fp->rf_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
	case RF_BADOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
		    "NFSMAPID_DOMAIN does not match the server: %s domain\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
		    "Please check configuration", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
		    msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
	case RF_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
		if (fp->rf_error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
			zcmn_err(zoneid, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
			    "![NFS4][Server: %s][Mntpt: %s]NFS op %s got "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
			    "error %d causing recovery action %s.%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
			    msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
			    nfs4_op_to_str(fp->rf_op), fp->rf_error,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
			    nfs4_recov_action_to_str(fp->rf_action),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
			    fp->rf_reboot ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
			    "  Client also suspects that the server rebooted,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
			    " or experienced a network partition." : "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
			zcmn_err(zoneid, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
			    "![NFS4][Server: %s][Mntpt: %s]NFS op %s got "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
			    "error %s causing recovery action %s.%s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
			    msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
			    nfs4_op_to_str(fp->rf_op),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
			    nfs4_stat_to_str(fp->rf_stat4),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
			    nfs4_recov_action_to_str(fp->rf_action),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
			    fp->rf_reboot ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
			    "  Client also suspects that the server rebooted,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
			    " or experienced a network partition." : "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
	case RF_RENEW_EXPIRED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
		    "NFS4 renew thread detected client's "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
		    "lease has expired. Current open files/locks/IO may fail",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
		    msg->msg_srv, msg->msg_mntpt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	case RF_SRV_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
		    "NFS server %s not responding; still trying\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
		    msg->msg_srv, msg->msg_mntpt, msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
	case RF_SRV_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
		    "NFS server %s ok", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
		    msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	case RF_SRVS_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
		    "NFS servers %s not responding; still trying", msg->msg_srv,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
		    msg->msg_mntpt, msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
	case RF_SRVS_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
		    "NFS servers %s ok", msg->msg_srv, msg->msg_mntpt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
		    msg->msg_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
	case RF_DELMAP_CB_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
		zcmn_err(zoneid, CE_NOTE, "![NFS4][Server: %s][Mntpt: %s]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
		    "NFS op %s got error %s when executing delmap on file %s "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
		    "(rnode_pt 0x%p).",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		    msg->msg_srv, msg->msg_mntpt, nfs4_op_to_str(fp->rf_op),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
		    nfs4_stat_to_str(fp->rf_stat4), fp->rf_char1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
		    (void *)fp->rf_rp1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
		zcmn_err(zoneid, CE_WARN, "!queue_print_fact: illegal fact %d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
		    fp->rf_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	 * If set this fact will not be printed again and is considered
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
	 * dumped.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
	if (dump)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
		msg->msg_status = NFS4_MS_NO_DUMP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
 * Returns 1 if the entire queue should be dumped, 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
id_to_dump_queue(nfs4_event_type_t id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
	switch (id) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
	case RE_DEAD_FILE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
	case RE_SIGLOST:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
	case RE_WRONGSEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
	case RE_CLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
 * Returns 1 if the event (but not the entire queue) should be printed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
 * 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
id_to_dump_solo_event(nfs4_event_type_t id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
	switch (id) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
	case RE_BAD_SEQID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
	case RE_BADHANDLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
	case RE_FAIL_REMAP_LEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
	case RE_FAIL_REMAP_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
	case RE_FAILOVER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
	case RE_OPENS_CHANGED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
	case RE_SIGLOST_NO_DUMP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
	case RE_UNEXPECTED_ACTION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
	case RE_UNEXPECTED_ERRNO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
	case RE_UNEXPECTED_STATUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
	case RE_LOST_STATE_BAD_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
 * Returns 1 if the fact (but not the entire queue) should be printed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
 * 0 otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
id_to_dump_solo_fact(nfs4_fact_type_t id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
	switch (id) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
	case RF_SRV_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
	case RF_SRV_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
	case RF_SRVS_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
	case RF_SRVS_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
		return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
 * Update a kernel stat
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
update_recov_kstats(nfs4_debug_msg_t *msg, mntinfo4_t *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
	rkstat_t	*rsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
	if (!mi->mi_recov_ksp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
	rsp = (rkstat_t *)mi->mi_recov_ksp->ks_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
	if (msg->msg_type == RM_EVENT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
		switch (msg->rmsg_u.msg_event.re_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
		case RE_BADHANDLE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
			rsp->badhandle.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		case RE_CLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
			rsp->clientid.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
		case RE_DEAD_FILE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
			rsp->dead_file.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
		case RE_FAIL_RELOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
			rsp->fail_relock.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
		case RE_FILE_DIFF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
			rsp->file_diff.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
		case RE_OPENS_CHANGED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
			rsp->opens_changed.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
		case RE_SIGLOST:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
		case RE_SIGLOST_NO_DUMP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
			rsp->siglost.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
		case RE_UNEXPECTED_ACTION:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
			rsp->unexp_action.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
		case RE_UNEXPECTED_ERRNO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
			rsp->unexp_errno.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
		case RE_UNEXPECTED_STATUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
			rsp->unexp_status.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
		case RE_WRONGSEC:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
			rsp->wrongsec.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
		case RE_LOST_STATE_BAD_OP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
			rsp->lost_state_bad_op.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
	} else if (msg->msg_type == RM_FACT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
		switch (msg->rmsg_u.msg_fact.rf_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
		case RF_BADOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
			rsp->badowner.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
		case RF_SRV_NOT_RESPOND:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
			rsp->not_responding.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
 * Dump the mi's mi_msg_list of recovery messages.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
dump_queue(mntinfo4_t *mi, nfs4_debug_msg_t *msg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
	nfs4_debug_msg_t *tmp_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
	ASSERT(mutex_owned(&mi->mi_msg_list_lock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
	/* update kstats */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
	update_recov_kstats(msg, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
	 * If we aren't supposed to dump the queue then see if we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
	 * should just print this single message, then return.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
	if (!id_to_dump_queue(msg->rmsg_u.msg_event.re_type)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
		if (id_to_dump_solo_event(msg->rmsg_u.msg_event.re_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
			queue_print_event(msg, mi, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
	 * Write all events/facts in the queue that haven't been
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
	 * previously written to disk.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
	tmp_msg = list_head(&mi->mi_msg_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
	while (tmp_msg) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
		if (tmp_msg->msg_status == NFS4_MS_DUMP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
			if (tmp_msg->msg_type == RM_EVENT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
				queue_print_event(tmp_msg, mi, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
			else if (tmp_msg->msg_type == RM_FACT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
				queue_print_fact(tmp_msg, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
		tmp_msg = list_next(&mi->mi_msg_list, tmp_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
 * Places the event into mi's debug recovery message queue.  Some of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
 * fields can be overloaded to be a generic value, depending on the event
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
 * type.  These include "count", "why".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
nfs4_queue_event(nfs4_event_type_t id, mntinfo4_t *mi, char *server1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
    uint_t count, vnode_t *vp1, vnode_t *vp2, nfsstat4 nfs4_error,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
    char *why, pid_t pid, nfs4_tag_type_t tag1, nfs4_tag_type_t tag2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
    seqid4 seqid1, seqid4 seqid2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
	nfs4_debug_msg_t	*msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
	nfs4_revent_t		*ep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
	char			*cur_srv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
	rnode4_t		*rp1 = NULL, *rp2 = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
	refstr_t		*mntpt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
	ASSERT(mi != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
	if (vp1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
		rp1 = VTOR4(vp1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
	if (vp2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
		rp2 = VTOR4(vp2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
	 * Initialize the message with the relevent server/mount_pt/time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	 * information. Also place the relevent event related info.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
	msg = kmem_zalloc(sizeof (*msg), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
	msg->msg_type = RM_EVENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
	msg->msg_status = NFS4_MS_DUMP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
	ep = &msg->rmsg_u.msg_event;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
	ep->re_type = id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
	gethrestime(&msg->msg_time);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
	cur_srv = mi->mi_curr_serv->sv_hostname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
	msg->msg_srv = strdup(cur_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	mntpt = vfs_getmntpoint(mi->mi_vfsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
	msg->msg_mntpt = strdup(refstr_value(mntpt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
	refstr_rele(mntpt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
	set_event(id, ep, mi, rp1, rp2, count, pid, nfs4_error, server1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
	    why, tag1, tag2, seqid1, seqid2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
	mutex_enter(&mi->mi_msg_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
	/* if this event is the same as the last event, drop it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
	if (events_same(list_tail(&mi->mi_msg_list), msg, mi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
		mutex_exit(&mi->mi_msg_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
		nfs4_free_msg(msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
	/* queue the message at the end of the list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
	list_insert_tail(&mi->mi_msg_list, msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	dump_queue(mi, msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
	if (mi->mi_msg_count == nfs4_msg_max) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
		nfs4_debug_msg_t *rm_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
		/* remove the queue'd message at the front of the list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
		rm_msg = list_head(&mi->mi_msg_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
		list_remove(&mi->mi_msg_list, rm_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
		mutex_exit(&mi->mi_msg_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
		nfs4_free_msg(rm_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
		mi->mi_msg_count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
		mutex_exit(&mi->mi_msg_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
 * Places the fact into mi's debug recovery messages queue.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
nfs4_queue_fact(nfs4_fact_type_t fid, mntinfo4_t *mi, nfsstat4 stat4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
    nfs4_recov_t raction, nfs_opnum4 op, bool_t reboot, char *srvname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
    int error, vnode_t *vp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
	nfs4_debug_msg_t	*msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
	nfs4_rfact_t		*fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
	char			*cur_srv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
	refstr_t		*mntpt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
	 * Initialize the message with the relevent server/mount_pt/time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
	 * information. Also place the relevent fact related info.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
	msg = kmem_zalloc(sizeof (*msg), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
	msg->msg_type = RM_FACT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
	msg->msg_status = NFS4_MS_DUMP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	gethrestime(&msg->msg_time);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
	if (srvname)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
		cur_srv = srvname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
		cur_srv = mi->mi_curr_serv->sv_hostname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
	msg->msg_srv = strdup(cur_srv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
	mntpt = vfs_getmntpoint(mi->mi_vfsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
	msg->msg_mntpt = strdup(refstr_value(mntpt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
	refstr_rele(mntpt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
	fp = &msg->rmsg_u.msg_fact;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
	fp->rf_type = fid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
	fp->rf_status = RFS_NO_INSPECT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
	set_fact(fid, fp, stat4, raction, op, reboot, error, vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
	update_recov_kstats(msg, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	mutex_enter(&mi->mi_msg_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	/* if this fact is the same as the last fact, drop it */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	if (facts_same(list_tail(&mi->mi_msg_list), msg, mi)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
		mutex_exit(&mi->mi_msg_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
		nfs4_free_msg(msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
	/* queue the message at the end of the list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
	list_insert_tail(&mi->mi_msg_list, msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
	if (id_to_dump_solo_fact(msg->rmsg_u.msg_fact.rf_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
		queue_print_fact(msg, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
	if (mi->mi_msg_count == nfs4_msg_max) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
		nfs4_debug_msg_t *rm_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
		/* remove the queue'd message at the front of the list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
		rm_msg = list_head(&mi->mi_msg_list);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
		list_remove(&mi->mi_msg_list, rm_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
		mutex_exit(&mi->mi_msg_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
		nfs4_free_msg(rm_msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
		mi->mi_msg_count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
		mutex_exit(&mi->mi_msg_list_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
 * Initialize the 'mi_recov_kstat' kstat.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
nfs4_mnt_recov_kstat_init(vfs_t *vfsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
	mntinfo4_t *mi = VFTOMI4(vfsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
	kstat_t		*ksp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
	zoneid_t	zoneid = mi->mi_zone->zone_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
	 * Create the version specific kstats.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
	 * PSARC 2001/697 Contract Private Interface
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
	 * All nfs kstats are under SunMC contract
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	 * Please refer to the PSARC listed above and contact
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	 * SunMC before making any changes!
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
	 * Changes must be reviewed by Solaris File Sharing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	 * Changes must be communicated to [email protected]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
	 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
	if ((ksp = kstat_create_zone("nfs", getminor(vfsp->vfs_dev),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
	    "mi_recov_kstat", "misc", KSTAT_TYPE_NAMED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
	    sizeof (rkstat_t) / sizeof (kstat_named_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
	    KSTAT_FLAG_WRITABLE, zoneid)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
		mi->mi_recov_ksp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
		zcmn_err(GLOBAL_ZONEID, CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
		    "!mi_recov_kstat for mi %p failed\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
		    (void *)mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
	if (zoneid != GLOBAL_ZONEID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
		kstat_zone_add(ksp, GLOBAL_ZONEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
	mi->mi_recov_ksp = ksp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
	bcopy(&rkstat_template, ksp->ks_data, sizeof (rkstat_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
	kstat_install(ksp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
 * Increment the "delay" kstat.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
nfs4_mi_kstat_inc_delay(mntinfo4_t *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
	rkstat_t    *rsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	if (!mi->mi_recov_ksp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
	rsp = (rkstat_t *)mi->mi_recov_ksp->ks_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
	rsp->delay.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
 * Increment the "no_grace" kstat.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
nfs4_mi_kstat_inc_no_grace(mntinfo4_t *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
	rkstat_t	*rsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
	if (!mi->mi_recov_ksp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	rsp = (rkstat_t *)mi->mi_recov_ksp->ks_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
	rsp->no_grace.value.ul++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
 * Allocate and copy a string.  XXX There really ought to be a single
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
 * strdup() for the entire kernel.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
static char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
strdup(const char *s)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
	size_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
	char *new;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
	len = strlen(s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
	new = kmem_alloc(len + 1, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
	bcopy(s, new, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
	new[len] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
	return (new);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
}