usr/src/uts/common/fs/nfs/nfs4_state.c
author calum
Tue, 18 Jul 2006 04:09:41 -0700
changeset 2390 ffba0dc9ebeb
parent 2035 a29bc457bcb9
child 2668 1f2fb37babae
permissions -rw-r--r--
6431153 memory leak in rfs4_ss_clid_write_one() 6431310 memory leak in rfs4_dss_newpath()
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
     5
 * Common Development and Distribution License (the "License").
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
    22
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/kmem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/atomic.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/clconf.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/cladm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/flock.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <nfs/export.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#include <nfs/nfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#include <nfs/nfs4.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <nfs/nfssys.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <nfs/lm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/pathname.h>
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
    41
#include <sys/nvpair.h>
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
extern time_t rfs4_start_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
stateid4 special0 = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
	0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
stateid4 special1 = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
	0xffffffff,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
		(char)0xff, (char)0xff, (char)0xff, (char)0xff,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
		(char)0xff, (char)0xff, (char)0xff, (char)0xff,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
		(char)0xff, (char)0xff, (char)0xff, (char)0xff
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#define	ISSPECIAL(id)  (stateid4_cmp(id, &special0) || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
			stateid4_cmp(id, &special1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
/* For embedding the cluster nodeid into our clientid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
#define	CLUSTER_NODEID_SHIFT	24
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
#define	CLUSTER_MAX_NODEID	255
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
int rfs4_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
static uint32_t rfs4_database_debug = 0x00;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
    74
static void rfs4_ss_clid_write(rfs4_client_t *cp, char *leaf);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
    75
static void rfs4_ss_clid_write_one(rfs4_client_t *cp, char *dir, char *leaf);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
    76
static void rfs4_dss_clear_oldstate(rfs4_servinst_t *sip);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
    77
static void rfs4_ss_chkclid_sip(rfs4_client_t *cp, rfs4_servinst_t *sip);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
    78
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 * Couple of simple init/destroy functions for a general waiter
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
rfs4_sw_init(rfs4_state_wait_t *swp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
	mutex_init(swp->sw_cv_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	cv_init(swp->sw_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	swp->sw_active = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	swp->sw_wait_count = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
rfs4_sw_destroy(rfs4_state_wait_t *swp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	mutex_destroy(swp->sw_cv_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
	cv_destroy(swp->sw_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
rfs4_sw_enter(rfs4_state_wait_t *swp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	mutex_enter(swp->sw_cv_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	while (swp->sw_active) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
		swp->sw_wait_count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		cv_wait(swp->sw_cv, swp->sw_cv_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		swp->sw_wait_count--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
	ASSERT(swp->sw_active == FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	swp->sw_active = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	mutex_exit(swp->sw_cv_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
rfs4_sw_exit(rfs4_state_wait_t *swp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
	mutex_enter(swp->sw_cv_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	ASSERT(swp->sw_active == TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
	swp->sw_active = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
	if (swp->sw_wait_count != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
		cv_broadcast(swp->sw_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
	mutex_exit(swp->sw_cv_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
 * CPR callback id -- not related to v4 callbacks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
static callb_id_t cpr_id = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
deep_lock_copy(LOCK4res *dres, LOCK4res *sres)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	lock_owner4 *slo = &sres->LOCK4res_u.denied.owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	lock_owner4 *dlo = &dres->LOCK4res_u.denied.owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	if (sres->status == NFS4ERR_DENIED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
		dlo->owner_val = kmem_alloc(slo->owner_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
		bcopy(slo->owner_val, dlo->owner_val, slo->owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
deep_lock_free(LOCK4res *res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	lock_owner4 *lo = &res->LOCK4res_u.denied.owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	if (res->status == NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
		kmem_free(lo->owner_val, lo->owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
deep_open_copy(OPEN4res *dres, OPEN4res *sres)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
	nfsace4 *sacep, *dacep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
	if (sres->status != NFS4_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
	dres->attrset = sres->attrset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	switch (sres->delegation.delegation_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
	case OPEN_DELEGATE_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	case OPEN_DELEGATE_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		sacep = &sres->delegation.open_delegation4_u.read.permissions;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
		dacep = &dres->delegation.open_delegation4_u.read.permissions;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	case OPEN_DELEGATE_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
		sacep = &sres->delegation.open_delegation4_u.write.permissions;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
		dacep = &dres->delegation.open_delegation4_u.write.permissions;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
	dacep->who.utf8string_val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
		kmem_alloc(sacep->who.utf8string_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
	bcopy(sacep->who.utf8string_val, dacep->who.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
	    sacep->who.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
deep_open_free(OPEN4res *res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	nfsace4 *acep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	if (res->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	switch (res->delegation.delegation_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	case OPEN_DELEGATE_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	case OPEN_DELEGATE_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		acep = &res->delegation.open_delegation4_u.read.permissions;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	case OPEN_DELEGATE_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		acep = &res->delegation.open_delegation4_u.write.permissions;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	if (acep->who.utf8string_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		kmem_free(acep->who.utf8string_val, acep->who.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
		acep->who.utf8string_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
rfs4_free_reply(nfs_resop4 *rp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	switch (rp->resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
	case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		deep_lock_free(&rp->nfs_resop4_u.oplock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
		deep_open_free(&rp->nfs_resop4_u.opopen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
rfs4_copy_reply(nfs_resop4 *dst, nfs_resop4 *src)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
	*dst = *src;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
	/* Handle responses that need deep copy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
	switch (src->resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
	case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		deep_lock_copy(&dst->nfs_resop4_u.oplock,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
			    &src->nfs_resop4_u.oplock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		deep_open_copy(&dst->nfs_resop4_u.opopen,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
			    &src->nfs_resop4_u.opopen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
	};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
 * This is the implementation of the underlying state engine. The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
 * public interface to this engine is described by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
 * nfs4_state.h. Callers to the engine should hold no state engine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
 * locks when they call in to it. If the protocol needs to lock data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
 * structures it should do so after acquiring all references to them
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
 * first and then follow the following lock order:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
 *	client > openowner > state > lo_state > lockowner > file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
 * Internally we only allow a thread to hold one hash bucket lock at a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
 * time and the lock is higher in the lock order (must be acquired
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
 * first) than the data structure that is on that hash list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
 * If a new reference was acquired by the caller, that reference needs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
 * to be released after releasing all acquired locks with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
 * corresponding rfs4_*_rele routine.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
 * This code is some what prototypical for now. Its purpose currently is to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
 * implement the interfaces sufficiently to finish the higher protocol
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
 * elements. This will be replaced by a dynamically resizeable tables
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
 * backed by kmem_cache allocator. However synchronization is handled
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
 * correctly (I hope) and will not change by much.  The mutexes for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
 * the hash buckets that can be used to create new instances of data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
 * structures  might be good candidates to evolve into reader writer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
 * locks. If it has to do a creation, it would be holding the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
 * mutex across a kmem_alloc with KM_SLEEP specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
#define	TABSIZE 17
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
#define	TABSIZE 2047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
#define	ADDRHASH(key) ((unsigned long)(key) >> 3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
/* Used to serialize create/destroy of rfs4_server_state database */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
kmutex_t	rfs4_state_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
static rfs4_database_t *rfs4_server_state = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
/* Used to serialize lookups of clientids */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
static	krwlock_t	rfs4_findclient_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
 * For now this "table" is exposed so that the CPR callback
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
 * function can tromp through it..
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
rfs4_table_t *rfs4_client_tab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
static rfs4_index_t *rfs4_clientid_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
static rfs4_index_t *rfs4_nfsclnt_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
static rfs4_table_t *rfs4_openowner_tab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
static rfs4_index_t *rfs4_openowner_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
static rfs4_table_t *rfs4_state_tab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
static rfs4_index_t *rfs4_state_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
static rfs4_index_t *rfs4_state_owner_file_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
static rfs4_index_t *rfs4_state_file_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
static rfs4_table_t *rfs4_lo_state_tab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
static rfs4_index_t *rfs4_lo_state_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
static rfs4_index_t *rfs4_lo_state_owner_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
static rfs4_table_t *rfs4_lockowner_tab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
static rfs4_index_t *rfs4_lockowner_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
static rfs4_index_t *rfs4_lockowner_pid_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
static rfs4_table_t *rfs4_file_tab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
static rfs4_index_t *rfs4_file_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
static rfs4_table_t *rfs4_deleg_state_tab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
static rfs4_index_t *rfs4_deleg_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
static rfs4_index_t *rfs4_deleg_state_idx;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
#define	MAXTABSZ 1024*1024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
/* The values below are rfs4_lease_time units */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
#define	CLIENT_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
#define	OPENOWNER_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
#define	STATE_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
#define	LO_STATE_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
#define	LOCKOWNER_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
#define	FILE_CACHE_TIME 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
#define	DELEG_STATE_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
#define	CLIENT_CACHE_TIME 10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
#define	OPENOWNER_CACHE_TIME 5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
#define	STATE_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
#define	LO_STATE_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
#define	LOCKOWNER_CACHE_TIME 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
#define	FILE_CACHE_TIME 40
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
#define	DELEG_STATE_CACHE_TIME 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
static time_t rfs4_client_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
static time_t rfs4_openowner_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
static time_t rfs4_state_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
static time_t rfs4_lo_state_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
static time_t rfs4_lockowner_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
static time_t rfs4_file_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
static time_t rfs4_deleg_state_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
static bool_t rfs4_client_create(rfs4_entry_t, void *);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   340
static void rfs4_dss_remove_cpleaf(rfs4_client_t *);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   341
static void rfs4_dss_remove_leaf(rfs4_servinst_t *, char *, char *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
static void rfs4_client_destroy(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
static bool_t rfs4_client_expiry(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
static uint32_t clientid_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
static bool_t clientid_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
static void *clientid_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
static uint32_t nfsclnt_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
static bool_t nfsclnt_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
static void *nfsclnt_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
static bool_t rfs4_openowner_create(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
static void rfs4_openowner_destroy(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
static bool_t rfs4_openowner_expiry(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
static uint32_t openowner_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
static bool_t openowner_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
static void *openowner_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
static bool_t rfs4_state_create(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
static void rfs4_state_destroy(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
static bool_t rfs4_state_expiry(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
static uint32_t state_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
static bool_t state_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
static void *state_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
static uint32_t state_owner_file_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
static bool_t state_owner_file_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
static void *state_owner_file_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
static uint32_t state_file_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
static bool_t state_file_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
static void *state_file_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
static bool_t rfs4_lo_state_create(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
static void rfs4_lo_state_destroy(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
static bool_t rfs4_lo_state_expiry(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
static uint32_t lo_state_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
static bool_t lo_state_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
static void *lo_state_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
static uint32_t lo_state_lo_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
static bool_t lo_state_lo_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
static void *lo_state_lo_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
static bool_t rfs4_lockowner_create(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
static void rfs4_lockowner_destroy(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
static bool_t rfs4_lockowner_expiry(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
static uint32_t lockowner_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
static bool_t lockowner_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
static void *lockowner_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
static uint32_t pid_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
static bool_t pid_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
static void *pid_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
static bool_t rfs4_file_create(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
static void rfs4_file_destroy(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
static uint32_t file_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
static bool_t file_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
static void *file_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
static bool_t rfs4_deleg_state_create(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
static void rfs4_deleg_state_destroy(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
static bool_t rfs4_deleg_state_expiry(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
static uint32_t deleg_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
static bool_t deleg_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
static void *deleg_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
static uint32_t deleg_state_hash(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
static bool_t deleg_state_compare(rfs4_entry_t, void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
static void *deleg_state_mkkey(rfs4_entry_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
static void rfs4_state_rele_nounlock(rfs4_state_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
static int rfs4_ss_enabled = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
extern void (*rfs4_client_clrst)(struct nfs4clrst_args *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
rfs4_ss_pnfree(rfs4_ss_pn_t *ss_pn)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
	kmem_free(ss_pn, sizeof (rfs4_ss_pn_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
static rfs4_ss_pn_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
rfs4_ss_pnalloc(char *dir, char *leaf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	rfs4_ss_pn_t *ss_pn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	int 	dir_len, leaf_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
	 * validate we have a resonable path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	 * (account for the '/' and trailing null)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	if ((dir_len = strlen(dir)) > MAXPATHLEN ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		(leaf_len = strlen(leaf)) > MAXNAMELEN ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		(dir_len + leaf_len + 2) > MAXPATHLEN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	ss_pn = kmem_alloc(sizeof (rfs4_ss_pn_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
	(void) snprintf(ss_pn->pn, MAXPATHLEN, "%s/%s", dir, leaf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
	/* Handy pointer to just the leaf name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
	ss_pn->leaf = ss_pn->pn + dir_len + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
	return (ss_pn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
 * Move the "leaf" filename from "sdir" directory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
 * to the "ddir" directory. Return the pathname of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
 * the destination unless the rename fails in which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
 * case we need to return the source pathname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
static rfs4_ss_pn_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
rfs4_ss_movestate(char *sdir, char *ddir, char *leaf)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	rfs4_ss_pn_t *src, *dst;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   449
	if ((src = rfs4_ss_pnalloc(sdir, leaf)) == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	if ((dst = rfs4_ss_pnalloc(ddir, leaf)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
		rfs4_ss_pnfree(src);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	 * If the rename fails we shall return the src
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	 * pathname and free the dst. Otherwise we need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	 * to free the src and return the dst pathanme.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
	if (vn_rename(src->pn, dst->pn, UIO_SYSSPACE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		rfs4_ss_pnfree(dst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		return (src);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	rfs4_ss_pnfree(src);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	return (dst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
static rfs4_oldstate_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
rfs4_ss_getstate(vnode_t *dvp, rfs4_ss_pn_t *ss_pn)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
	struct uio uio;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
	struct iovec iov[3];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
	rfs4_oldstate_t *cl_ss = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	vnode_t *vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	vattr_t va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	uint_t id_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	int err, kill_file, file_vers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   483
	if (ss_pn == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	 * open the state file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	if (vn_open(ss_pn->pn, UIO_SYSSPACE, FREAD, 0, &vp, 0, 0) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	if (vp->v_type != VREG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
		(void) VOP_CLOSE(vp, FREAD, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
		VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	err = VOP_ACCESS(vp, VREAD, 0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	if (err) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
		 * We don't have read access? better get the heck out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
		(void) VOP_CLOSE(vp, FREAD, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
	(void) VOP_RWLOCK(vp, V_WRITELOCK_FALSE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	 * get the file size to do some basic validation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	va.va_mask = AT_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	err = VOP_GETATTR(vp, &va, 0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
	kill_file = (va.va_size == 0 || va.va_size <
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
		(NFS4_VERIFIER_SIZE + sizeof (uint_t)+1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	if (err || kill_file) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
		(void) VOP_CLOSE(vp, FREAD, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
		VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
		if (kill_file) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
			(void) VOP_REMOVE(dvp, ss_pn->leaf, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	cl_ss = kmem_alloc(sizeof (rfs4_oldstate_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	 * build iovecs to read in the file_version, verifier and id_len
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	iov[0].iov_base = (caddr_t)&file_vers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	iov[0].iov_len = sizeof (int);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   536
	iov[1].iov_base = (caddr_t)&cl_ss->cl_id4.verifier;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
	iov[1].iov_len = NFS4_VERIFIER_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
	iov[2].iov_base = (caddr_t)&id_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
	iov[2].iov_len = sizeof (uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
	uio.uio_iov = iov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
	uio.uio_iovcnt = 3;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	uio.uio_segflg = UIO_SYSSPACE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	uio.uio_loffset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	uio.uio_resid = sizeof (int) + NFS4_VERIFIER_SIZE + sizeof (uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	if (err = VOP_READ(vp, &uio, FREAD, CRED(), NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
		(void) VOP_CLOSE(vp, FREAD, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
		VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
		kmem_free(cl_ss, sizeof (rfs4_oldstate_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	 * if the file_version doesn't match or if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	 * id_len is zero or the combination of the verifier,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	 * id_len and id_val is bigger than the file we have
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	 * a problem. If so ditch the file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	kill_file = (file_vers != NFS4_SS_VERSION || id_len == 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	    (id_len + NFS4_VERIFIER_SIZE + sizeof (uint_t)) > va.va_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	if (err || kill_file) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
		(void) VOP_CLOSE(vp, FREAD, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
		VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
		kmem_free(cl_ss, sizeof (rfs4_oldstate_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
		if (kill_file) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
			(void) VOP_REMOVE(dvp, ss_pn->leaf, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	 * now get the client id value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	cl_ss->cl_id4.id_val = kmem_alloc(id_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	iov[0].iov_base = cl_ss->cl_id4.id_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	iov[0].iov_len = id_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	uio.uio_iov = iov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	uio.uio_iovcnt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	uio.uio_segflg = UIO_SYSSPACE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	uio.uio_resid = cl_ss->cl_id4.id_len = id_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	if (err = VOP_READ(vp, &uio, FREAD, CRED(), NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		(void) VOP_CLOSE(vp, FREAD, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		kmem_free(cl_ss->cl_id4.id_val, id_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		kmem_free(cl_ss, sizeof (rfs4_oldstate_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
	VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	(void) VOP_CLOSE(vp, FREAD, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
	return (cl_ss);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
#ifdef	nextdp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
#undef nextdp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
#define	nextdp(dp)	((struct dirent64 *)((char *)(dp) + (dp)->d_reclen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
/*
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   608
 * Add entries from statedir to supplied oldstate list.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   609
 * Optionally, move all entries from statedir -> destdir.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
void
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   612
rfs4_ss_oldstate(rfs4_oldstate_t *oldstate, char *statedir, char *destdir)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	rfs4_ss_pn_t *ss_pn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	rfs4_oldstate_t *cl_ss = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	char	*dirt = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	int	err, dir_eof = 0, size = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	vnode_t *dvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
	struct iovec iov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	struct uio uio;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	struct dirent64 *dep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	offset_t dirchunk_offset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	 * open the state directory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	 */
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   627
	if (vn_open(statedir, UIO_SYSSPACE, FREAD, 0, &dvp, 0, 0))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
		return;
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   629
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   630
	if (dvp->v_type != VDIR || VOP_ACCESS(dvp, VREAD, 0, CRED()))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
		goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	dirt = kmem_alloc(RFS4_SS_DIRSIZE, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
	 * Get and process the directory entries
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
	while (!dir_eof) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		(void) VOP_RWLOCK(dvp, V_WRITELOCK_FALSE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
		iov.iov_base = dirt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
		iov.iov_len = RFS4_SS_DIRSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
		uio.uio_iov = &iov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
		uio.uio_iovcnt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
		uio.uio_segflg = UIO_SYSSPACE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
		uio.uio_loffset = dirchunk_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
		uio.uio_resid = RFS4_SS_DIRSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
		err = VOP_READDIR(dvp, &uio, CRED(), &dir_eof);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
		VOP_RWUNLOCK(dvp, V_WRITELOCK_FALSE, NULL);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   650
		if (err)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
			goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
		size = RFS4_SS_DIRSIZE - uio.uio_resid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
		 * Process all the directory entries in this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
		 * readdir chunk
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
		for (dep = (struct dirent64 *)dirt; size > 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
			dep = nextdp(dep)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
			size -= dep->d_reclen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
			dirchunk_offset = dep->d_off;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
			 * Skip '.' and '..'
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
			 */
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   668
			if (NFS_IS_DOTNAME(dep->d_name))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
				continue;
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   670
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   671
			ss_pn = rfs4_ss_pnalloc(statedir, dep->d_name);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   672
			if (ss_pn == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
			if (cl_ss = rfs4_ss_getstate(dvp, ss_pn)) {
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   676
				if (destdir != NULL) {
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
					rfs4_ss_pnfree(ss_pn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
					cl_ss->ss_pn = rfs4_ss_movestate(
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   679
						statedir, destdir, dep->d_name);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
					cl_ss->ss_pn = ss_pn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
				}
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   683
				insque(cl_ss, oldstate);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
				rfs4_ss_pnfree(ss_pn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	}
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   689
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	(void) VOP_CLOSE(dvp, FREAD, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	VN_RELE(dvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
	if (dirt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
		kmem_free((caddr_t)dirt, RFS4_SS_DIRSIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
rfs4_ss_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
{
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   700
	int npaths = 1;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   701
	char *default_dss_path = NFS4_DSS_VAR_DIR;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   702
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   703
	/* read the default stable storage state */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   704
	rfs4_dss_readstate(npaths, &default_dss_path);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	rfs4_ss_enabled = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
rfs4_ss_fini(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
{
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   712
	rfs4_servinst_t *sip;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   713
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   714
	mutex_enter(&rfs4_servinst_lock);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   715
	sip = rfs4_cur_servinst;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   716
	while (sip != NULL) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   717
		rfs4_dss_clear_oldstate(sip);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   718
		sip = sip->next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   719
	}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   720
	mutex_exit(&rfs4_servinst_lock);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   721
}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   722
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   723
/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   724
 * Remove all oldstate files referenced by this servinst.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   725
 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   726
static void
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   727
rfs4_dss_clear_oldstate(rfs4_servinst_t *sip)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   728
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   729
	rfs4_oldstate_t *os_head, *osp;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   730
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   731
	rw_enter(&sip->oldstate_lock, RW_WRITER);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   732
	os_head = sip->oldstate;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   733
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   734
	if (os_head == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
		return;
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   736
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   737
	/* skip dummy entry */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   738
	osp = os_head->next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   739
	while (osp != os_head) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   740
		char *leaf = osp->ss_pn->leaf;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   741
		rfs4_oldstate_t *os_next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   742
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   743
		rfs4_dss_remove_leaf(sip, NFS4_DSS_OLDSTATE_LEAF, leaf);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   744
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   745
		if (osp->cl_id4.id_val)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   746
			kmem_free(osp->cl_id4.id_val, osp->cl_id4.id_len);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   747
		if (osp->ss_pn)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   748
			kmem_free(osp->ss_pn, sizeof (rfs4_ss_pn_t));
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   749
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   750
		os_next = osp->next;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   751
		remque(osp);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   752
		kmem_free(osp, sizeof (rfs4_oldstate_t));
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   753
		osp = os_next;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   756
	/* free dummy entry */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   757
	kmem_free(osp, sizeof (rfs4_oldstate_t));
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   758
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   759
	sip->oldstate = NULL;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   760
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   761
	rw_exit(&sip->oldstate_lock);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   762
}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   763
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   764
/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   765
 * Form the state and oldstate paths, and read in the stable storage files.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   766
 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   767
void
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   768
rfs4_dss_readstate(int npaths, char **paths)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   769
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   770
	int i;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   771
	char *state, *oldstate;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   772
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   773
	state = kmem_alloc(MAXPATHLEN, KM_SLEEP);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   774
	oldstate = kmem_alloc(MAXPATHLEN, KM_SLEEP);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   775
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   776
	for (i = 0; i < npaths; i++) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   777
		char *path = paths[i];
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   778
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   779
		(void) sprintf(state, "%s/%s", path, NFS4_DSS_STATE_LEAF);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   780
		(void) sprintf(oldstate, "%s/%s", path, NFS4_DSS_OLDSTATE_LEAF);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   781
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   782
		/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   783
		 * Populate the current server instance's oldstate list.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   784
		 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   785
		 * 1. Read stable storage data from old state directory,
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   786
		 *    leaving its contents alone.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   787
		 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   788
		 * 2. Read stable storage data from state directory,
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   789
		 *    and move the latter's contents to old state
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   790
		 *    directory.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   791
		 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   792
		rfs4_ss_oldstate(rfs4_cur_servinst->oldstate, oldstate, NULL);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   793
		rfs4_ss_oldstate(rfs4_cur_servinst->oldstate, state, oldstate);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
	}
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   795
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   796
	kmem_free(state, MAXPATHLEN);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   797
	kmem_free(oldstate, MAXPATHLEN);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
 * Check if we are still in grace and if the client can be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
 * granted permission to perform reclaims.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
rfs4_ss_chkclid(rfs4_client_t *cp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
{
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   808
	rfs4_servinst_t *sip;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
	/*
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   811
	 * It should be sufficient to check the oldstate data for just
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   812
	 * this client's instance. However, since our per-instance
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   813
	 * client grouping is solely temporal, HA-NFSv4 RG failover
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   814
	 * might result in clients of the same RG being partitioned into
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   815
	 * separate instances.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   816
	 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   817
	 * Until the client grouping is improved, we must check the
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   818
	 * oldstate data for all instances with an active grace period.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   819
	 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   820
	 * This also serves as the mechanism to remove stale oldstate data.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   821
	 * The first time we check an instance after its grace period has
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   822
	 * expired, the oldstate data should be cleared.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   823
	 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   824
	 * Start at the current instance, and walk the list backwards
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   825
	 * to the first.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
	 */
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   827
	mutex_enter(&rfs4_servinst_lock);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   828
	for (sip = rfs4_cur_servinst; sip != NULL; sip = sip->prev) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   829
		rfs4_ss_chkclid_sip(cp, sip);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   830
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   831
		/* if the above check found this client, we're done */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   832
		if (cp->can_reclaim)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   833
			break;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   834
	}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   835
	mutex_exit(&rfs4_servinst_lock);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   836
}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   837
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   838
static void
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   839
rfs4_ss_chkclid_sip(rfs4_client_t *cp, rfs4_servinst_t *sip)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   840
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   841
	rfs4_oldstate_t *osp, *os_head;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   842
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   843
	/* short circuit everything if this server instance has no oldstate */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   844
	rw_enter(&sip->oldstate_lock, RW_READER);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   845
	os_head = sip->oldstate;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   846
	rw_exit(&sip->oldstate_lock);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   847
	if (os_head == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	/*
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   851
	 * If this server instance is no longer in a grace period then
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   852
	 * the client won't be able to reclaim. No further need for this
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   853
	 * instance's oldstate data, so it can be cleared.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
	 */
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   855
	if (!rfs4_servinst_in_grace(sip))
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   856
		return;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   857
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   858
	/* this instance is still in grace; search for the clientid */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   859
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   860
	rw_enter(&sip->oldstate_lock, RW_READER);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   861
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   862
	os_head = sip->oldstate;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   863
	/* skip dummy entry */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
	osp = os_head->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
	while (osp != os_head) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
		if (osp->cl_id4.id_len == cp->nfs_client.id_len) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
			if (bcmp(osp->cl_id4.id_val, cp->nfs_client.id_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
					osp->cl_id4.id_len) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
				cp->can_reclaim = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
		osp = osp->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   876
	rw_exit(&sip->oldstate_lock);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
/*
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   880
 * Place client information into stable storage: 1/3.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   881
 * First, generate the leaf filename, from the client's IP address and
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   882
 * the server-generated short-hand clientid.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
rfs4_ss_clid(rfs4_client_t *cp, struct svc_req *req)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
	const char *kinet_ntop6(uchar_t *, char *, size_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	char leaf[MAXNAMELEN], buf[INET6_ADDRSTRLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	struct sockaddr *ca;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	uchar_t *b;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	if (rfs4_ss_enabled == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
	buf[0] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
	ca = (struct sockaddr *)svc_getrpccaller(req->rq_xprt)->buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
	if (ca == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
	 * Convert the caller's IP address to a dotted string
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	if (ca->sa_family == AF_INET) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
		bcopy(svc_getrpccaller(req->rq_xprt)->buf, &cp->cl_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
			sizeof (struct sockaddr_in));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
		b = (uchar_t *)&((struct sockaddr_in *)ca)->sin_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		(void) sprintf(buf, "%03d.%03d.%03d.%03d", b[0] & 0xFF,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
				b[1] & 0xFF, b[2] & 0xFF, b[3] & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
	} else if (ca->sa_family == AF_INET6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
		struct sockaddr_in6 *sin6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
		sin6 = (struct sockaddr_in6 *)ca;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
		bcopy(svc_getrpccaller(req->rq_xprt)->buf, &cp->cl_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
				sizeof (struct sockaddr_in6));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
		(void) kinet_ntop6((uchar_t *)&sin6->sin6_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
				buf, INET6_ADDRSTRLEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
	(void) snprintf(leaf, MAXNAMELEN, "%s-%llx", buf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
	    (longlong_t)cp->clientid);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   926
	rfs4_ss_clid_write(cp, leaf);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   927
}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   928
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   929
/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   930
 * Place client information into stable storage: 2/3.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   931
 * DSS: distributed stable storage: the file may need to be written to
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   932
 * multiple directories.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   933
 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   934
static void
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   935
rfs4_ss_clid_write(rfs4_client_t *cp, char *leaf)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   936
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   937
	rfs4_servinst_t *sip;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   938
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   939
	/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   940
	 * It should be sufficient to write the leaf file to (all) DSS paths
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   941
	 * associated with just this client's instance. However, since our
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   942
	 * per-instance client grouping is solely temporal, HA-NFSv4 RG
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   943
	 * failover might result in us losing DSS data.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   944
	 *
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   945
	 * Until the client grouping is improved, we must write the DSS data
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   946
	 * to all instances' paths. Start at the current instance, and
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   947
	 * walk the list backwards to the first.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   948
	 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   949
	mutex_enter(&rfs4_servinst_lock);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   950
	for (sip = rfs4_cur_servinst; sip != NULL; sip = sip->prev) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   951
		int i, npaths = sip->dss_npaths;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   952
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   953
		/* write the leaf file to all DSS paths */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   954
		for (i = 0; i < npaths; i++) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   955
			rfs4_dss_path_t *dss_path = sip->dss_paths[i];
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   956
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   957
			/* HA-NFSv4 path might have been failed-away from us */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   958
			if (dss_path == NULL)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   959
				continue;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   960
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   961
			rfs4_ss_clid_write_one(cp, dss_path->path, leaf);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   962
		}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   963
	}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   964
	mutex_exit(&rfs4_servinst_lock);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   965
}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   966
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   967
/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   968
 * Place client information into stable storage: 3/3.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   969
 * Write the stable storage data to the requested file.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   970
 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   971
static void
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   972
rfs4_ss_clid_write_one(rfs4_client_t *cp, char *dss_path, char *leaf)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   973
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   974
	int ioflag;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   975
	int file_vers = NFS4_SS_VERSION;
2390
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2035
diff changeset
   976
	size_t dirlen;
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   977
	struct uio uio;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   978
	struct iovec iov[4];
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   979
	char *dir;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   980
	rfs4_ss_pn_t *ss_pn;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   981
	vnode_t *vp;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   982
	nfs_client_id4 *cl_id4 = &(cp->nfs_client);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   983
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   984
	/* allow 2 extra bytes for '/' & NUL */
2390
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2035
diff changeset
   985
	dirlen = strlen(dss_path) + strlen(NFS4_DSS_STATE_LEAF) + 2;
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2035
diff changeset
   986
	dir = kmem_alloc(dirlen, KM_SLEEP);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   987
	(void) sprintf(dir, "%s/%s", dss_path, NFS4_DSS_STATE_LEAF);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
   988
2390
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2035
diff changeset
   989
	ss_pn = rfs4_ss_pnalloc(dir, leaf);
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2035
diff changeset
   990
	/* rfs4_ss_pnalloc takes its own copy */
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2035
diff changeset
   991
	kmem_free(dir, dirlen);
ffba0dc9ebeb 6431153 memory leak in rfs4_ss_clid_write_one()
calum
parents: 2035
diff changeset
   992
	if (ss_pn == NULL)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
	if (vn_open(ss_pn->pn, UIO_SYSSPACE, FCREAT|FWRITE, 0600, &vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
			    CRCREAT, 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
		rfs4_ss_pnfree(ss_pn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1001
	/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1002
	 * We need to record leaf - i.e. the filename - so that we know
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1003
	 * what to remove, in the future. However, the dir part of cp->ss_pn
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1004
	 * should never be referenced directly, since it's potentially only
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1005
	 * one of several paths with this leaf in it.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1006
	 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1007
	if (cp->ss_pn != NULL) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1008
		if (strcmp(cp->ss_pn->leaf, leaf) == 0) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1009
			/* we've already recorded *this* leaf */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1010
			rfs4_ss_pnfree(ss_pn);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1011
		} else {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1012
			/* replace with this leaf */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1013
			rfs4_ss_pnfree(cp->ss_pn);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1014
			cp->ss_pn = ss_pn;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1015
		}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1016
	} else {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1017
		cp->ss_pn = ss_pn;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1018
	}
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
	 * Build a scatter list that points to the nfs_client_id4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
	iov[0].iov_base = (caddr_t)&file_vers;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
	iov[0].iov_len = sizeof (int);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1025
	iov[1].iov_base = (caddr_t)&(cl_id4->verifier);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
	iov[1].iov_len = NFS4_VERIFIER_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
	iov[2].iov_base = (caddr_t)&(cl_id4->id_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
	iov[2].iov_len = sizeof (uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
	iov[3].iov_base = (caddr_t)cl_id4->id_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
	iov[3].iov_len = cl_id4->id_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	uio.uio_iov = iov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	uio.uio_iovcnt = 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
	uio.uio_loffset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
	uio.uio_segflg = UIO_SYSSPACE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	uio.uio_llimit = (rlim64_t)MAXOFFSET_T;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
	uio.uio_resid = cl_id4->id_len + sizeof (int) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
		NFS4_VERIFIER_SIZE + sizeof (uint_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
	ioflag = uio.uio_fmode = (FWRITE|FSYNC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
	uio.uio_extflg = UIO_COPY_DEFAULT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
	(void) VOP_RWLOCK(vp, V_WRITELOCK_TRUE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
	/* write the full client id to the file. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
	(void) VOP_WRITE(vp, &uio, ioflag, CRED(), NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
	VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
	(void) VOP_CLOSE(vp, FWRITE, 1, (offset_t)0, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
	VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
/*
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1053
 * DSS: distributed stable storage.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1054
 * Unpack the list of paths passed by nfsd.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1055
 * Use nvlist_alloc(9F) to manage the data.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1056
 * The caller is responsible for allocating and freeing the buffer.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1057
 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1058
int
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1059
rfs4_dss_setpaths(char *buf, size_t buflen)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1060
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1061
	int error;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1062
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1063
	/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1064
	 * If this is a "warm start", i.e. we previously had DSS paths,
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1065
	 * preserve the old paths.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1066
	 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1067
	if (rfs4_dss_paths != NULL) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1068
		/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1069
		 * Before we lose the ptr, destroy the nvlist and pathnames
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1070
		 * array from the warm start before this one.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1071
		 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1072
		if (rfs4_dss_oldpaths)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1073
			nvlist_free(rfs4_dss_oldpaths);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1074
		rfs4_dss_oldpaths = rfs4_dss_paths;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1075
	}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1076
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1077
	/* unpack the buffer into a searchable nvlist */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1078
	error = nvlist_unpack(buf, buflen, &rfs4_dss_paths, KM_SLEEP);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1079
	if (error)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1080
		return (error);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1081
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1082
	/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1083
	 * Search the nvlist for the pathnames nvpair (which is the only nvpair
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1084
	 * in the list, and record its location.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1085
	 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1086
	error = nvlist_lookup_string_array(rfs4_dss_paths, NFS4_DSS_NVPAIR_NAME,
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1087
	    &rfs4_dss_newpaths, &rfs4_dss_numnewpaths);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1088
	return (error);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1089
}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1090
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1091
/*
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
 * Ultimately the nfssys() call NFS4_CLR_STATE endsup here
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
 * to find and mark the client for forced expire.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
rfs4_client_scrub(rfs4_entry_t ent, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
	rfs4_client_t *cp = (rfs4_client_t *)ent;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
	struct nfs4clrst_args *clr = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
	struct sockaddr_in6 *ent_sin6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
	struct in6_addr  clr_in6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
	struct sockaddr_in  *ent_sin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
	struct in_addr   clr_in;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
	if (clr->addr_type != cp->cl_addr.ss_family) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
	switch (clr->addr_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
	case AF_INET6:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
		/* copyin the address from user space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
		if (copyin(clr->ap, &clr_in6, sizeof (clr_in6))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
		ent_sin6 = (struct sockaddr_in6 *)&cp->cl_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
		 * now compare, and if equivalent mark entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
		 * for forced expiration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
		if (IN6_ARE_ADDR_EQUAL(&ent_sin6->sin6_addr, &clr_in6)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
			cp->forced_expire = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	case AF_INET:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
		/* copyin the address from user space */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		if (copyin(clr->ap, &clr_in, sizeof (clr_in))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
		ent_sin = (struct sockaddr_in *)&cp->cl_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
		 * now compare, and if equivalent mark entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
		 * for forced expiration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
		if (ent_sin->sin_addr.s_addr == clr_in.s_addr) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
			cp->forced_expire = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
		/* force this assert to fail */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
		ASSERT(clr->addr_type != clr->addr_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
 * This is called from nfssys() in order to clear server state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
 * for the specified client IP Address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
rfs4_clear_client_state(struct nfs4clrst_args *clr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
	(void) rfs4_dbe_walk(rfs4_client_tab, rfs4_client_scrub, clr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
 * Used to initialize the NFSv4 server's state or database.  All of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
 * the tables are created and timers are set. Only called when NFSv4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
 * service is provided.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
rfs4_state_init()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
	int start_grace;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
	extern boolean_t rfs4_cpr_callb(void *, int);
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1171
	char *dss_path = NFS4_DSS_VAR_DIR;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
	mutex_enter(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
	 * If the server state database has already been initialized,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
	 * skip it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
	if (rfs4_server_state != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
		mutex_exit(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
	rw_init(&rfs4_findclient_lock, NULL, RW_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
	 * Set the boot time.  If the server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
	 * has been restarted quickly and has had the opportunity to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
	 * service clients, then the start_time needs to be bumped
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
	 * regardless.  A small window but it exists...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
	if (rfs4_start_time != gethrestime_sec())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
		rfs4_start_time = gethrestime_sec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
		rfs4_start_time++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1197
	/* DSS: distributed stable storage: initialise served paths list */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1198
	rfs4_dss_pathlist = NULL;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1199
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
	 * Create the first server instance, or a new one if the server has
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
	 * been restarted; see above comments on rfs4_start_time. Don't
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
	 * start its grace period; that will be done later, to maximise the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
	 * clients' recovery window.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
	start_grace = 0;
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1207
	rfs4_servinst_create(start_grace, 1, &dss_path);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
	/* reset the "first NFSv4 request" status */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
	rfs4_seen_first_compound = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
	 * Add a CPR callback so that we can update client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
	 * access times to extend the lease after a suspend
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
	 * and resume (using the same class as rpcmod/connmgr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
	cpr_id = callb_add(rfs4_cpr_callb, 0, CB_CL_CPR_RPC, "rfs4");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
	/* set the various cache timers for table creation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
	if (rfs4_client_cache_time == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
		rfs4_client_cache_time = CLIENT_CACHE_TIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
	if (rfs4_openowner_cache_time == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
		rfs4_openowner_cache_time = OPENOWNER_CACHE_TIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
	if (rfs4_state_cache_time == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		rfs4_state_cache_time = STATE_CACHE_TIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
	if (rfs4_lo_state_cache_time == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
		rfs4_lo_state_cache_time = LO_STATE_CACHE_TIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
	if (rfs4_lockowner_cache_time == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
		rfs4_lockowner_cache_time = LOCKOWNER_CACHE_TIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
	if (rfs4_file_cache_time == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
		rfs4_file_cache_time = FILE_CACHE_TIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
	if (rfs4_deleg_state_cache_time == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
		rfs4_deleg_state_cache_time = DELEG_STATE_CACHE_TIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
	/* Create the overall database to hold all server state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
	rfs4_server_state = rfs4_database_create(rfs4_database_debug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
	/* Now create the individual tables */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
	rfs4_client_cache_time *= rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
	rfs4_client_tab = rfs4_table_create(rfs4_server_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
					    "Client",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
					    rfs4_client_cache_time,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
					    2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
					    rfs4_client_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
					    rfs4_client_destroy,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
					    rfs4_client_expiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
					    sizeof (rfs4_client_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
					    TABSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
					    MAXTABSZ/8, 100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
	rfs4_nfsclnt_idx = rfs4_index_create(rfs4_client_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
					    "nfs_client_id4", nfsclnt_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
					    nfsclnt_compare, nfsclnt_mkkey,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
					    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
	rfs4_clientid_idx = rfs4_index_create(rfs4_client_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
					    "client_id", clientid_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
					    clientid_compare, clientid_mkkey,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
					    FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
	rfs4_openowner_cache_time *= rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
	rfs4_openowner_tab = rfs4_table_create(rfs4_server_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
					    "OpenOwner",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
					    rfs4_openowner_cache_time,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
					    1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
					    rfs4_openowner_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
					    rfs4_openowner_destroy,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
					    rfs4_openowner_expiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
					    sizeof (rfs4_openowner_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
					    TABSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
					    MAXTABSZ, 100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
	rfs4_openowner_idx = rfs4_index_create(rfs4_openowner_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
					    "open_owner4", openowner_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
					    openowner_compare,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
					    openowner_mkkey, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
	rfs4_state_cache_time *= rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
	rfs4_state_tab = rfs4_table_create(rfs4_server_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
					"OpenStateID",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
					rfs4_state_cache_time,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
					3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
					rfs4_state_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
					rfs4_state_destroy,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
					rfs4_state_expiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
					sizeof (rfs4_state_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
					TABSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
					MAXTABSZ, 100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
	rfs4_state_owner_file_idx = rfs4_index_create(rfs4_state_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
						"Openowner-File",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
						state_owner_file_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
						state_owner_file_compare,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
						state_owner_file_mkkey, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
	rfs4_state_idx = rfs4_index_create(rfs4_state_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
					"State-id", state_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
					state_compare, state_mkkey, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
	rfs4_state_file_idx = rfs4_index_create(rfs4_state_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
					"File", state_file_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
					state_file_compare, state_file_mkkey,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
					FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
	rfs4_lo_state_cache_time *= rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
	rfs4_lo_state_tab = rfs4_table_create(rfs4_server_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
					    "LockStateID",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
					    rfs4_lo_state_cache_time,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
					    2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
					    rfs4_lo_state_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
					    rfs4_lo_state_destroy,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
					    rfs4_lo_state_expiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
					    sizeof (rfs4_lo_state_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
					    TABSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
					    MAXTABSZ, 100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
	rfs4_lo_state_owner_idx = rfs4_index_create(rfs4_lo_state_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
						    "lockownerxstate",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
						    lo_state_lo_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
						    lo_state_lo_compare,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
						    lo_state_lo_mkkey, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
	rfs4_lo_state_idx = rfs4_index_create(rfs4_lo_state_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
					    "State-id",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
					    lo_state_hash, lo_state_compare,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
					    lo_state_mkkey, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
	rfs4_lockowner_cache_time *= rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
	rfs4_lockowner_tab = rfs4_table_create(rfs4_server_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
					    "Lockowner",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
					    rfs4_lockowner_cache_time,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
					    2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
					    rfs4_lockowner_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
					    rfs4_lockowner_destroy,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
					    rfs4_lockowner_expiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
					    sizeof (rfs4_lockowner_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
					    TABSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
					    MAXTABSZ, 100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
	rfs4_lockowner_idx = rfs4_index_create(rfs4_lockowner_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
					    "lock_owner4", lockowner_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
					    lockowner_compare,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
					    lockowner_mkkey, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
	rfs4_lockowner_pid_idx = rfs4_index_create(rfs4_lockowner_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
						"pid", pid_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
						pid_compare, pid_mkkey,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
						FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	rfs4_file_cache_time *= rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
	rfs4_file_tab = rfs4_table_create(rfs4_server_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
					"File",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
					rfs4_file_cache_time,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
					1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
					rfs4_file_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
					rfs4_file_destroy,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
					NULL,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
					sizeof (rfs4_file_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
					TABSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
					MAXTABSZ, -1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	rfs4_file_idx = rfs4_index_create(rfs4_file_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
					"Filehandle", file_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
					file_compare, file_mkkey, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
	rfs4_deleg_state_cache_time *= rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
	rfs4_deleg_state_tab = rfs4_table_create(rfs4_server_state,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
					"DelegStateID",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
					rfs4_deleg_state_cache_time,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
					2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
					rfs4_deleg_state_create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
					rfs4_deleg_state_destroy,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
					rfs4_deleg_state_expiry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
					sizeof (rfs4_deleg_state_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
					TABSIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
					MAXTABSZ, 100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
	rfs4_deleg_idx = rfs4_index_create(rfs4_deleg_state_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
						"DelegByFileClient",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
						deleg_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
						deleg_compare,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
						deleg_mkkey, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
	rfs4_deleg_state_idx = rfs4_index_create(rfs4_deleg_state_tab,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
						"DelegState",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
						deleg_state_hash,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
						deleg_state_compare,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
						deleg_state_mkkey, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
	 * Init the stable storage.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	rfs4_ss_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
	rfs4_client_clrst = rfs4_clear_client_state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	mutex_exit(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
 * Used at server shutdown to cleanup all of the NFSv4 server's structures
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
 * and other state.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
rfs4_state_fini()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
	rfs4_database_t *dbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
	mutex_enter(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
	if (rfs4_server_state == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
		mutex_exit(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
	rfs4_client_clrst = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	rfs4_set_deleg_policy(SRV_NEVER_DELEGATE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
	dbp = rfs4_server_state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
	rfs4_server_state = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
	 * Cleanup the CPR callback.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
	if (cpr_id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
		(void) callb_delete(cpr_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
	rw_destroy(&rfs4_findclient_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
	/* First stop all of the reaper threads in the database */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
	rfs4_database_shutdown(dbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
	/* clean up any dangling stable storage structures */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
	rfs4_ss_fini();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
	/* Now actually destroy/release the database and its tables */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
	rfs4_database_destroy(dbp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	/* Reset the cache timers for next time */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	rfs4_client_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	rfs4_openowner_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	rfs4_state_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	rfs4_lo_state_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
	rfs4_lockowner_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
	rfs4_file_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
	rfs4_deleg_state_cache_time = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
	mutex_exit(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
	/* destroy server instances and current instance ptr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
	rfs4_servinst_destroy_all();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
	/* reset the "first NFSv4 request" status */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
	rfs4_seen_first_compound = 0;
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1441
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1442
	/* DSS: distributed stable storage */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1443
	if (rfs4_dss_oldpaths)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1444
		nvlist_free(rfs4_dss_oldpaths);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1445
	if (rfs4_dss_paths)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1446
		nvlist_free(rfs4_dss_paths);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1447
	rfs4_dss_paths = rfs4_dss_oldpaths = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
typedef union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
	struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
		uint32_t start_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
		uint32_t c_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
	} impl_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
	clientid4 id4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
} cid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
static int foreign_stateid(stateid_t *id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
static int foreign_clientid(cid *cidp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
static void embed_nodeid(cid *cidp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
typedef union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
	struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
		uint32_t c_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
		uint32_t gen_num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
	} cv_impl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
	verifier4	confirm_verf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
} scid_confirm_verf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
clientid_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	cid *idp = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
	return (idp->impl_id.c_id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
clientid_compare(rfs4_entry_t entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
	rfs4_client_t *client = (rfs4_client_t *)entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
	clientid4 *idp = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
	return (*idp == client->clientid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
clientid_mkkey(rfs4_entry_t entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
	rfs4_client_t *client = (rfs4_client_t *)entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
	return (&client->clientid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
nfsclnt_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
	nfs_client_id4 *client = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
	uint32_t hash = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	for (i = 0; i < client->id_len; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
		hash <<= 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
		hash += (uint_t)client->id_val[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
	return (hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
nfsclnt_compare(rfs4_entry_t entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
	rfs4_client_t *client = (rfs4_client_t *)entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
	nfs_client_id4 *nfs_client = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
	if (client->nfs_client.id_len != nfs_client->id_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
	return (bcmp(client->nfs_client.id_val, nfs_client->id_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
						nfs_client->id_len) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
nfsclnt_mkkey(rfs4_entry_t entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
	rfs4_client_t *client = (rfs4_client_t *)entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
	return (&client->nfs_client);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
rfs4_client_expiry(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
	rfs4_client_t *cp = (rfs4_client_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
	bool_t cp_expired;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
	if (rfs4_dbe_is_invalid(cp->dbe))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
	 * If the sysadmin has used clear_locks for this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
	 * entry then forced_expire will be set and we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
	 * want this entry to be reaped. Or the entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
	 * has exceeded its lease period.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
	cp_expired = (cp->forced_expire ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
		(gethrestime_sec() - cp->last_access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
			> rfs4_lease_time));
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1548
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
	if (!cp->ss_remove && cp_expired)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		cp->ss_remove = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
	return (cp_expired);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1554
/*
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1555
 * Remove the leaf file from all distributed stable storage paths.
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1556
 */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1557
static void
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1558
rfs4_dss_remove_cpleaf(rfs4_client_t *cp)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1559
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1560
	char *leaf = cp->ss_pn->leaf;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1561
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1562
	rfs4_dss_remove_leaf(cp->server_instance, NFS4_DSS_STATE_LEAF, leaf);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1563
}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1564
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1565
static void
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1566
rfs4_dss_remove_leaf(rfs4_servinst_t *sip, char *dir_leaf, char *leaf)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1567
{
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1568
	int i, npaths = sip->dss_npaths;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1569
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1570
	for (i = 0; i < npaths; i++) {
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1571
		rfs4_dss_path_t *dss_path = sip->dss_paths[i];
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1572
		char *path, *dir;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1573
		size_t pathlen;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1574
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1575
		/* the HA-NFSv4 path might have been failed-over away from us */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1576
		if (dss_path == NULL)
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1577
			continue;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1578
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1579
		dir = dss_path->path;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1580
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1581
		/* allow 3 extra bytes for two '/' & a NUL */
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1582
		pathlen = strlen(dir) + strlen(dir_leaf) + strlen(leaf) + 3;
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1583
		path = kmem_alloc(pathlen, KM_SLEEP);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1584
		(void) sprintf(path, "%s/%s/%s", dir, dir_leaf, leaf);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1585
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1586
		(void) vn_remove(path, UIO_SYSSPACE, RMFILE);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1587
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1588
		kmem_free(path, pathlen);
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1589
	}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1590
}
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1591
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
rfs4_client_destroy(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
	rfs4_client_t *cp = (rfs4_client_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
	mutex_destroy(cp->cbinfo.cb_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	cv_destroy(cp->cbinfo.cb_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
	cv_destroy(cp->cbinfo.cb_cv_nullcaller);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
	/* free callback info */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
	rfs4_cbinfo_free(&cp->cbinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
	if (cp->cp_confirmed)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
		rfs4_client_rele(cp->cp_confirmed);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
	if (cp->ss_pn) {
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1608
		/* check if the stable storage files need to be removed */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
		if (cp->ss_remove)
2035
a29bc457bcb9 PSARC/2006/313 NFSv4: nfsd "-s" distributed stable storage
calum
parents: 0
diff changeset
  1610
			rfs4_dss_remove_cpleaf(cp);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
		rfs4_ss_pnfree(cp->ss_pn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
	/* Free the client supplied client id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
	kmem_free(cp->nfs_client.id_val, cp->nfs_client.id_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
	if (cp->sysidt != LM_NOSYSID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
		lm_free_sysidt(cp->sysidt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
rfs4_client_create(rfs4_entry_t u_entry, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
	rfs4_client_t *cp = (rfs4_client_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
	nfs_client_id4 *client = (nfs_client_id4 *)arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
	cid *cidp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
	scid_confirm_verf *scvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
	/* Get a clientid to give to the client */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
	cidp = (cid *)&cp->clientid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
	cidp->impl_id.start_time = rfs4_start_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
	cidp->impl_id.c_id = (uint32_t)rfs4_dbe_getid(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
	/* If we are booted as a cluster node, embed our nodeid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
	if (cluster_bootflags & CLUSTER_BOOTED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
		embed_nodeid(cidp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
	/* Allocate and copy client's client id value */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
	cp->nfs_client.id_val = kmem_alloc(client->id_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
	cp->nfs_client.id_len = client->id_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
	bcopy(client->id_val, cp->nfs_client.id_val, client->id_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
	cp->nfs_client.verifier = client->verifier;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
	/* Init the value for the SETCLIENTID_CONFIRM verifier */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
	scvp = (scid_confirm_verf *)&cp->confirm_verf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
	scvp->cv_impl.c_id = cidp->impl_id.c_id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
	scvp->cv_impl.gen_num = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
	/* An F_UNLKSYS has been done for this client */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
	cp->unlksys_completed = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
	/* We need the client to ack us */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
	cp->need_confirm = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
	cp->cp_confirmed = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
	/* TRUE all the time until the callback path actually fails */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
	cp->cbinfo.cb_notified_of_cb_path_down = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
	/* Initialize the access time to now */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
	cp->last_access = gethrestime_sec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
	cp->cr_set = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
	/* Initialize list for insque/remque */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
	cp->openownerlist.next = cp->openownerlist.prev = &cp->openownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
	cp->openownerlist.oop = NULL; /* This is not an openowner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
	cp->sysidt = LM_NOSYSID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
	cp->clientdeleglist.next = cp->clientdeleglist.prev =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
		&cp->clientdeleglist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
	cp->clientdeleglist.dsp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
	/* set up the callback control structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
	cp->cbinfo.cb_state = CB_UNINIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
	mutex_init(cp->cbinfo.cb_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
	cv_init(cp->cbinfo.cb_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
	cv_init(cp->cbinfo.cb_cv_nullcaller, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
	 * Associate the client_t with the current server instance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
	 * The hold is solely to satisfy the calling requirement of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
	 * rfs4_servinst_assign(). In this case it's not strictly necessary.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
	rfs4_dbe_hold(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
	rfs4_servinst_assign(cp, rfs4_cur_servinst);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
	rfs4_dbe_rele(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
 * Caller wants to generate/update the setclientid_confirm verifier
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
 * associated with a client.  This is done during the SETCLIENTID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
 * processing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
rfs4_client_scv_next(rfs4_client_t *cp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
	scid_confirm_verf *scvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
	/* Init the value for the SETCLIENTID_CONFIRM verifier */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
	scvp = (scid_confirm_verf *)&cp->confirm_verf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
	scvp->cv_impl.gen_num++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
rfs4_client_rele(rfs4_client_t *cp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
	rfs4_dbe_rele(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
rfs4_client_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
rfs4_findclient(nfs_client_id4 *client, bool_t *create,	rfs4_client_t *oldcp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
	rfs4_client_t *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
	if (oldcp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
		rw_enter(&rfs4_findclient_lock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
		rfs4_dbe_hide(oldcp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
		rw_enter(&rfs4_findclient_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
	cp = (rfs4_client_t *)rfs4_dbsearch(rfs4_nfsclnt_idx, client,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
					create, (void *)client, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
	if (oldcp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
		rfs4_dbe_unhide(oldcp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
	rw_exit(&rfs4_findclient_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
	return (cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
rfs4_client_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
rfs4_findclient_by_id(clientid4 clientid, bool_t find_unconfirmed)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
	rfs4_client_t *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
	cid *cidp = (cid *)&clientid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
	/* If we're a cluster and the nodeid isn't right, short-circuit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
	if (cluster_bootflags & CLUSTER_BOOTED && foreign_clientid(cidp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
	rw_enter(&rfs4_findclient_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
	cp = (rfs4_client_t *)rfs4_dbsearch(rfs4_clientid_idx, &clientid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
					&create, NULL, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
	rw_exit(&rfs4_findclient_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
	if (cp && cp->need_confirm && find_unconfirmed == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
		rfs4_client_rele(cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
		return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
		return (cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
rfs4_lease_expired(rfs4_client_t *cp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
	bool_t rc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
	rfs4_dbe_lock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
	 * If the admin has executed clear_locks for this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
	 * client id, force expire will be set, so no need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
	 * to calculate anything because it's "outa here".
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
	if (cp->forced_expire) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
		rc = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
		rc = (gethrestime_sec() - cp->last_access > rfs4_lease_time);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
	 * If the lease has expired we will also want
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
	 * to remove any stable storage state data. So
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
	 * mark the client id accordingly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
	if (!cp->ss_remove)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
		cp->ss_remove = (rc == TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
	rfs4_dbe_unlock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
	return (rc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
rfs4_update_lease(rfs4_client_t *cp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
	rfs4_dbe_lock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
	if (!cp->forced_expire)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
		cp->last_access = gethrestime_sec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
	rfs4_dbe_unlock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
EQOPENOWNER(open_owner4 *a, open_owner4 *b)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
	bool_t rc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
	if (a->clientid != b->clientid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
	if (a->owner_len != b->owner_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
	rc = (bcmp(a->owner_val, b->owner_val, a->owner_len) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
	return (rc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
static uint_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
openowner_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
	open_owner4 *openowner = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
	uint_t hash = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
	for (i = 0; i < openowner->owner_len; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
		hash <<= 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
		hash += (uint_t)openowner->owner_val[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
	hash += (uint_t)openowner->clientid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
	hash |= (openowner->clientid >> 32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
	return (hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
openowner_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
	rfs4_openowner_t *op = (rfs4_openowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
	open_owner4 *arg = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
	return (EQOPENOWNER(&op->owner, arg));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
openowner_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
	rfs4_openowner_t *op = (rfs4_openowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
	return (&op->owner);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
rfs4_openowner_expiry(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
	rfs4_openowner_t *op = (rfs4_openowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
	if (rfs4_dbe_is_invalid(op->dbe))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
	return ((gethrestime_sec() - op->client->last_access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
		> rfs4_lease_time));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
rfs4_openowner_destroy(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
	rfs4_openowner_t *op = (rfs4_openowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
	rfs4_sw_destroy(&op->oo_sw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
	/* Remove open owner from client's lists of open owners */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
	rfs4_dbe_lock(op->client->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
	remque(&op->openownerlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
	op->openownerlist.next = op->openownerlist.prev = &op->openownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
	rfs4_dbe_unlock(op->client->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
	/* One less reference to the client */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
	rfs4_client_rele(op->client);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
	op->client = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
	/* Free the last reply for this lock owner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
	rfs4_free_reply(op->reply);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
	if (op->reply_fh.nfs_fh4_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
		kmem_free(op->reply_fh.nfs_fh4_val, op->reply_fh.nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
		op->reply_fh.nfs_fh4_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
		op->reply_fh.nfs_fh4_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
	/* Free the lock owner id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
	kmem_free(op->owner.owner_val, op->owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
rfs4_openowner_rele(rfs4_openowner_t *op)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
	rfs4_dbe_rele(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
rfs4_openowner_create(rfs4_entry_t u_entry, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
	rfs4_openowner_t *op = (rfs4_openowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
	rfs4_openowner_t *argp = (rfs4_openowner_t *)arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
	open_owner4 *openowner = &argp->owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
	seqid4 seqid = argp->open_seqid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
	rfs4_client_t *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
	rw_enter(&rfs4_findclient_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
	cp = (rfs4_client_t *)rfs4_dbsearch(rfs4_clientid_idx,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
					&openowner->clientid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
					&create, NULL, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
	rw_exit(&rfs4_findclient_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
	if (cp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
	op->reply_fh.nfs_fh4_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
	op->reply_fh.nfs_fh4_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
	op->owner.clientid = openowner->clientid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
	op->owner.owner_val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
		kmem_alloc(openowner->owner_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
	bcopy(openowner->owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
	    op->owner.owner_val, openowner->owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
	op->owner.owner_len = openowner->owner_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
	op->need_confirm = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
	rfs4_sw_init(&op->oo_sw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
	op->open_seqid = seqid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
	bzero(op->reply, sizeof (nfs_resop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
	op->client = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
	op->cr_set = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
	/* Init lists for remque/insque */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
	op->ownerstateids.next = op->ownerstateids.prev = &op->ownerstateids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
	op->ownerstateids.sp = NULL; /* NULL since this is the state list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
	op->openownerlist.next = op->openownerlist.prev = &op->openownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
	op->openownerlist.oop = op; /* ourselves */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
	/* Insert openowner into client's open owner list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
	rfs4_dbe_lock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
	insque(&op->openownerlist, cp->openownerlist.prev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
	rfs4_dbe_unlock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
rfs4_openowner_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
rfs4_findopenowner(open_owner4 *openowner, bool_t *create, seqid4 seqid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
	rfs4_openowner_t *op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
	rfs4_openowner_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
	arg.owner = *openowner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
	arg.open_seqid = seqid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
	op = (rfs4_openowner_t *)rfs4_dbsearch(rfs4_openowner_idx, openowner,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
					    create, &arg, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
	return (op);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
rfs4_update_open_sequence(rfs4_openowner_t *op)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
	rfs4_dbe_lock(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
	op->open_seqid++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
	rfs4_dbe_unlock(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
rfs4_update_open_resp(rfs4_openowner_t *op, nfs_resop4 *resp, nfs_fh4 *fh)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
	rfs4_dbe_lock(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
	rfs4_free_reply(op->reply);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
	rfs4_copy_reply(op->reply, resp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
	/* Save the filehandle if provided and free if not used */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
	if (resp->nfs_resop4_u.opopen.status == NFS4_OK &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
	    fh && fh->nfs_fh4_len) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
		if (op->reply_fh.nfs_fh4_val == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
			op->reply_fh.nfs_fh4_val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
				kmem_alloc(fh->nfs_fh4_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
		nfs_fh4_copy(fh, &op->reply_fh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
		if (op->reply_fh.nfs_fh4_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
			kmem_free(op->reply_fh.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
				op->reply_fh.nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
			op->reply_fh.nfs_fh4_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
			op->reply_fh.nfs_fh4_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
	rfs4_dbe_unlock(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
lockowner_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
	rfs4_lockowner_t *lo = (rfs4_lockowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
	lock_owner4 *b = (lock_owner4 *)key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
	if (lo->owner.clientid != b->clientid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
	if (lo->owner.owner_len != b->owner_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
	return (bcmp(lo->owner.owner_val, b->owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
					lo->owner.owner_len) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
lockowner_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
	rfs4_lockowner_t *lo = (rfs4_lockowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
	return (&lo->owner);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
lockowner_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
	lock_owner4 *lockowner = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
	uint_t hash = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
	for (i = 0; i < lockowner->owner_len; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
		hash <<= 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
		hash += (uint_t)lockowner->owner_val[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
	hash += (uint_t)lockowner->clientid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
	hash |= (lockowner->clientid >> 32);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
	return (hash);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
pid_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
	return ((uint32_t)(uintptr_t)key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
pid_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
	rfs4_lockowner_t *lo = (rfs4_lockowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
	return ((void *)(uintptr_t)lo->pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
pid_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
	rfs4_lockowner_t *lo = (rfs4_lockowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
	return (lo->pid == (pid_t)(uintptr_t)key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
rfs4_lockowner_destroy(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
	rfs4_lockowner_t *lo = (rfs4_lockowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
	/* Free the lock owner id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
	kmem_free(lo->owner.owner_val, lo->owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
	rfs4_client_rele(lo->client);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
rfs4_lockowner_rele(rfs4_lockowner_t *lo)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
	rfs4_dbe_rele(lo->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
rfs4_lockowner_expiry(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
	 * Since expiry is called with no other references on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
	 * this struct, go ahead and have it removed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
rfs4_lockowner_create(rfs4_entry_t u_entry, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
	rfs4_lockowner_t *lo = (rfs4_lockowner_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
	lock_owner4 *lockowner = (lock_owner4 *)arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
	rfs4_client_t *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
	rw_enter(&rfs4_findclient_lock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
	cp = (rfs4_client_t *)rfs4_dbsearch(rfs4_clientid_idx,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
					&lockowner->clientid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
					&create, NULL, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
	rw_exit(&rfs4_findclient_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
	if (cp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
	/* Reference client */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
	lo->client = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
	lo->owner.clientid = lockowner->clientid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
	lo->owner.owner_val = kmem_alloc(lockowner->owner_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
	bcopy(lockowner->owner_val, lo->owner.owner_val, lockowner->owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
	lo->owner.owner_len = lockowner->owner_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
	lo->pid = rfs4_dbe_getid(lo->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
rfs4_lockowner_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
rfs4_findlockowner(lock_owner4 *lockowner, bool_t *create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
	rfs4_lockowner_t *lo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
	lo = (rfs4_lockowner_t *)rfs4_dbsearch(rfs4_lockowner_idx, lockowner,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
					    create, lockowner, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
	return (lo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
rfs4_lockowner_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
rfs4_findlockowner_by_pid(pid_t pid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
	rfs4_lockowner_t *lo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
	lo = (rfs4_lockowner_t *)rfs4_dbsearch(rfs4_lockowner_pid_idx,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
		(void *)(uintptr_t)pid, &create, NULL, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
	return (lo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
file_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
	return (ADDRHASH(key));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
file_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
	rfs4_file_t *fp = (rfs4_file_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
	return (fp->vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
file_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
	rfs4_file_t *fp = (rfs4_file_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
	return (fp->vp == (vnode_t *)key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
rfs4_file_destroy(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
	rfs4_file_t *fp = (rfs4_file_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
	ASSERT(fp->delegationlist.next == &fp->delegationlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
	if (fp->filehandle.nfs_fh4_val)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
		kmem_free(fp->filehandle.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
			fp->filehandle.nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
	cv_destroy(fp->dinfo->recall_cv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
	if (fp->vp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
		VN_RELE(fp->vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
		fp->vp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
	rw_destroy(&fp->file_rwlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
 * Used to unlock the underlying dbe struct only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
rfs4_file_rele(rfs4_file_t *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
	rfs4_dbe_rele(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
 * Used to unlock the file rw lock and the file's dbe entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
 * Only used to pair with rfs4_findfile_withlock()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
rfs4_file_rele_withunlock(rfs4_file_t *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
	rw_exit(&fp->file_rwlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
	rfs4_dbe_rele(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
typedef struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
    vnode_t *vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
    nfs_fh4 *fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
} rfs4_fcreate_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
rfs4_file_create(rfs4_entry_t u_entry, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
	rfs4_file_t *fp = (rfs4_file_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
	rfs4_fcreate_arg *ap = (rfs4_fcreate_arg *)arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
	vnode_t *vp = ap->vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
	nfs_fh4 *fh = ap->fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
	VN_HOLD(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
	fp->filehandle.nfs_fh4_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
	fp->filehandle.nfs_fh4_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
	ASSERT(fh && fh->nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
	if (fh && fh->nfs_fh4_len) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
		fp->filehandle.nfs_fh4_val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
			kmem_alloc(fh->nfs_fh4_len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
		nfs_fh4_copy(fh, &fp->filehandle);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
	fp->vp = vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
	/* Init list for remque/insque */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
	fp->delegationlist.next = fp->delegationlist.prev =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
		&fp->delegationlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
	fp->delegationlist.dsp = NULL; /* NULL since this is state list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
	fp->share_deny = fp->share_access = fp->access_read = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
	fp->access_write = fp->deny_read = fp->deny_write = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
	mutex_init(fp->dinfo->recall_lock, NULL, MUTEX_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
	cv_init(fp->dinfo->recall_cv, NULL, CV_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
	fp->dinfo->dtype = OPEN_DELEGATE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
	rw_init(&fp->file_rwlock, NULL, RW_DEFAULT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
rfs4_file_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
rfs4_findfile(vnode_t *vp, nfs_fh4 *fh, bool_t *create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
	rfs4_file_t *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
	rfs4_fcreate_arg arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
	arg.vp = vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
	arg.fh = fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
	fp = (rfs4_file_t *)rfs4_dbsearch(rfs4_file_idx, vp, create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
					&arg, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
	return (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
 * Find a file in the db and once it is located, take the rw lock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
 * Need to check the vnode pointer and if it does not exist (it was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
 * removed between the db location and check) redo the find.  This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
 * assumes that a file struct that has a NULL vnode pointer is marked
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
 * at 'invalid' and will not be found in the db the second time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
 * around.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
rfs4_file_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
rfs4_findfile_withlock(vnode_t *vp, nfs_fh4 *fh, bool_t *create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
	rfs4_file_t *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
	rfs4_fcreate_arg arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
	bool_t screate = *create;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
retry:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
	arg.vp = vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
	arg.fh = fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
	fp = (rfs4_file_t *)rfs4_dbsearch(rfs4_file_idx, vp, create,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
					&arg, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
	if (fp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
		rw_enter(&fp->file_rwlock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
		if (fp->vp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
			rw_exit(&fp->file_rwlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
			rfs4_file_rele(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
			*create = screate;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
			goto retry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
	return (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
lo_state_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
	stateid_t *id = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
	return (id->bits.ident+id->bits.pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
lo_state_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
	rfs4_lo_state_t *lop = (rfs4_lo_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
	stateid_t *id = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
	bool_t rc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
	rc = (lop->lockid.bits.boottime == id->bits.boottime &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
	    lop->lockid.bits.type == id->bits.type &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
	    lop->lockid.bits.ident == id->bits.ident &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
	    lop->lockid.bits.pid == id->bits.pid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
	return (rc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
lo_state_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
	rfs4_lo_state_t *lsp = (rfs4_lo_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
	return (&lsp->lockid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
rfs4_lo_state_expiry(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
	rfs4_lo_state_t *lsp = (rfs4_lo_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
	if (rfs4_dbe_is_invalid(lsp->dbe))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
	if (lsp->state->closed)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
	return ((gethrestime_sec() - lsp->state->owner->client->last_access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
		> rfs4_lease_time));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
rfs4_lo_state_destroy(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
	rfs4_lo_state_t *lsp = (rfs4_lo_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
	rfs4_sw_destroy(&lsp->ls_sw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
	/* Make sure to release the file locks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
	if (lsp->locks_cleaned == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
		lsp->locks_cleaned = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
		if (lsp->locker->client->sysidt != LM_NOSYSID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
			/* Is the PxFS kernel module loaded? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
			if (lm_remove_file_locks != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
				int new_sysid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
				/* Encode the cluster nodeid in new sysid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
				new_sysid = lsp->locker->client->sysidt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
				lm_set_nlmid_flk(&new_sysid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
				 * This PxFS routine removes file locks for a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
				 * client over all nodes of a cluster.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
				NFS4_DEBUG(rfs4_debug, (CE_NOTE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
				    "lm_remove_file_locks(sysid=0x%x)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
				    new_sysid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
				(*lm_remove_file_locks)(new_sysid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
				(void) cleanlocks(lsp->state->finfo->vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
				    lsp->locker->pid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
				    lsp->locker->client->sysidt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
	rfs4_dbe_lock(lsp->state->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
	remque(&lsp->lockownerlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
	lsp->lockownerlist.next = lsp->lockownerlist.prev =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
		&lsp->lockownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
	rfs4_dbe_unlock(lsp->state->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
	/* Free the last reply for this state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
	rfs4_free_reply(lsp->reply);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
	rfs4_lockowner_rele(lsp->locker);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
	lsp->locker = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
	rfs4_state_rele_nounlock(lsp->state);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
	lsp->state = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
rfs4_lo_state_create(rfs4_entry_t u_entry, void *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
	rfs4_lo_state_t *lsp = (rfs4_lo_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
	rfs4_lo_state_t *argp = (rfs4_lo_state_t *)arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
	rfs4_lockowner_t *lo = argp->locker;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
	rfs4_state_t *sp = argp->state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
	lsp->state = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
	lsp->lockid = sp->stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
	lsp->lockid.bits.type = LOCKID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
	lsp->lockid.bits.chgseq = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
	lsp->lockid.bits.pid = lo->pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
	lsp->locks_cleaned = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
	lsp->lock_completed = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
	rfs4_sw_init(&lsp->ls_sw);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
	/* Attached the supplied lock owner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
	rfs4_dbe_hold(lo->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
	lsp->locker = lo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
	lsp->lockownerlist.next = lsp->lockownerlist.prev =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
		&lsp->lockownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
	lsp->lockownerlist.lsp = lsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
	rfs4_dbe_lock(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
	insque(&lsp->lockownerlist, sp->lockownerlist.prev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
	rfs4_dbe_hold(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
	rfs4_dbe_unlock(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
rfs4_lo_state_rele(rfs4_lo_state_t *lsp, bool_t unlock_fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
	if (unlock_fp == TRUE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
		rw_exit(&lsp->state->finfo->file_rwlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
	rfs4_dbe_rele(lsp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
static rfs4_lo_state_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
rfs4_findlo_state(stateid_t *id, bool_t lock_fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
	rfs4_lo_state_t *lsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
	lsp = (rfs4_lo_state_t *)rfs4_dbsearch(rfs4_lo_state_idx, id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
					    &create, NULL, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
	if (lock_fp == TRUE && lsp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
		rw_enter(&lsp->state->finfo->file_rwlock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
	return (lsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
lo_state_lo_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
	rfs4_lo_state_t *lop = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
	return (ADDRHASH(lop->locker) ^ ADDRHASH(lop->state));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
lo_state_lo_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
	rfs4_lo_state_t *lop = (rfs4_lo_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
	rfs4_lo_state_t *keyp = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
	return (keyp->locker == lop->locker && keyp->state == lop->state);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
lo_state_lo_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
	return (u_entry);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
rfs4_lo_state_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
rfs4_findlo_state_by_owner(rfs4_lockowner_t *lo,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
			rfs4_state_t *sp, bool_t *create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
	rfs4_lo_state_t *lsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
	rfs4_lo_state_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
	arg.locker = lo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
	arg.state = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
	lsp = (rfs4_lo_state_t *)rfs4_dbsearch(rfs4_lo_state_owner_idx, &arg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
					    create, &arg, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
	return (lsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
static stateid_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
get_stateid(id_t eid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
	stateid_t id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
	id.bits.boottime = rfs4_start_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
	id.bits.ident = eid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
	id.bits.chgseq = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
	id.bits.type = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
	id.bits.pid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
	 * If we are booted as a cluster node, embed our nodeid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
	 * We've already done sanity checks in rfs4_client_create() so no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
	 * need to repeat them here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
	id.bits.clnodeid = (cluster_bootflags & CLUSTER_BOOTED) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
	    clconf_get_nodeid() : 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
	return (id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
 * For use only when booted as a cluster node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
 * Returns TRUE if the embedded nodeid indicates that this stateid was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
 * generated on another node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
foreign_stateid(stateid_t *id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
	ASSERT(cluster_bootflags & CLUSTER_BOOTED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
	return (id->bits.clnodeid != (uint32_t)clconf_get_nodeid());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
 * For use only when booted as a cluster node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
 * Returns TRUE if the embedded nodeid indicates that this clientid was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
 * generated on another node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
foreign_clientid(cid *cidp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
	ASSERT(cluster_bootflags & CLUSTER_BOOTED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
	return (cidp->impl_id.c_id >> CLUSTER_NODEID_SHIFT !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
	    (uint32_t)clconf_get_nodeid());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
 * For use only when booted as a cluster node.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
 * Embed our cluster nodeid into the clientid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
embed_nodeid(cid *cidp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
	int clnodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
	 * Currently, our state tables are small enough that their
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
	 * ids will leave enough bits free for the nodeid. If the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
	 * tables become larger, we mustn't overwrite the id.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
	 * Equally, we only have room for so many bits of nodeid, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
	 * must check that too.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
	ASSERT(cluster_bootflags & CLUSTER_BOOTED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
	ASSERT(cidp->impl_id.c_id >> CLUSTER_NODEID_SHIFT == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
	clnodeid = clconf_get_nodeid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
	ASSERT(clnodeid <= CLUSTER_MAX_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
	ASSERT(clnodeid != NODEID_UNKNOWN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
	cidp->impl_id.c_id |= (clnodeid << CLUSTER_NODEID_SHIFT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
state_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
	stateid_t *ip = (stateid_t *)key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
	return (ip->bits.ident);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
state_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
	stateid_t *id = (stateid_t *)key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
	bool_t rc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
	rc = (sp->stateid.bits.boottime == id->bits.boottime &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
	    sp->stateid.bits.ident == id->bits.ident);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
	return (rc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
state_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
	return (&sp->stateid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
rfs4_state_destroy(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
	ASSERT(&sp->lockownerlist == sp->lockownerlist.next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
	/* release any share locks for this stateid if it's still open */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
	if (!sp->closed)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
		rfs4_unshare(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
	/* Were done with the file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
	rfs4_file_rele(sp->finfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
	sp->finfo = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
	/* And now with the openowner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
	rfs4_dbe_lock(sp->owner->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
	remque(&sp->ownerstateids);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
	sp->ownerstateids.next = sp->ownerstateids.prev = &sp->ownerstateids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
	rfs4_dbe_unlock(sp->owner->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
	rfs4_openowner_rele(sp->owner);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
	sp->owner = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
rfs4_state_rele_nounlock(rfs4_state_t *sp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
	rfs4_dbe_rele(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
rfs4_state_rele(rfs4_state_t *sp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
	rw_exit(&sp->finfo->file_rwlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
	rfs4_dbe_rele(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
deleg_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
	rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
	return (ADDRHASH(dsp->client) ^ ADDRHASH(dsp->finfo));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
deleg_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
	rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
	rfs4_deleg_state_t *kdsp = (rfs4_deleg_state_t *)key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
	return (dsp->client == kdsp->client && dsp->finfo == kdsp->finfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
deleg_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
	return (u_entry);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
deleg_state_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
	stateid_t *ip = (stateid_t *)key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
	return (ip->bits.ident);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
deleg_state_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
	rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
	stateid_t *id = (stateid_t *)key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
	bool_t rc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
	if (id->bits.type != DELEGID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
	rc = (dsp->delegid.bits.boottime == id->bits.boottime &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
	    dsp->delegid.bits.ident == id->bits.ident);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
	return (rc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
deleg_state_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
	rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
	return (&dsp->delegid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
rfs4_deleg_state_expiry(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
	rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
	if (rfs4_dbe_is_invalid(dsp->dbe))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
	return ((gethrestime_sec() - dsp->client->last_access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
		> rfs4_lease_time));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
rfs4_deleg_state_create(rfs4_entry_t u_entry, void *argp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
	rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
	rfs4_file_t *fp = ((rfs4_deleg_state_t *)argp)->finfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
	rfs4_client_t *cp = ((rfs4_deleg_state_t *)argp)->client;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
	rfs4_dbe_hold(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
	rfs4_dbe_hold(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
	dsp->delegid = get_stateid(rfs4_dbe_getid(dsp->dbe));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
	dsp->delegid.bits.type = DELEGID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
	dsp->finfo = fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
	dsp->client = cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
	dsp->dtype = OPEN_DELEGATE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
	dsp->time_granted = gethrestime_sec();	/* observability */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
	dsp->time_revoked = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
	/* Init lists for remque/insque */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
	dsp->delegationlist.next = dsp->delegationlist.prev =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
		&dsp->delegationlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
	dsp->delegationlist.dsp = dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
	dsp->clientdeleglist.next = dsp->clientdeleglist.prev =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
		&dsp->clientdeleglist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
	dsp->clientdeleglist.dsp = dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
	/* Insert state on per open owner's list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
	rfs4_dbe_lock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
	insque(&dsp->clientdeleglist, cp->clientdeleglist.prev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
	rfs4_dbe_unlock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
rfs4_deleg_state_destroy(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
	rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
	if (&dsp->delegationlist != dsp->delegationlist.next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
		rfs4_return_deleg(dsp, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
	/* Were done with the file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2756
	rfs4_file_rele(dsp->finfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2757
	dsp->finfo = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
	/* And now with the openowner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
	rfs4_dbe_lock(dsp->client->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
	remque(&dsp->clientdeleglist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
	dsp->clientdeleglist.next = dsp->clientdeleglist.prev =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2764
		&dsp->clientdeleglist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2766
	rfs4_dbe_unlock(dsp->client->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
	rfs4_client_rele(dsp->client);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
	dsp->client = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
rfs4_deleg_state_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
rfs4_finddeleg(rfs4_state_t *sp, bool_t *create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
	rfs4_deleg_state_t ds, *dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
	ds.client = sp->owner->client;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
	ds.finfo = sp->finfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
	dsp = (rfs4_deleg_state_t *)rfs4_dbsearch(rfs4_deleg_idx, &ds,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
					create, &ds, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
	return (dsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
rfs4_deleg_state_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
rfs4_finddelegstate(stateid_t *id)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2789
	rfs4_deleg_state_t *dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
	dsp = (rfs4_deleg_state_t *)rfs4_dbsearch(rfs4_deleg_state_idx, id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
					&create, NULL, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
	return (dsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2796
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2797
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2798
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2799
rfs4_deleg_state_rele(rfs4_deleg_state_t *dsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2800
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2801
	rfs4_dbe_rele(dsp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2802
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2804
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2805
rfs4_update_lock_sequence(rfs4_lo_state_t *lsp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2806
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2807
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
	rfs4_dbe_lock(lsp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
	 * If we are skipping sequence id checking, this means that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
	 * this is the first lock request and therefore the sequence
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
	 * id does not need to be updated.  This only happens on the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
	 * first lock request for a lockowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
	if (!lsp->skip_seqid_check)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
		lsp->seqid++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
	rfs4_dbe_unlock(lsp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
rfs4_update_lock_resp(rfs4_lo_state_t *lsp, nfs_resop4 *resp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
	rfs4_dbe_lock(lsp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
	rfs4_free_reply(lsp->reply);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
	rfs4_copy_reply(lsp->reply, resp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2831
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
	rfs4_dbe_unlock(lsp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
rfs4_free_opens(rfs4_openowner_t *op, bool_t invalidate,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
	bool_t close_of_client)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2838
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2839
	rfs4_state_t *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2840
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2841
	rfs4_dbe_lock(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
	for (sp = op->ownerstateids.next->sp; sp != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
		sp = sp->ownerstateids.next->sp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
		rfs4_state_close(sp, FALSE, close_of_client, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
		if (invalidate == TRUE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
			rfs4_dbe_invalidate(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
	rfs4_dbe_unlock(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
	rfs4_dbe_invalidate(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
state_owner_file_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
	rfs4_state_t *sp = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
	return (ADDRHASH(sp->owner) ^ ADDRHASH(sp->finfo));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
state_owner_file_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
	rfs4_state_t *arg = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2868
	if (sp->closed == TRUE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
	return (arg->owner == sp->owner && arg->finfo == sp->finfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
state_owner_file_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
	return (u_entry);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
static uint32_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
state_file_hash(void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
	return (ADDRHASH(key));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
state_file_compare(rfs4_entry_t u_entry, void *key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
	rfs4_file_t *fp = key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
	if (sp->closed == TRUE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
	return (fp == sp->finfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
static void *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2899
state_file_mkkey(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2901
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2903
	return (sp->finfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
rfs4_state_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
rfs4_findstate_by_owner_file(rfs4_openowner_t *op, rfs4_file_t *file,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
	bool_t *create)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
	rfs4_state_t *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
	rfs4_state_t key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2912
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
	key.owner = op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
	key.finfo = file;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
	sp = (rfs4_state_t *)rfs4_dbsearch(rfs4_state_owner_file_idx, &key,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
					create, &key, RFS4_DBS_VALID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
	return (sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
/* This returns ANY state struct that refers to this file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
static rfs4_state_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
rfs4_findstate_by_file(rfs4_file_t *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
	return ((rfs4_state_t *)rfs4_dbsearch(rfs4_state_file_idx, fp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
		&create, fp, RFS4_DBS_VALID));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2931
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2932
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2933
rfs4_state_expiry(rfs4_entry_t u_entry)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2934
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2935
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2937
	if (rfs4_dbe_is_invalid(sp->dbe))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2938
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2939
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2940
	if (sp->closed == TRUE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2941
	    ((gethrestime_sec() - rfs4_dbe_get_timerele(sp->dbe))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2942
		> rfs4_lease_time))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2943
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2944
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2945
	return ((gethrestime_sec() - sp->owner->client->last_access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2946
		> rfs4_lease_time));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2947
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2948
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2949
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2950
rfs4_state_create(rfs4_entry_t u_entry, void *argp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2951
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2952
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2953
	rfs4_file_t *fp = ((rfs4_state_t *)argp)->finfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2954
	rfs4_openowner_t *op = ((rfs4_state_t *)argp)->owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2955
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2956
	rfs4_dbe_hold(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2957
	rfs4_dbe_hold(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2958
	sp->stateid = get_stateid(rfs4_dbe_getid(sp->dbe));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2959
	sp->stateid.bits.type = OPENID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2960
	sp->owner = op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2961
	sp->finfo = fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2962
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2963
	/* Init lists for remque/insque */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2964
	sp->ownerstateids.next = sp->ownerstateids.prev = &sp->ownerstateids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2965
	sp->ownerstateids.sp = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2966
	sp->lockownerlist.next = sp->lockownerlist.prev = &sp->lockownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2967
	sp->lockownerlist.lsp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2968
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2969
	/* Insert state on per open owner's list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2970
	rfs4_dbe_lock(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2971
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2972
	insque(&sp->ownerstateids, op->ownerstateids.prev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2974
	rfs4_dbe_unlock(op->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2975
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2976
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2977
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2979
static rfs4_state_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2980
rfs4_findstate(stateid_t *id, rfs4_dbsearch_type_t find_invalid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2981
		bool_t lock_fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2982
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2983
	rfs4_state_t *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2984
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2986
	sp = (rfs4_state_t *)rfs4_dbsearch(rfs4_state_idx, id,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2987
					&create, NULL, find_invalid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2988
	if (lock_fp == TRUE && sp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2989
		rw_enter(&sp->finfo->file_rwlock, RW_READER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2990
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2991
	return (sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2992
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2993
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2994
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2995
rfs4_state_close(rfs4_state_t *sp, bool_t lock_held,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2996
			bool_t close_of_client, cred_t *cr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2997
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2998
	/* Remove the associated lo_state owners */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2999
	if (!lock_held)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3000
		rfs4_dbe_lock(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3001
	if (sp->closed == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3002
		sp->closed = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3003
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3004
		rfs4_release_share_lock_state(sp, cr, close_of_client);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3005
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3006
	if (!lock_held)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3007
		rfs4_dbe_unlock(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3008
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3009
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3010
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3011
 * Remove all state associated with the given client.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3012
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3013
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3014
rfs4_client_state_remove(rfs4_client_t *cp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3015
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3016
	rfs4_openowner_t *oop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3017
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3018
	rfs4_dbe_lock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3020
	for (oop = cp->openownerlist.next->oop;  oop != NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3021
		oop = oop->openownerlist.next->oop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3022
		rfs4_free_opens(oop, TRUE, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3023
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3025
	rfs4_dbe_unlock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3026
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3027
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3028
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3029
rfs4_client_close(rfs4_client_t *cp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3030
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3031
	/* Mark client as going away. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3032
	rfs4_dbe_lock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3033
	rfs4_dbe_invalidate(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3034
	rfs4_dbe_unlock(cp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3035
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3036
	rfs4_client_state_remove(cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3037
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3038
	/* Release the client */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3039
	rfs4_client_rele(cp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3040
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3042
nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3043
rfs4_check_clientid(clientid4 *cp, int setclid_confirm)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3044
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3045
	cid *cidp = (cid *) cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3046
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3047
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3048
	 * If we are booted as a cluster node, check the embedded nodeid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3049
	 * If it indicates that this clientid was generated on another node,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3050
	 * inform the client accordingly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3051
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3052
	if (cluster_bootflags & CLUSTER_BOOTED && foreign_clientid(cidp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3053
		return (NFS4ERR_STALE_CLIENTID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3055
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3056
	 * If the server start time matches the time provided
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3057
	 * by the client (via the clientid) and this is NOT a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3058
	 * setclientid_confirm then return EXPIRED.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3059
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3060
	if (!setclid_confirm && cidp->impl_id.start_time == rfs4_start_time)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3061
		return (NFS4ERR_EXPIRED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3062
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3063
	return (NFS4ERR_STALE_CLIENTID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3064
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3066
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3067
 * This is used when a stateid has not been found amongst the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3068
 * current server's state.  Check the stateid to see if it
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3069
 * was from this server instantiation or not.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3070
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3071
static nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3072
what_stateid_error(stateid_t *id, stateid_type_t type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3073
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3074
	/* If we are booted as a cluster node, was stateid locally generated? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3075
	if ((cluster_bootflags & CLUSTER_BOOTED) && foreign_stateid(id))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3076
		return (NFS4ERR_STALE_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3078
	/* If types don't match then no use checking further */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3079
	if (type != id->bits.type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3080
		return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3081
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3082
	/* From a previous server instantiation, return STALE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3083
	if (id->bits.boottime < rfs4_start_time)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3084
		return (NFS4ERR_STALE_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3085
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3086
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3087
	 * From this server but the state is most likely beyond lease
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3088
	 * timeout: return NFS4ERR_EXPIRED.  However, there is the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3089
	 * case of a delegation stateid.  For delegations, there is a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3090
	 * case where the state can be removed without the client's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3091
	 * knowledge/consent: revocation.  In the case of delegation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3092
	 * revocation, the delegation state will be removed and will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3093
	 * not be found.  If the client does something like a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3094
	 * DELEGRETURN or even a READ/WRITE with a delegatoin stateid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3095
	 * that has been revoked, the server should return BAD_STATEID
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3096
	 * instead of the more common EXPIRED error.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3097
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3098
	if (id->bits.boottime == rfs4_start_time) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3099
		if (type == DELEGID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3100
			return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3101
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3102
			return (NFS4ERR_EXPIRED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3103
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3105
	return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3106
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3108
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3109
 * Used later on to find the various state structs.  When called from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3110
 * rfs4_check_stateid()->rfs4_get_all_state(), no file struct lock is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3111
 * taken (it is not needed) and helps on the read/write path with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3112
 * respect to performance.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3113
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3114
static nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3115
rfs4_get_state_lockit(stateid4 *stateid, rfs4_state_t **spp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3116
		rfs4_dbsearch_type_t find_invalid, bool_t lock_fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3117
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3118
	stateid_t *id = (stateid_t *)stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3119
	rfs4_state_t *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3121
	*spp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3122
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3123
	/* If we are booted as a cluster node, was stateid locally generated? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3124
	if ((cluster_bootflags & CLUSTER_BOOTED) && foreign_stateid(id))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3125
		return (NFS4ERR_STALE_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3127
	sp = rfs4_findstate(id, find_invalid, lock_fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3128
	if (sp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3129
		return (what_stateid_error(id, OPENID));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3130
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3132
	if (rfs4_lease_expired(sp->owner->client)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3133
		if (lock_fp == TRUE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3134
			rfs4_state_rele(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3135
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3136
			rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3137
		return (NFS4ERR_EXPIRED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3138
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3140
	*spp = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3142
	return (NFS4_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3143
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3145
nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3146
rfs4_get_state(stateid4 *stateid, rfs4_state_t **spp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3147
		rfs4_dbsearch_type_t find_invalid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3148
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3149
	return (rfs4_get_state_lockit(stateid, spp, find_invalid, TRUE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3150
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3152
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3153
rfs4_check_stateid_seqid(rfs4_state_t *sp, stateid4 *stateid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3154
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3155
	stateid_t *id = (stateid_t *)stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3157
	if (rfs4_lease_expired(sp->owner->client))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3158
		return (NFS4_CHECK_STATEID_EXPIRED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3159
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3160
	/* Stateid is some time in the future - that's bad */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3161
	if (sp->stateid.bits.chgseq < id->bits.chgseq)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3162
		return (NFS4_CHECK_STATEID_BAD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3164
	if (sp->stateid.bits.chgseq == id->bits.chgseq + 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3165
		return (NFS4_CHECK_STATEID_REPLAY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3167
	/* Stateid is some time in the past - that's old */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3168
	if (sp->stateid.bits.chgseq > id->bits.chgseq)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3169
		return (NFS4_CHECK_STATEID_OLD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3171
	/* Caller needs to know about confirmation before closure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3172
	if (sp->owner->need_confirm)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3173
		return (NFS4_CHECK_STATEID_UNCONFIRMED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3175
	if (sp->closed == TRUE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3176
		return (NFS4_CHECK_STATEID_CLOSED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3178
	return (NFS4_CHECK_STATEID_OKAY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3179
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3181
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3182
rfs4_check_lo_stateid_seqid(rfs4_lo_state_t *lsp, stateid4 *stateid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3183
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3184
	stateid_t *id = (stateid_t *)stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3186
	if (rfs4_lease_expired(lsp->state->owner->client))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3187
		return (NFS4_CHECK_STATEID_EXPIRED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3189
	/* Stateid is some time in the future - that's bad */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3190
	if (lsp->lockid.bits.chgseq < id->bits.chgseq)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3191
		return (NFS4_CHECK_STATEID_BAD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3193
	if (lsp->lockid.bits.chgseq == id->bits.chgseq + 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3194
		return (NFS4_CHECK_STATEID_REPLAY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3196
	/* Stateid is some time in the past - that's old */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3197
	if (lsp->lockid.bits.chgseq > id->bits.chgseq)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3198
		return (NFS4_CHECK_STATEID_OLD);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3199
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3200
	return (NFS4_CHECK_STATEID_OKAY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3201
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3203
nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3204
rfs4_get_deleg_state(stateid4 *stateid, rfs4_deleg_state_t **dspp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3205
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3206
	stateid_t *id = (stateid_t *)stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3207
	rfs4_deleg_state_t *dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3209
	*dspp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3210
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3211
	/* If we are booted as a cluster node, was stateid locally generated? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3212
	if ((cluster_bootflags & CLUSTER_BOOTED) && foreign_stateid(id))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3213
		return (NFS4ERR_STALE_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3215
	dsp = rfs4_finddelegstate(id);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3216
	if (dsp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3217
		return (what_stateid_error(id, DELEGID));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3218
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3220
	if (rfs4_lease_expired(dsp->client)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3221
		rfs4_deleg_state_rele(dsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3222
		return (NFS4ERR_EXPIRED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3223
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3225
	*dspp = dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3227
	return (NFS4_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3228
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3230
nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3231
rfs4_get_lo_state(stateid4 *stateid, rfs4_lo_state_t **lspp, bool_t lock_fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3232
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3233
	stateid_t *id = (stateid_t *)stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3234
	rfs4_lo_state_t *lsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3236
	*lspp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3238
	/* If we are booted as a cluster node, was stateid locally generated? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3239
	if ((cluster_bootflags & CLUSTER_BOOTED) && foreign_stateid(id))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3240
		return (NFS4ERR_STALE_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3242
	lsp = rfs4_findlo_state(id, lock_fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3243
	if (lsp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3244
		return (what_stateid_error(id, LOCKID));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3245
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3247
	if (rfs4_lease_expired(lsp->state->owner->client)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3248
		rfs4_lo_state_rele(lsp, lock_fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3249
		return (NFS4ERR_EXPIRED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3250
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3251
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3252
	*lspp = lsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3254
	return (NFS4_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3255
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3257
static nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3258
rfs4_get_all_state(stateid4 *sid, rfs4_state_t **spp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3259
	rfs4_deleg_state_t **dspp, rfs4_lo_state_t **lospp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3260
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3261
	rfs4_state_t *sp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3262
	rfs4_deleg_state_t *dsp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3263
	rfs4_lo_state_t *losp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3264
	stateid_t *id;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3265
	nfsstat4 status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3267
	*spp = NULL; *dspp = NULL; *lospp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3269
	id = (stateid_t *)sid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3270
	switch (id->bits.type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3271
	case OPENID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3272
		status = rfs4_get_state_lockit(sid, &sp, FALSE, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3273
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3274
	case DELEGID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3275
		status = rfs4_get_deleg_state(sid, &dsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3276
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3277
	case LOCKID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3278
		status = rfs4_get_lo_state(sid, &losp, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3279
		if (status == NFS4_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3280
			sp = losp->state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3281
			rfs4_dbe_hold(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3282
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3283
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3284
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3285
		status = NFS4ERR_BAD_STATEID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3286
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3287
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3288
	if (status == NFS4_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3289
		*spp = sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3290
		*dspp = dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3291
		*lospp = losp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3292
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3294
	return (status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3295
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3297
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3298
 * Given the I/O mode (FREAD or FWRITE), this checks whether the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3299
 * rfs4_state_t struct has access to do this operation and if so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3300
 * return NFS4_OK; otherwise the proper NFSv4 error is returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3301
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3302
nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3303
rfs4_state_has_access(rfs4_state_t *sp, int mode, vnode_t *vp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3304
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3305
	nfsstat4 stat = NFS4_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3306
	rfs4_file_t *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3307
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3309
	rfs4_dbe_lock(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3310
	if (mode == FWRITE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3311
		if (!(sp->share_access & OPEN4_SHARE_ACCESS_WRITE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3312
			stat = NFS4ERR_OPENMODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3313
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3314
	} else if (mode == FREAD) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3315
		if (!(sp->share_access & OPEN4_SHARE_ACCESS_READ)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3316
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3317
			 * If we have OPENed the file with DENYing access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3318
			 * to both READ and WRITE then no one else could
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3319
			 * have OPENed the file, hence no conflicting READ
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3320
			 * deny.  This check is merely an optimization.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3321
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3322
			if (sp->share_deny == OPEN4_SHARE_DENY_BOTH)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3323
				goto out;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3325
			/* Check against file struct's DENY mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3326
			fp = rfs4_findfile(vp, NULL, &create);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3327
			if (fp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3328
				int deny_read = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3329
				rfs4_dbe_lock(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3330
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3331
				 * Check if any other open owner has the file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3332
				 * OPENed with deny READ.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3333
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3334
				if (sp->share_deny & OPEN4_SHARE_DENY_READ)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3335
					deny_read = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3336
				ASSERT(fp->deny_read - deny_read >= 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3337
				if (fp->deny_read - deny_read > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3338
					stat = NFS4ERR_OPENMODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3339
				rfs4_dbe_unlock(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3340
				rfs4_file_rele(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3341
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3342
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3343
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3344
		/* Illegal I/O mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3345
		stat = NFS4ERR_INVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3346
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3347
out:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3348
	rfs4_dbe_unlock(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3349
	return (stat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3350
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3352
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3353
 * Given the I/O mode (FREAD or FWRITE), the vnode, the stateid and whether
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3354
 * the file is being truncated, return NFS4_OK if allowed or approriate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3355
 * V4 error if not. Note NFS4ERR_DELAY will be returned and a recall on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3356
 * the associated file will be done if the I/O is not consistent with any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3357
 * delegation in effect on the file. Should be holding VOP_RWLOCK, either
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3358
 * as reader or writer as appropriate. rfs4_op_open will accquire the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3359
 * VOP_RWLOCK as writer when setting up delegation. If the stateid is bad
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3360
 * this routine will return NFS4ERR_BAD_STATEID. In addition, through the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3361
 * deleg parameter, we will return whether a write delegation is held by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3362
 * the client associated with this stateid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3363
 * If the server instance associated with the relevant client is in its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3364
 * grace period, return NFS4ERR_GRACE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3365
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3367
nfsstat4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3368
rfs4_check_stateid(int mode, vnode_t *vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3369
		stateid4 *stateid, bool_t trunc, bool_t *deleg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3370
		bool_t do_access)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3371
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3372
	rfs4_file_t *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3373
	bool_t create = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3374
	rfs4_state_t *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3375
	rfs4_deleg_state_t *dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3376
	rfs4_lo_state_t *lsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3377
	stateid_t *id = (stateid_t *)stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3378
	nfsstat4 stat = NFS4_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3380
	if (ISSPECIAL(stateid)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3381
		fp = rfs4_findfile(vp, NULL, &create);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3382
		if (fp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3383
			return (NFS4_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3384
		if (fp->dinfo->dtype == OPEN_DELEGATE_NONE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3385
			rfs4_file_rele(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3386
			return (NFS4_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3387
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3388
		if (mode == FWRITE ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3389
			fp->dinfo->dtype == OPEN_DELEGATE_WRITE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3390
			rfs4_recall_deleg(fp, trunc, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3391
			rfs4_file_rele(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3392
			return (NFS4ERR_DELAY);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3393
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3394
		rfs4_file_rele(fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3395
		return (NFS4_OK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3396
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3397
		stat = rfs4_get_all_state(stateid, &sp, &dsp, &lsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3398
		if (stat != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3399
			return (stat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3400
		if (lsp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3401
			/* Is associated server instance in its grace period? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3402
			if (rfs4_clnt_in_grace(lsp->locker->client)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3403
				rfs4_lo_state_rele(lsp, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3404
				if (sp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3405
					rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3406
				return (NFS4ERR_GRACE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3407
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3408
			if (id->bits.type == LOCKID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3409
				/* Seqid in the future? - that's bad */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3410
				if (lsp->lockid.bits.chgseq <
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3411
					id->bits.chgseq) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3412
					rfs4_lo_state_rele(lsp, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3413
					if (sp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3414
						rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3415
					return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3416
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3417
				/* Seqid in the past? - that's old */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3418
				if (lsp->lockid.bits.chgseq >
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3419
					id->bits.chgseq) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3420
					rfs4_lo_state_rele(lsp, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3421
					if (sp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3422
						rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3423
					return (NFS4ERR_OLD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3424
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3425
				/* Ensure specified filehandle matches */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3426
				if (lsp->state->finfo->vp != vp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3427
					rfs4_lo_state_rele(lsp, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3428
					if (sp != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3429
						rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3430
					return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3431
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3432
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3433
			rfs4_lo_state_rele(lsp, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3434
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3436
		/* Stateid provided was an "open" stateid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3437
		if (sp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3438
			/* Is associated server instance in its grace period? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3439
			if (rfs4_clnt_in_grace(sp->owner->client)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3440
				rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3441
				return (NFS4ERR_GRACE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3442
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3443
			if (id->bits.type == OPENID) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3444
				/* Seqid in the future? - that's bad */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3445
				if (sp->stateid.bits.chgseq <
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3446
					id->bits.chgseq) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3447
					rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3448
					return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3449
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3450
				/* Seqid in the past - that's old */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3451
				if (sp->stateid.bits.chgseq >
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3452
					id->bits.chgseq) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3453
					rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3454
					return (NFS4ERR_OLD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3455
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3456
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3457
			/* Ensure specified filehandle matches */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3458
			if (sp->finfo->vp != vp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3459
				rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3460
				return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3461
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3463
			if (sp->owner->need_confirm) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3464
				rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3465
				return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3466
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3468
			if (sp->closed == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3469
				rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3470
				return (NFS4ERR_OLD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3471
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3473
			if (do_access)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3474
				stat = rfs4_state_has_access(sp, mode, vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3475
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3476
				stat = NFS4_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3478
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3479
			 * Return whether this state has write
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3480
			 * delegation if desired
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3481
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3482
			if (deleg &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3483
			    (sp->finfo->dinfo->dtype == OPEN_DELEGATE_WRITE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3484
				*deleg = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3486
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3487
			 * We got a valid stateid, so we update the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3488
			 * lease on the client. Ideally we would like
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3489
			 * to do this after the calling op succeeds,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3490
			 * but for now this will be good
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3491
			 * enough. Callers of this routine are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3492
			 * currently insulated from the state stuff.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3493
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3494
			rfs4_update_lease(sp->owner->client);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3496
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3497
			 * If a delegation is present on this file and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3498
			 * this is a WRITE, then update the lastwrite
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3499
			 * time to indicate that activity is present.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3500
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3501
			if (sp->finfo->dinfo->dtype == OPEN_DELEGATE_WRITE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3502
				mode == FWRITE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3503
				sp->finfo->dinfo->time_lastwrite =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3504
					gethrestime_sec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3505
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3507
			rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3509
			return (stat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3510
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3512
		if (dsp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3513
			/* Is associated server instance in its grace period? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3514
			if (rfs4_clnt_in_grace(dsp->client)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3515
				rfs4_deleg_state_rele(dsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3516
				return (NFS4ERR_GRACE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3517
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3518
			if (dsp->delegid.bits.chgseq !=	id->bits.chgseq) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3519
				rfs4_deleg_state_rele(dsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3520
				return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3521
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3523
			/* Ensure specified filehandle matches */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3524
			if (dsp->finfo->vp != vp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3525
				rfs4_deleg_state_rele(dsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3526
				return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3527
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3528
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3529
			 * Return whether this state has write
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3530
			 * delegation if desired
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3531
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3532
			if (deleg &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3533
			    (dsp->finfo->dinfo->dtype == OPEN_DELEGATE_WRITE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3534
				*deleg = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3535
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3536
			rfs4_update_lease(dsp->client);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3537
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3538
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3539
			 * If a delegation is present on this file and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3540
			 * this is a WRITE, then update the lastwrite
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3541
			 * time to indicate that activity is present.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3542
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3543
			if (dsp->finfo->dinfo->dtype == OPEN_DELEGATE_WRITE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3544
				mode == FWRITE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3545
				dsp->finfo->dinfo->time_lastwrite =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3546
					gethrestime_sec();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3547
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3549
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3550
			 * XXX - what happens if this is a WRITE and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3551
			 * delegation type of for READ.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3552
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3553
			rfs4_deleg_state_rele(dsp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3555
			return (stat);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3556
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3557
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3558
		 * If we got this far, something bad happened
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3559
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3560
		return (NFS4ERR_BAD_STATEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3561
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3562
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3565
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3566
 * This is a special function in that for the file struct provided the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3567
 * server wants to remove/close all current state associated with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3568
 * file.  The prime use of this would be with OP_REMOVE to force the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3569
 * release of state and particularly of file locks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3570
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3571
 * There is an assumption that there is no delegations outstanding on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3572
 * this file at this point.  The caller should have waited for those
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3573
 * to be returned or revoked.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3574
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3575
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3576
rfs4_close_all_state(rfs4_file_t *fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3577
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3578
	rfs4_state_t *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3579
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3580
	rfs4_dbe_lock(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3582
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3583
	/* only applies when server is handing out delegations */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3584
	if (rfs4_deleg_policy != SRV_NEVER_DELEGATE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3585
		ASSERT(fp->dinfo->hold_grant > 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3586
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3587
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3588
	/* No delegations for this file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3589
	ASSERT(fp->delegationlist.next == &fp->delegationlist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3591
	/* Make sure that it can not be found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3592
	rfs4_dbe_invalidate(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3594
	if (fp->vp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3595
		rfs4_dbe_unlock(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3596
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3597
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3598
	rfs4_dbe_unlock(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3600
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3601
	 * Hold as writer to prevent other server threads from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3602
	 * processing requests related to the file while all state is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3603
	 * being removed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3604
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3605
	rw_enter(&fp->file_rwlock, RW_WRITER);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3607
	/* Remove ALL state from the file */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3608
	while (sp = rfs4_findstate_by_file(fp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3609
		rfs4_state_close(sp, FALSE, FALSE, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3610
		rfs4_state_rele_nounlock(sp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3611
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3613
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3614
	 * This is only safe since there are no further references to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3615
	 * the file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3616
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3617
	rfs4_dbe_lock(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3618
	if (fp->vp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3619
		VN_RELE(fp->vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3620
		fp->vp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3621
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3622
	rfs4_dbe_unlock(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3623
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3624
	/* Finally let other references to proceed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3625
	rw_exit(&fp->file_rwlock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3626
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3627
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3628
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3629
 * This function is used as a target for the rfs4_dbe_walk() call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3630
 * below.  The purpose of this function is to see if the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3631
 * lockowner_state refers to a file that resides within the exportinfo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3632
 * export.  If so, then remove the lock_owner state (file locks and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3633
 * share "locks") for this object since the intent is the server is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3634
 * unexporting the specified directory.  Be sure to invalidate the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3635
 * object after the state has been released
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3636
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3637
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3638
rfs4_lo_state_walk_callout(rfs4_entry_t u_entry, void *e)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3639
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3640
	rfs4_lo_state_t *lsp = (rfs4_lo_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3641
	struct exportinfo *exi = (struct exportinfo *)e;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3642
	nfs_fh4_fmt_t	*exi_fhp, *finfo_fhp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3644
	exi_fhp = (nfs_fh4_fmt_t *)&exi->exi_fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3645
	finfo_fhp =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3646
		(nfs_fh4_fmt_t *)lsp->state->finfo->filehandle.nfs_fh4_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3648
	if (EQFSID(&finfo_fhp->fh4_fsid, &exi_fhp->fh4_fsid) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3649
	    bcmp(&finfo_fhp->fh4_xdata, &exi_fhp->fh4_xdata,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3650
		exi_fhp->fh4_xlen) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3651
		rfs4_state_close(lsp->state, FALSE, FALSE, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3652
		rfs4_dbe_invalidate(lsp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3653
		rfs4_dbe_invalidate(lsp->state->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3654
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3655
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3657
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3658
 * This function is used as a target for the rfs4_dbe_walk() call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3659
 * below.  The purpose of this function is to see if the state refers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3660
 * to a file that resides within the exportinfo export.  If so, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3661
 * remove the open state for this object since the intent is the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3662
 * server is unexporting the specified directory.  The main result for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3663
 * this type of entry is to invalidate it such it will not be found in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3664
 * the future.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3665
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3666
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3667
rfs4_state_walk_callout(rfs4_entry_t u_entry, void *e)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3668
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3669
	rfs4_state_t *sp = (rfs4_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3670
	struct exportinfo *exi = (struct exportinfo *)e;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3671
	nfs_fh4_fmt_t	*exi_fhp, *finfo_fhp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3673
	exi_fhp = (nfs_fh4_fmt_t *)&exi->exi_fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3674
	finfo_fhp =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3675
		(nfs_fh4_fmt_t *)sp->finfo->filehandle.nfs_fh4_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3677
	if (EQFSID(&finfo_fhp->fh4_fsid, &exi_fhp->fh4_fsid) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3678
	    bcmp(&finfo_fhp->fh4_xdata, &exi_fhp->fh4_xdata,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3679
		exi_fhp->fh4_xlen) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3680
		rfs4_state_close(sp, TRUE, FALSE, CRED());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3681
		rfs4_dbe_invalidate(sp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3682
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3683
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3684
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3685
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3686
 * This function is used as a target for the rfs4_dbe_walk() call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3687
 * below.  The purpose of this function is to see if the state refers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3688
 * to a file that resides within the exportinfo export.  If so, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3689
 * remove the deleg state for this object since the intent is the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3690
 * server is unexporting the specified directory.  The main result for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3691
 * this type of entry is to invalidate it such it will not be found in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3692
 * the future.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3693
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3694
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3695
rfs4_deleg_state_walk_callout(rfs4_entry_t u_entry, void *e)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3696
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3697
	rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3698
	struct exportinfo *exi = (struct exportinfo *)e;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3699
	nfs_fh4_fmt_t	*exi_fhp, *finfo_fhp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3701
	exi_fhp = (nfs_fh4_fmt_t *)&exi->exi_fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3702
	finfo_fhp =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3703
		(nfs_fh4_fmt_t *)dsp->finfo->filehandle.nfs_fh4_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3705
	if (EQFSID(&finfo_fhp->fh4_fsid, &exi_fhp->fh4_fsid) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3706
	    bcmp(&finfo_fhp->fh4_xdata, &exi_fhp->fh4_xdata,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3707
		exi_fhp->fh4_xlen) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3708
		rfs4_dbe_invalidate(dsp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3709
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3710
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3711
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3712
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3713
 * This function is used as a target for the rfs4_dbe_walk() call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3714
 * below.  The purpose of this function is to see if the state refers
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3715
 * to a file that resides within the exportinfo export.  If so, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3716
 * release vnode hold for this object since the intent is the server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3717
 * is unexporting the specified directory.  Invalidation will prevent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3718
 * this struct from being found in the future.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3719
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3720
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3721
rfs4_file_walk_callout(rfs4_entry_t u_entry, void *e)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3722
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3723
	rfs4_file_t *fp = (rfs4_file_t *)u_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3724
	struct exportinfo *exi = (struct exportinfo *)e;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3725
	nfs_fh4_fmt_t *exi_fhp, *finfo_fhp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3727
	exi_fhp = (nfs_fh4_fmt_t *)&exi->exi_fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3728
	finfo_fhp = (nfs_fh4_fmt_t *)fp->filehandle.nfs_fh4_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3729
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3730
	if (EQFSID(&finfo_fhp->fh4_fsid, &exi_fhp->fh4_fsid) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3731
	    bcmp(&finfo_fhp->fh4_xdata, &exi_fhp->fh4_xdata,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3732
		exi_fhp->fh4_xlen) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3733
		if (fp->vp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3734
			/* don't leak monitors */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3735
			if (fp->dinfo->dtype == OPEN_DELEGATE_READ)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3736
				(void) fem_uninstall(fp->vp, deleg_rdops,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3737
						(void *)fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3738
			else if (fp->dinfo->dtype == OPEN_DELEGATE_WRITE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3739
				(void) fem_uninstall(fp->vp, deleg_wrops,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3740
						(void *)fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3741
			VN_RELE(fp->vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3742
			fp->vp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3743
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3744
		rfs4_dbe_invalidate(fp->dbe);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3745
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3746
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3747
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3748
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3749
 * Given a directory that is being unexported, cleanup/release all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3750
 * state in the server that refers to objects residing underneath this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3751
 * particular export.  The ordering of the release is important.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3752
 * Lock_owner, then state and then file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3753
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3754
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3755
rfs4_clean_state_exi(struct exportinfo *exi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3756
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3757
	mutex_enter(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3758
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3759
	if (rfs4_server_state == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3760
		mutex_exit(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3761
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3762
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3763
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3764
	rfs4_dbe_walk(rfs4_lo_state_tab, rfs4_lo_state_walk_callout, exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3765
	rfs4_dbe_walk(rfs4_state_tab, rfs4_state_walk_callout, exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3766
	rfs4_dbe_walk(rfs4_deleg_state_tab, rfs4_deleg_state_walk_callout, exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3767
	rfs4_dbe_walk(rfs4_file_tab, rfs4_file_walk_callout, exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3769
	mutex_exit(&rfs4_state_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3770
}