usr/src/uts/common/fs/nfs/nfs4_dispatch.c
author ek110237
Mon, 31 Oct 2005 22:53:57 -0800
changeset 806 849fb015aa25
parent 76 c6ba53ffbc0e
child 1267 4e080122b679
permissions -rw-r--r--
6337437 .zfs doesn't work over NFS
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     1
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     2
 * CDDL HEADER START
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     3
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     7
 * with the License.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     8
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    12
 * and limitations under the License.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    13
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    19
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    20
 * CDDL HEADER END
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    21
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    22
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    23
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    24
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    25
 * Use is subject to license terms.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    26
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    27
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    28
#pragma ident	"%Z%%M%	%I%	%E% SMI"
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    29
76
c6ba53ffbc0e 6257280 assertion triggered in nfs/rpc code (fix non-debug build)
rg137905
parents: 74
diff changeset
    30
#include <sys/systm.h>
c6ba53ffbc0e 6257280 assertion triggered in nfs/rpc code (fix non-debug build)
rg137905
parents: 74
diff changeset
    31
#include <sys/sdt.h>
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    32
#include <rpc/types.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    33
#include <rpc/auth.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    34
#include <rpc/auth_unix.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    35
#include <rpc/auth_des.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    36
#include <rpc/svc.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    37
#include <rpc/xdr.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    38
#include <nfs/nfs4.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    39
#include <nfs/nfs_dispatch.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    40
#include <nfs/nfs4_drc.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    41
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    42
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    43
 * This is the duplicate request cache for NFSv4
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    44
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    45
rfs4_drc_t *nfs4_drc = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    46
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    47
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    48
 * How long the entry can remain in the cache
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    49
 * once it has been sent to the client and not
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    50
 * used in a reply (in seconds)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    51
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    52
unsigned nfs4_drc_lifetime = 1;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    53
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    54
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    55
 * The default size of the duplicate request cache
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    56
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    57
uint32_t nfs4_drc_max = 8 * 1024;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    58
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    59
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    60
 * The number of buckets we'd like to hash the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    61
 * replies into.. do not change this on the fly.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    62
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    63
uint32_t nfs4_drc_hash = 541;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    64
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    65
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    66
 * Initialize a duplicate request cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    67
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    68
rfs4_drc_t *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    69
rfs4_init_drc(uint32_t drc_size, uint32_t drc_hash_size, unsigned ttl)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    70
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    71
	rfs4_drc_t *drc;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    72
	uint32_t   bki;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    73
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    74
	ASSERT(drc_size);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    75
	ASSERT(drc_hash_size);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    76
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    77
	drc = kmem_alloc(sizeof (rfs4_drc_t), KM_SLEEP);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    78
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    79
	drc->max_size = drc_size;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    80
	drc->in_use = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    81
	drc->drc_ttl = ttl;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    82
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    83
	mutex_init(&drc->lock, NULL, MUTEX_DEFAULT, NULL);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    84
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    85
	drc->dr_hash = drc_hash_size;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    86
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    87
	drc->dr_buckets = kmem_alloc(sizeof (list_t)*drc_hash_size, KM_SLEEP);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    88
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    89
	for (bki = 0; bki < drc_hash_size; bki++) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    90
		list_create(&drc->dr_buckets[bki], sizeof (rfs4_dupreq_t),
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    91
		    offsetof(rfs4_dupreq_t, dr_bkt_next));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    92
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    93
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    94
	list_create(&(drc->dr_cache), sizeof (rfs4_dupreq_t),
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    95
		    offsetof(rfs4_dupreq_t, dr_next));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    96
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    97
	return (drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    98
}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    99
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   100
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   101
 * Destroy a duplicate request cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   102
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   103
void
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   104
rfs4_fini_drc(rfs4_drc_t *drc)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   105
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   106
	rfs4_dupreq_t *drp, *drp_next;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   107
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   108
	ASSERT(drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   109
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   110
	/* iterate over the dr_cache and free the enties */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   111
	for (drp = list_head(&(drc->dr_cache)); drp != NULL; drp = drp_next) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   112
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   113
		if (drp->dr_state == NFS4_DUP_REPLAY)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   114
			rfs4_compound_free(&(drp->dr_res));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   115
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   116
		if (drp->dr_addr.buf != NULL)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   117
			kmem_free(drp->dr_addr.buf, drp->dr_addr.maxlen);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   118
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   119
		drp_next = list_next(&(drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   120
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   121
		kmem_free(drp, sizeof (rfs4_dupreq_t));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   122
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   123
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   124
	mutex_destroy(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   125
	kmem_free(drc->dr_buckets,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   126
		sizeof (list_t)*drc->dr_hash);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   127
	kmem_free(drc, sizeof (rfs4_drc_t));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   128
}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   129
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   130
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   131
 * rfs4_dr_chstate:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   132
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   133
 * Change the state of a rfs4_dupreq. If it's not in transition
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   134
 * to the FREE state, update the time used and return. If we
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   135
 * are moving to the FREE state then we need to clean up the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   136
 * compound results and move the entry to the end of the list.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   137
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   138
void
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   139
rfs4_dr_chstate(rfs4_dupreq_t *drp, int new_state)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   140
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   141
	rfs4_drc_t *drc;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   142
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   143
	ASSERT(drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   144
	ASSERT(drp->drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   145
	ASSERT(drp->dr_bkt);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   146
	ASSERT(MUTEX_HELD(&drp->drc->lock));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   147
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   148
	drp->dr_state = new_state;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   149
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   150
	if (new_state != NFS4_DUP_FREE) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   151
		gethrestime(&drp->dr_time_used);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   152
		return;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   153
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   154
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   155
	drc = drp->drc;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   156
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   157
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   158
	 * Remove entry from the bucket and
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   159
	 * dr_cache list, free compound results.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   160
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   161
	list_remove(drp->dr_bkt, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   162
	list_remove(&(drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   163
	rfs4_compound_free(&(drp->dr_res));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   164
}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   165
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   166
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   167
 * rfs4_alloc_dr:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   168
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   169
 * Pick an entry off the tail -- Use if it is
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   170
 * marked NFS4_DUP_FREE, or is an entry in the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   171
 * NFS4_DUP_REPLAY state that has timed-out...
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   172
 * Otherwise malloc a new one if we have not reached
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   173
 * our maximum cache limit.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   174
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   175
 * The list should be in time order, so no need
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   176
 * to traverse backwards looking for a timed out
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   177
 * entry, NFS4_DUP_FREE's are place on the tail.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   178
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   179
rfs4_dupreq_t *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   180
rfs4_alloc_dr(rfs4_drc_t *drc)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   181
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   182
	rfs4_dupreq_t *drp_tail, *drp = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   183
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   184
	ASSERT(drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   185
	ASSERT(MUTEX_HELD(&drc->lock));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   186
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   187
	if ((drp_tail = list_tail(&drc->dr_cache)) != NULL) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   188
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   189
		switch (drp_tail->dr_state) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   190
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   191
		case NFS4_DUP_FREE:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   192
			list_remove(&(drc->dr_cache), drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   193
			DTRACE_PROBE1(nfss__i__drc_freeclaim,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   194
					rfs4_dupreq_t *, drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   195
			return (drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   196
			/* NOTREACHED */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   197
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   198
		case NFS4_DUP_REPLAY:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   199
			if (gethrestime_sec() >
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   200
			    drp_tail->dr_time_used.tv_sec+drc->drc_ttl) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   201
				/* this entry has timedout so grab it. */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   202
				rfs4_dr_chstate(drp_tail, NFS4_DUP_FREE);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   203
				DTRACE_PROBE1(nfss__i__drc_ttlclaim,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   204
					rfs4_dupreq_t *, drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   205
				return (drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   206
			}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   207
			break;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   208
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   209
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   210
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   211
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   212
	 * Didn't find something to recycle have
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   213
	 * we hit the cache limit ?
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   214
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   215
	if (drc->in_use >= drc->max_size) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   216
		DTRACE_PROBE1(nfss__i__drc_full,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   217
			rfs4_drc_t *, drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   218
		return (NULL);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   219
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   220
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   221
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   222
	/* nope, so let's malloc a new one */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   223
	drp = kmem_zalloc(sizeof (rfs4_dupreq_t), KM_SLEEP);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   224
	drp->drc = drc;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   225
	drc->in_use++;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   226
	gethrestime(&drp->dr_time_created);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   227
	DTRACE_PROBE1(nfss__i__drc_new, rfs4_dupreq_t *, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   228
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   229
	return (drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   230
}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   231
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   232
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   233
 * rfs4_find_dr:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   234
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   235
 * Search for an entry in the duplicate request cache by
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   236
 * calculating the hash index based on the XID, and examining
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   237
 * the entries in the hash bucket. If we find a match stamp the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   238
 * time_used and return. If the entry does not match it could be
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   239
 * ready to be freed. Once we have searched the bucket and we
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   240
 * have not exhausted the maximum limit for the cache we will
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   241
 * allocate a new entry.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   242
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   243
int
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   244
rfs4_find_dr(struct svc_req *req, rfs4_drc_t *drc, rfs4_dupreq_t **dup)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   245
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   246
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   247
	uint32_t	the_xid;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   248
	list_t		*dr_bkt;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   249
	rfs4_dupreq_t	*drp;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   250
	int		bktdex;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   251
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   252
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   253
	 * Get the XID, calculate the bucket and search to
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   254
	 * see if we need to replay from the cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   255
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   256
	the_xid = req->rq_xprt->xp_xid;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   257
	bktdex = the_xid % drc->dr_hash;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   258
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   259
	dr_bkt = (list_t *)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   260
		&(drc->dr_buckets[(the_xid % drc->dr_hash)]);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   261
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   262
	DTRACE_PROBE3(nfss__i__drc_bktdex,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   263
			int, bktdex,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   264
			uint32_t, the_xid,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   265
			list_t *, dr_bkt);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   266
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   267
	*dup = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   268
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   269
	mutex_enter(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   270
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   271
	 * Search the bucket for a matching xid and address.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   272
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   273
	for (drp = list_head(dr_bkt); drp != NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   274
		drp = list_next(dr_bkt, drp)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   275
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   276
		if (drp->dr_xid == the_xid &&
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   277
		    drp->dr_addr.len == req->rq_xprt->xp_rtaddr.len &&
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   278
		    bcmp((caddr_t)drp->dr_addr.buf,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   279
		    (caddr_t)req->rq_xprt->xp_rtaddr.buf,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   280
		    drp->dr_addr.len) == 0) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   281
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   282
			/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   283
			 * Found a match so REPLAY the Reply
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   284
			 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   285
			if (drp->dr_state == NFS4_DUP_REPLAY) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   286
				gethrestime(&drp->dr_time_used);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   287
				mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   288
				*dup = drp;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   289
				DTRACE_PROBE1(nfss__i__drc_replay,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   290
					rfs4_dupreq_t *, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   291
				return (NFS4_DUP_REPLAY);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   292
			}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   293
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   294
			/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   295
			 * This entry must be in transition, so return
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   296
			 * the 'pending' status.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   297
			 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   298
			mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   299
			return (NFS4_DUP_PENDING);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   300
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   301
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   302
		/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   303
		 * Not a match, but maybe this entry is ready
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   304
		 * to be reused.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   305
		 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   306
		if (drp->dr_state == NFS4_DUP_REPLAY &&
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   307
			(gethrestime_sec() >
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   308
			drp->dr_time_used.tv_sec+drc->drc_ttl)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   309
			rfs4_dr_chstate(drp, NFS4_DUP_FREE);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   310
			list_insert_tail(&(drp->drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   311
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   312
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   313
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   314
	drp = rfs4_alloc_dr(drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   315
	mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   316
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   317
	if (drp == NULL) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   318
		return (NFS4_DUP_ERROR);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   319
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   320
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   321
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   322
	 * Place at the head of the list, init the state
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   323
	 * to NEW and clear the time used field.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   324
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   325
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   326
	drp->dr_state = NFS4_DUP_NEW;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   327
	drp->dr_time_used.tv_sec = drp->dr_time_used.tv_nsec = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   328
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   329
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   330
	 * If needed, resize the address buffer
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   331
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   332
	if (drp->dr_addr.maxlen < req->rq_xprt->xp_rtaddr.len) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   333
		if (drp->dr_addr.buf != NULL)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   334
			kmem_free(drp->dr_addr.buf, drp->dr_addr.maxlen);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   335
		drp->dr_addr.maxlen = req->rq_xprt->xp_rtaddr.len;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   336
		drp->dr_addr.buf = kmem_alloc(drp->dr_addr.maxlen, KM_NOSLEEP);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   337
		if (drp->dr_addr.buf == NULL) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   338
			/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   339
			 * If the malloc fails, mark the entry
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   340
			 * as free and put on the tail.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   341
			 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   342
			drp->dr_addr.maxlen = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   343
			drp->dr_state = NFS4_DUP_FREE;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   344
			mutex_enter(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   345
			list_insert_tail(&(drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   346
			mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   347
			return (NFS4_DUP_ERROR);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   348
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   349
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   350
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   351
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   352
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   353
	 * Copy the address.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   354
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   355
	drp->dr_addr.len = req->rq_xprt->xp_rtaddr.len;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   356
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   357
	bcopy((caddr_t)req->rq_xprt->xp_rtaddr.buf,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   358
		(caddr_t)drp->dr_addr.buf,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   359
		drp->dr_addr.len);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   360
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   361
	drp->dr_xid = the_xid;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   362
	drp->dr_bkt = dr_bkt;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   363
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   364
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   365
	 * Insert at the head of the bucket and
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   366
	 * the drc lists..
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   367
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   368
	mutex_enter(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   369
	list_insert_head(&drc->dr_cache, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   370
	list_insert_head(dr_bkt, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   371
	mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   372
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   373
	*dup = drp;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   374
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   375
	return (NFS4_DUP_NEW);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   376
}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   377
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   378
/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   379
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   380
 * This function handles the duplicate request cache,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   381
 * NULL_PROC and COMPOUND procedure calls for NFSv4;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   382
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   383
 * Passed into this function are:-
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   384
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   385
 * 	disp	A pointer to our dispatch table entry
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   386
 * 	req	The request to process
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   387
 * 	xprt	The server transport handle
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   388
 * 	ap	A pointer to the arguments
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   389
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   390
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   391
 * When appropriate this function is responsible for inserting
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   392
 * the reply into the duplicate cache or replaying an existing
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   393
 * cached reply.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   394
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   395
 * dr_stat 	reflects the state of the duplicate request that
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   396
 * 		has been inserted into or retrieved from the cache
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   397
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   398
 * drp		is the duplicate request entry
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   399
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   400
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   401
int
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   402
rfs4_dispatch(struct rpcdisp *disp, struct svc_req *req,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   403
		SVCXPRT *xprt, char *ap)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   404
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   405
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   406
	COMPOUND4res res_buf, *rbp;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   407
	COMPOUND4args *cap;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   408
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   409
	cred_t 	*cr = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   410
	int	error = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   411
	int 	dis_flags = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   412
	int 	dr_stat = NFS4_NOT_DUP;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   413
	rfs4_dupreq_t *drp = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   414
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   415
	ASSERT(disp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   416
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   417
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   418
	 * Short circuit the RPC_NULL proc.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   419
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   420
	if (disp->dis_proc == rpc_null) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   421
		if (!svc_sendreply(xprt, xdr_void, NULL)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   422
			return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   423
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   424
		return (0);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   425
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   426
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   427
	/* Only NFSv4 Compounds from this point onward */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   428
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   429
	rbp = &res_buf;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   430
	cap = (COMPOUND4args *)ap;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   431
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   432
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   433
	 * Figure out the disposition of the whole COMPOUND
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   434
	 * and record it's IDEMPOTENTCY.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   435
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   436
	rfs4_compound_flagproc(cap, &dis_flags);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   437
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   438
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   439
	 * If NON-IDEMPOTENT then we need to figure out if this
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   440
	 * request can be replied from the duplicate cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   441
	 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   442
	 * If this is a new request then we need to insert the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   443
	 * reply into the duplicate cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   444
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   445
	if (!(dis_flags & RPC_IDEMPOTENT)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   446
		/* look for a replay from the cache or allocate */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   447
		dr_stat = rfs4_find_dr(req, nfs4_drc, &drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   448
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   449
		switch (dr_stat) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   450
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   451
		case NFS4_DUP_ERROR:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   452
			svcerr_systemerr(xprt);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   453
			return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   454
			/* NOTREACHED */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   455
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   456
		case NFS4_DUP_PENDING:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   457
			/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   458
			 * reply has previously been inserted into the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   459
			 * duplicate cache, however the reply has
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   460
			 * not yet been sent via svc_sendreply()
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   461
			 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   462
			return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   463
			/* NOTREACHED */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   464
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   465
		case NFS4_DUP_NEW:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   466
			curthread->t_flag |= T_DONTPEND;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   467
			/* NON-IDEMPOTENT proc call */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   468
			rfs4_compound(cap, rbp, NULL, req, cr);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   469
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   470
			curthread->t_flag &= ~T_DONTPEND;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   471
			if (curthread->t_flag & T_WOULDBLOCK) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   472
				curthread->t_flag &= ~T_WOULDBLOCK;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   473
				/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   474
				 * mark this entry as FREE and plop
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   475
				 * on the end of the cache list
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   476
				 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   477
				mutex_enter(&drp->drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   478
				rfs4_dr_chstate(drp, NFS4_DUP_FREE);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   479
				list_insert_tail(&(drp->drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   480
				mutex_exit(&drp->drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   481
				return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   482
			}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   483
			drp->dr_res = res_buf;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   484
			break;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   485
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   486
		case NFS4_DUP_REPLAY:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   487
			/* replay from the cache */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   488
			rbp = &(drp->dr_res);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   489
			break;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   490
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   491
	} else {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   492
		curthread->t_flag |= T_DONTPEND;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   493
		/* IDEMPOTENT proc call */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   494
		rfs4_compound(cap, rbp, NULL, req, cr);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   495
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   496
		curthread->t_flag &= ~T_DONTPEND;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   497
		if (curthread->t_flag & T_WOULDBLOCK) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   498
			curthread->t_flag &= ~T_WOULDBLOCK;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   499
			return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   500
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   501
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   502
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   503
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   504
	 * Send out the replayed reply or the 'real' one.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   505
	 */
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 76
diff changeset
   506
	if (!svc_sendreply(xprt,  xdr_COMPOUND4res_srv, (char *)rbp)) {
74
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   507
		DTRACE_PROBE2(nfss__e__dispatch_sendfail,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   508
			struct svc_req *, xprt,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   509
			char *, rbp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   510
		error++;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   511
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   512
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   513
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   514
	 * If this reply was just inserted into the duplicate cache
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   515
	 * mark it as available for replay
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   516
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   517
	if (dr_stat == NFS4_DUP_NEW) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   518
		mutex_enter(&drp->drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   519
		rfs4_dr_chstate(drp, NFS4_DUP_REPLAY);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   520
		mutex_exit(&drp->drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   521
	} else if (dr_stat == NFS4_NOT_DUP) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   522
		rfs4_compound_free(rbp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   523
	}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   524
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   525
	return (error);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   526
}