usr/src/uts/common/fs/nfs/nfs4_dispatch.c
author rg137905
Fri, 24 Jun 2005 19:50:32 -0700
changeset 74 524df0e4e452
child 76 c6ba53ffbc0e
permissions -rw-r--r--
6257280 assertion triggered in nfs/rpc code
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
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    30
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    31
#include <rpc/types.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    32
#include <rpc/auth.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    33
#include <rpc/auth_unix.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    34
#include <rpc/auth_des.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    35
#include <rpc/svc.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    36
#include <rpc/xdr.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    37
#include <nfs/nfs4.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    38
#include <nfs/nfs_dispatch.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    39
#include <nfs/nfs4_drc.h>
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    40
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
 * This is the duplicate request cache for NFSv4
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    43
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    44
rfs4_drc_t *nfs4_drc = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    45
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
 * How long the entry can remain in the cache
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    48
 * once it has been sent to the client and not
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    49
 * used in a reply (in seconds)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    50
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    51
unsigned nfs4_drc_lifetime = 1;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    52
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
 * The default size of the duplicate request cache
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    55
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    56
uint32_t nfs4_drc_max = 8 * 1024;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    57
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
 * The number of buckets we'd like to hash the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    60
 * replies into.. do not change this on the fly.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    61
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    62
uint32_t nfs4_drc_hash = 541;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    63
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
 * Initialize a duplicate request cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    66
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    67
rfs4_drc_t *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    68
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
    69
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    70
	rfs4_drc_t *drc;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    71
	uint32_t   bki;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    72
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    73
	ASSERT(drc_size);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    74
	ASSERT(drc_hash_size);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    75
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    76
	drc = kmem_alloc(sizeof (rfs4_drc_t), KM_SLEEP);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    77
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    78
	drc->max_size = drc_size;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    79
	drc->in_use = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    80
	drc->drc_ttl = ttl;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    81
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    82
	mutex_init(&drc->lock, NULL, MUTEX_DEFAULT, NULL);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    83
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    84
	drc->dr_hash = drc_hash_size;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    85
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    86
	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
    87
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    88
	for (bki = 0; bki < drc_hash_size; bki++) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    89
		list_create(&drc->dr_buckets[bki], sizeof (rfs4_dupreq_t),
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    90
		    offsetof(rfs4_dupreq_t, dr_bkt_next));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    91
	}
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
	list_create(&(drc->dr_cache), sizeof (rfs4_dupreq_t),
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    94
		    offsetof(rfs4_dupreq_t, dr_next));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    95
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    96
	return (drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
    97
}
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
 * Destroy a duplicate request cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   101
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   102
void
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   103
rfs4_fini_drc(rfs4_drc_t *drc)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   104
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   105
	rfs4_dupreq_t *drp, *drp_next;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   106
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   107
	ASSERT(drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   108
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   109
	/* iterate over the dr_cache and free the enties */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   110
	for (drp = list_head(&(drc->dr_cache)); drp != NULL; drp = drp_next) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   111
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   112
		if (drp->dr_state == NFS4_DUP_REPLAY)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   113
			rfs4_compound_free(&(drp->dr_res));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   114
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   115
		if (drp->dr_addr.buf != NULL)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   116
			kmem_free(drp->dr_addr.buf, drp->dr_addr.maxlen);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   117
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   118
		drp_next = list_next(&(drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   119
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   120
		kmem_free(drp, sizeof (rfs4_dupreq_t));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   121
	}
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
	mutex_destroy(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   124
	kmem_free(drc->dr_buckets,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   125
		sizeof (list_t)*drc->dr_hash);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   126
	kmem_free(drc, sizeof (rfs4_drc_t));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   127
}
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
 * rfs4_dr_chstate:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   131
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   132
 * 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
   133
 * to the FREE state, update the time used and return. If we
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   134
 * 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
   135
 * compound results and move the entry to the end of the list.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   136
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   137
void
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   138
rfs4_dr_chstate(rfs4_dupreq_t *drp, int new_state)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   139
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   140
	rfs4_drc_t *drc;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   141
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   142
	ASSERT(drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   143
	ASSERT(drp->drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   144
	ASSERT(drp->dr_bkt);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   145
	ASSERT(MUTEX_HELD(&drp->drc->lock));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   146
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   147
	drp->dr_state = new_state;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   148
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   149
	if (new_state != NFS4_DUP_FREE) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   150
		gethrestime(&drp->dr_time_used);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   151
		return;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   152
	}
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
	drc = drp->drc;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   155
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
	 * Remove entry from the bucket and
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   158
	 * dr_cache list, free compound results.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   159
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   160
	list_remove(drp->dr_bkt, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   161
	list_remove(&(drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   162
	rfs4_compound_free(&(drp->dr_res));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   163
}
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
 * rfs4_alloc_dr:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   167
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   168
 * Pick an entry off the tail -- Use if it is
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   169
 * marked NFS4_DUP_FREE, or is an entry in the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   170
 * NFS4_DUP_REPLAY state that has timed-out...
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   171
 * Otherwise malloc a new one if we have not reached
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   172
 * our maximum cache limit.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   173
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   174
 * The list should be in time order, so no need
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   175
 * to traverse backwards looking for a timed out
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   176
 * entry, NFS4_DUP_FREE's are place on the tail.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   177
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   178
rfs4_dupreq_t *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   179
rfs4_alloc_dr(rfs4_drc_t *drc)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   180
{
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   181
	rfs4_dupreq_t *drp_tail, *drp = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   182
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   183
	ASSERT(drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   184
	ASSERT(MUTEX_HELD(&drc->lock));
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   185
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   186
	if ((drp_tail = list_tail(&drc->dr_cache)) != NULL) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   187
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   188
		switch (drp_tail->dr_state) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   189
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   190
		case NFS4_DUP_FREE:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   191
			list_remove(&(drc->dr_cache), drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   192
			DTRACE_PROBE1(nfss__i__drc_freeclaim,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   193
					rfs4_dupreq_t *, drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   194
			return (drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   195
			/* NOTREACHED */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   196
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   197
		case NFS4_DUP_REPLAY:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   198
			if (gethrestime_sec() >
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   199
			    drp_tail->dr_time_used.tv_sec+drc->drc_ttl) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   200
				/* this entry has timedout so grab it. */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   201
				rfs4_dr_chstate(drp_tail, NFS4_DUP_FREE);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   202
				DTRACE_PROBE1(nfss__i__drc_ttlclaim,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   203
					rfs4_dupreq_t *, drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   204
				return (drp_tail);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   205
			}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   206
			break;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   207
		}
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
	 * Didn't find something to recycle have
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   212
	 * we hit the cache limit ?
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   213
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   214
	if (drc->in_use >= drc->max_size) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   215
		DTRACE_PROBE1(nfss__i__drc_full,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   216
			rfs4_drc_t *, drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   217
		return (NULL);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   218
	}
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
	/* nope, so let's malloc a new one */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   222
	drp = kmem_zalloc(sizeof (rfs4_dupreq_t), KM_SLEEP);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   223
	drp->drc = drc;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   224
	drc->in_use++;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   225
	gethrestime(&drp->dr_time_created);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   226
	DTRACE_PROBE1(nfss__i__drc_new, rfs4_dupreq_t *, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   227
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   228
	return (drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   229
}
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
 * rfs4_find_dr:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   233
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   234
 * Search for an entry in the duplicate request cache by
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   235
 * calculating the hash index based on the XID, and examining
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   236
 * 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
   237
 * 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
   238
 * ready to be freed. Once we have searched the bucket and we
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   239
 * have not exhausted the maximum limit for the cache we will
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   240
 * allocate a new entry.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   241
 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   242
int
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   243
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
   244
{
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
	uint32_t	the_xid;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   247
	list_t		*dr_bkt;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   248
	rfs4_dupreq_t	*drp;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   249
	int		bktdex;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   250
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
	 * Get the XID, calculate the bucket and search to
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   253
	 * see if we need to replay from the cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   254
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   255
	the_xid = req->rq_xprt->xp_xid;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   256
	bktdex = the_xid % drc->dr_hash;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   257
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   258
	dr_bkt = (list_t *)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   259
		&(drc->dr_buckets[(the_xid % drc->dr_hash)]);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   260
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   261
	DTRACE_PROBE3(nfss__i__drc_bktdex,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   262
			int, bktdex,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   263
			uint32_t, the_xid,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   264
			list_t *, dr_bkt);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   265
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   266
	*dup = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   267
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   268
	mutex_enter(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   269
	/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   270
	 * Search the bucket for a matching xid and address.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   271
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   272
	for (drp = list_head(dr_bkt); drp != NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   273
		drp = list_next(dr_bkt, drp)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   274
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   275
		if (drp->dr_xid == the_xid &&
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   276
		    drp->dr_addr.len == req->rq_xprt->xp_rtaddr.len &&
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   277
		    bcmp((caddr_t)drp->dr_addr.buf,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   278
		    (caddr_t)req->rq_xprt->xp_rtaddr.buf,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   279
		    drp->dr_addr.len) == 0) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   280
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
			 * Found a match so REPLAY the Reply
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   283
			 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   284
			if (drp->dr_state == NFS4_DUP_REPLAY) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   285
				gethrestime(&drp->dr_time_used);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   286
				mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   287
				*dup = drp;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   288
				DTRACE_PROBE1(nfss__i__drc_replay,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   289
					rfs4_dupreq_t *, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   290
				return (NFS4_DUP_REPLAY);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   291
			}
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
			 * This entry must be in transition, so return
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   295
			 * the 'pending' status.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   296
			 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   297
			mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   298
			return (NFS4_DUP_PENDING);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   299
		}
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
		 * Not a match, but maybe this entry is ready
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   303
		 * to be reused.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   304
		 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   305
		if (drp->dr_state == NFS4_DUP_REPLAY &&
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   306
			(gethrestime_sec() >
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   307
			drp->dr_time_used.tv_sec+drc->drc_ttl)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   308
			rfs4_dr_chstate(drp, NFS4_DUP_FREE);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   309
			list_insert_tail(&(drp->drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   310
		}
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
	drp = rfs4_alloc_dr(drc);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   314
	mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   315
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   316
	if (drp == NULL) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   317
		return (NFS4_DUP_ERROR);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   318
	}
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
	 * Place at the head of the list, init the state
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   322
	 * to NEW and clear the time used field.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   323
	 */
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
	drp->dr_state = NFS4_DUP_NEW;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   326
	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
   327
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
	 * If needed, resize the address buffer
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   330
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   331
	if (drp->dr_addr.maxlen < req->rq_xprt->xp_rtaddr.len) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   332
		if (drp->dr_addr.buf != NULL)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   333
			kmem_free(drp->dr_addr.buf, drp->dr_addr.maxlen);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   334
		drp->dr_addr.maxlen = req->rq_xprt->xp_rtaddr.len;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   335
		drp->dr_addr.buf = kmem_alloc(drp->dr_addr.maxlen, KM_NOSLEEP);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   336
		if (drp->dr_addr.buf == NULL) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   337
			/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   338
			 * If the malloc fails, mark the entry
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   339
			 * as free and put on the tail.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   340
			 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   341
			drp->dr_addr.maxlen = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   342
			drp->dr_state = NFS4_DUP_FREE;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   343
			mutex_enter(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   344
			list_insert_tail(&(drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   345
			mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   346
			return (NFS4_DUP_ERROR);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   347
		}
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
	 * Copy the address.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   353
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   354
	drp->dr_addr.len = req->rq_xprt->xp_rtaddr.len;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   355
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   356
	bcopy((caddr_t)req->rq_xprt->xp_rtaddr.buf,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   357
		(caddr_t)drp->dr_addr.buf,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   358
		drp->dr_addr.len);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   359
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   360
	drp->dr_xid = the_xid;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   361
	drp->dr_bkt = dr_bkt;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   362
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
	 * Insert at the head of the bucket and
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   365
	 * the drc lists..
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   366
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   367
	mutex_enter(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   368
	list_insert_head(&drc->dr_cache, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   369
	list_insert_head(dr_bkt, drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   370
	mutex_exit(&drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   371
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   372
	*dup = drp;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   373
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   374
	return (NFS4_DUP_NEW);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   375
}
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
 * This function handles the duplicate request cache,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   380
 * NULL_PROC and COMPOUND procedure calls for NFSv4;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   381
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   382
 * Passed into this function are:-
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   383
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   384
 * 	disp	A pointer to our dispatch table entry
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   385
 * 	req	The request to process
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   386
 * 	xprt	The server transport handle
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   387
 * 	ap	A pointer to the arguments
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   388
 *
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
 * When appropriate this function is responsible for inserting
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   391
 * the reply into the duplicate cache or replaying an existing
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   392
 * cached reply.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   393
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   394
 * dr_stat 	reflects the state of the duplicate request that
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   395
 * 		has been inserted into or retrieved from the cache
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   396
 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   397
 * drp		is the duplicate request entry
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   398
 *
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
int
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   401
rfs4_dispatch(struct rpcdisp *disp, struct svc_req *req,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   402
		SVCXPRT *xprt, char *ap)
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   403
{
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
	COMPOUND4res res_buf, *rbp;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   406
	COMPOUND4args *cap;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   407
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   408
	cred_t 	*cr = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   409
	int	error = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   410
	int 	dis_flags = 0;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   411
	int 	dr_stat = NFS4_NOT_DUP;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   412
	rfs4_dupreq_t *drp = NULL;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   413
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   414
	ASSERT(disp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   415
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
	 * Short circuit the RPC_NULL proc.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   418
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   419
	if (disp->dis_proc == rpc_null) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   420
		if (!svc_sendreply(xprt, xdr_void, NULL)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   421
			return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   422
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   423
		return (0);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   424
	}
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
	/* Only NFSv4 Compounds from this point onward */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   427
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   428
	rbp = &res_buf;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   429
	cap = (COMPOUND4args *)ap;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   430
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
	 * Figure out the disposition of the whole COMPOUND
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   433
	 * and record it's IDEMPOTENTCY.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   434
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   435
	rfs4_compound_flagproc(cap, &dis_flags);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   436
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
	 * If NON-IDEMPOTENT then we need to figure out if this
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   439
	 * request can be replied from the duplicate cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   440
	 *
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   441
	 * If this is a new request then we need to insert the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   442
	 * reply into the duplicate cache.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   443
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   444
	if (!(dis_flags & RPC_IDEMPOTENT)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   445
		/* look for a replay from the cache or allocate */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   446
		dr_stat = rfs4_find_dr(req, nfs4_drc, &drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   447
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   448
		switch (dr_stat) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   449
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   450
		case NFS4_DUP_ERROR:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   451
			svcerr_systemerr(xprt);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   452
			return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   453
			/* NOTREACHED */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   454
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   455
		case NFS4_DUP_PENDING:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   456
			/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   457
			 * reply has previously been inserted into the
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   458
			 * duplicate cache, however the reply has
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   459
			 * not yet been sent via svc_sendreply()
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   460
			 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   461
			return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   462
			/* NOTREACHED */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   463
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   464
		case NFS4_DUP_NEW:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   465
			curthread->t_flag |= T_DONTPEND;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   466
			/* NON-IDEMPOTENT proc call */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   467
			rfs4_compound(cap, rbp, NULL, req, cr);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   468
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   469
			curthread->t_flag &= ~T_DONTPEND;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   470
			if (curthread->t_flag & T_WOULDBLOCK) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   471
				curthread->t_flag &= ~T_WOULDBLOCK;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   472
				/*
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   473
				 * mark this entry as FREE and plop
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   474
				 * on the end of the cache list
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   475
				 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   476
				mutex_enter(&drp->drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   477
				rfs4_dr_chstate(drp, NFS4_DUP_FREE);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   478
				list_insert_tail(&(drp->drc->dr_cache), drp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   479
				mutex_exit(&drp->drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   480
				return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   481
			}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   482
			drp->dr_res = res_buf;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   483
			break;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   484
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   485
		case NFS4_DUP_REPLAY:
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   486
			/* replay from the cache */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   487
			rbp = &(drp->dr_res);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   488
			break;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   489
		}
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   490
	} else {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   491
		curthread->t_flag |= T_DONTPEND;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   492
		/* IDEMPOTENT proc call */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   493
		rfs4_compound(cap, rbp, NULL, req, cr);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   494
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   495
		curthread->t_flag &= ~T_DONTPEND;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   496
		if (curthread->t_flag & T_WOULDBLOCK) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   497
			curthread->t_flag &= ~T_WOULDBLOCK;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   498
			return (1);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   499
		}
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
	 * Send out the replayed reply or the 'real' one.
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   504
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   505
	if (!svc_sendreply(xprt,  xdr_COMPOUND4res, (char *)rbp)) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   506
		DTRACE_PROBE2(nfss__e__dispatch_sendfail,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   507
			struct svc_req *, xprt,
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   508
			char *, rbp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   509
		error++;
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   510
	}
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
	 * If this reply was just inserted into the duplicate cache
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   514
	 * mark it as available for replay
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   515
	 */
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   516
	if (dr_stat == NFS4_DUP_NEW) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   517
		mutex_enter(&drp->drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   518
		rfs4_dr_chstate(drp, NFS4_DUP_REPLAY);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   519
		mutex_exit(&drp->drc->lock);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   520
	} else if (dr_stat == NFS4_NOT_DUP) {
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   521
		rfs4_compound_free(rbp);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   522
	}
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
	return (error);
524df0e4e452 6257280 assertion triggered in nfs/rpc code
rg137905
parents:
diff changeset
   525
}