usr/src/uts/common/nfs/nfs4.h
author thurlow
Mon, 13 Mar 2006 17:10:47 -0800
changeset 1610 3436e82414c8
parent 1232 1a9b1651d839
child 2035 a29bc457bcb9
permissions -rw-r--r--
6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
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
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
     5
 * Common Development and Distribution License (the "License").
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
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
/*
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
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
#ifndef _NFS4_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#define	_NFS4_H
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <sys/vnode.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <sys/fem.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <rpc/rpc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
#include <nfs/nfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#include <nfs/nfs4_kprot.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <rpcsvc/nfs4_prot.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <nfs/nfs4_attr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <sys/acl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
extern "C" {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#define	NFS4_MAX_UTF8STRING	65536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#define	NFS4_MAX_PATHNAME4	65536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
#define	NFS4_MAX_SECOID4	65536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
#ifdef _KERNEL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
typedef struct nfs4_fhandle {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
	int fh_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
	char fh_buf[NFS4_FHSIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
} nfs4_fhandle_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#define	NFS4_MINORVERSION 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#define	CB4_MINORVERSION 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
 * Set the fattr4_change variable using a time struct. Note that change
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
 * is 64 bits, but timestruc_t is 128 bits in a 64-bit kernel.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
#define	NFS4_SET_FATTR4_CHANGE(change, ts)			\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
{							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
	change = (ts).tv_sec;				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
	change <<= 32;					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
	change |= (uint32_t)((ts).tv_nsec);		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
 * Server lease period.  Value is in seconds;  Also used for grace period
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
extern time_t rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
 * This set of typedefs and interfaces represent the core or base set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
 * of functionality that backs the NFSv4 server's state related data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 * structures.  Since the NFSv4 server needs inter-RPC state to be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 * available that is unrelated to the filesystem (in other words,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
 * soft-state), this functionality is needed to maintain that and is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
 * written to be somewhat flexible to adapt to the various types of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
 * data structures contained within the server.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
 * The basic structure at this level is that the server maintains a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
 * global "database" which consists of a set of tables.  Each table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
 * contains a set of like data structures.  Each table is indexed by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
 * at least one hash function and in most cases two hashes.  Each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
 * table's characteristics is set when it is created at run-time via
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
 * rfs4_table_create().  All table creation and related functions are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
 * located in nfs4_state.c.  The generic database functionality is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
 * located in nfs4_db.c.
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
typedef struct rfs4_dbe rfs4_dbe_t;		/* basic opaque db entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
typedef struct rfs4_table rfs4_table_t;		/* basic table type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
typedef struct rfs4_index rfs4_index_t;		/* index */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
typedef struct rfs4_database rfs4_database_t;	/* and database */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
typedef struct {		/* opaque entry type for later use */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	rfs4_dbe_t *dbe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
} *rfs4_entry_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
extern rfs4_table_t *rfs4_client_tab;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
/* database, table, index creation entry points */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
extern rfs4_database_t *rfs4_database_create(uint32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
extern void		rfs4_database_shutdown(rfs4_database_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
extern void		rfs4_database_destroy(rfs4_database_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
extern void		rfs4_database_destroy(rfs4_database_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
extern rfs4_table_t	*rfs4_table_create(rfs4_database_t *, char *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
				time_t, uint32_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
				bool_t (*create)(rfs4_entry_t, void *),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
				void (*destroy)(rfs4_entry_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
				bool_t (*expiry)(rfs4_entry_t),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
				uint32_t, uint32_t, uint32_t, id_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
extern void		rfs4_table_destroy(rfs4_database_t *, rfs4_table_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
extern rfs4_index_t	*rfs4_index_create(rfs4_table_t *, char *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
				uint32_t (*hash)(void *),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
				bool_t (compare)(rfs4_entry_t, void *),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
				void *(*mkkey)(rfs4_entry_t), bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
extern void		rfs4_index_destroy(rfs4_index_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
/* Type used to direct rfs4_dbsearch() in what types of records to inspect */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
typedef enum {RFS4_DBS_VALID, RFS4_DBS_INVALID} rfs4_dbsearch_type_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
/* search and db entry manipulation entry points */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
extern rfs4_entry_t	rfs4_dbsearch(rfs4_index_t *, void *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
				bool_t *, void *, rfs4_dbsearch_type_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
extern void		rfs4_dbe_lock(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
extern void		rfs4_dbe_unlock(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
extern clock_t		rfs4_dbe_twait(rfs4_dbe_t *, clock_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
extern void		rfs4_dbe_cv_broadcast(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
extern void		rfs4_dbe_hold(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
extern void		rfs4_dbe_hold_nolock(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
extern void		rfs4_dbe_rele_nolock(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
extern void		rfs4_dbe_rele(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
extern uint32_t	rfs4_dbe_refcnt(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
extern id_t		rfs4_dbe_getid(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
extern void		rfs4_dbe_invalidate(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
extern bool_t		rfs4_dbe_is_invalid(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
extern time_t		rfs4_dbe_get_timerele(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
extern void		rfs4_dbe_hide(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
extern void		rfs4_dbe_unhide(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
extern bool_t		rfs4_dbe_islocked(rfs4_dbe_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
extern void		rfs4_dbe_walk(rfs4_table_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
			void (*callout)(rfs4_entry_t, void *), void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
 * Minimal server stable storage.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
 * Currently the NFSv4 server will only save the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
 * ID (the long version) so that it will be able to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
 * grant possible reclaim requests during the infamous
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
 * grace_period.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
#define	RFS4_SS_DIRSIZE	64 * 1024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
#define	NFS4_SS_VERSION 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
/* handy pathname structure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
typedef struct ss_pn {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
	char *leaf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
	char pn[MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
} rfs4_ss_pn_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
 * The server will build this link list on startup. It represents the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
 * clients that have had valid state on the server in a prior instance.
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
typedef struct rfs4_oldstate {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	struct rfs4_oldstate 	*next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	struct rfs4_oldstate 	*prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	rfs4_ss_pn_t		*ss_pn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	nfs_client_id4		cl_id4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
} rfs4_oldstate_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
 * This union is used to overlay the server's internal treatment of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
 * the protocols stateid4 datatype.  Therefore, "bits" must not exceed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 * the size of stateid4 and more importantly should match the size of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 * stateid4.  The chgseq field must the first entry since it overlays
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 * stateid4.seqid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
typedef union {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
	stateid4 stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
		uint32_t chgseq;	/* State changes / protocol's seqid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		uint32_t boottime;	/* boot time  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		uint32_t type:2;	/* stateid_type_t as define below */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
		uint32_t clnodeid:8;	/* cluster server nodeid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
		uint32_t ident:22;	/* 2^22-1 openowner x fhs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
		pid_t	 pid;		/* pid of corresponding lock owner */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	} bits;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
} stateid_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
 * Note that the way the type field above is defined, this enum must
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
 * not have more than 4 members.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
typedef enum {OPENID, LOCKID, DELEGID} stateid_type_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
 * Set of RPC credentials used for a particular operation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
 * Used for operations like SETCLIENTID_CONFIRM where the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
 * credentials needs to match those used at SETCLIENTID.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
typedef void *cred_set_t;		/* For now XXX */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
 * "wait" struct for use in the open open and lock owner state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
 * structures to provide serialization between server threads that are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
 * handling requests for the same open owner or lock stateid.  This
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
 * way only one thread will be updating things like sequence ids,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
 * replay cache and stateid at a time.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
typedef struct rfs4_state_wait {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	uint32_t		sw_active;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	uint32_t		sw_wait_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
	kmutex_t		sw_cv_lock[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
	kcondvar_t		sw_cv[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
} rfs4_state_wait_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
extern void	rfs4_sw_enter(rfs4_state_wait_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
extern void	rfs4_sw_exit(rfs4_state_wait_t *);
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
 * This enum and the following rfs4_cbinfo_t struct are used to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
 * maintain information about the callback path used from the server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
 * to client for operations like CB_GETATTR and CB_RECALL.  The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
 * rfs4_cbinfo_t struct is meant to be encompassed in the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
 * struct and managed within that structure's locking scheme.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
 * The various states of the callback path are used by the server to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
 * determine if delegations should initially be provided to a client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
 * and then later on if connectivity has been lost and delegations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
 * should be revoked.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
 * CB_NOCHANGE - Special value used for interfaces within the delegation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
 *		code to signify that "no change" has occurred to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
 *		callback path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
 * CB_UNINIT	- No callback info provided by the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
 * CB_NONE	- Callback info provided but CB_NULL call
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
 *		  has yet to be attempted
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
 * CB_OK	- Callback path tested with CB_NULL with success
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
 * CB_INPROG	- Callback path currently being tested with CB_NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
 * CB_FAILED	- Callback path was == CB_OK but has failed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
 *		  with timeout/rpc error
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
 * CB_BAD	- Callback info provided but CB_NULL failed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
typedef enum {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	CB_NOCHANGE = 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	CB_UNINIT = 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	CB_NONE = 2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	CB_OK = 3,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
	CB_INPROG = 4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	CB_FAILED = 5,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
	CB_BAD = 6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
} rfs4_cbstate_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
#define	RFS4_CBCH_MAX	10	/* size callback client handle cache */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
 * Callback info for a client.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
 * Client only provides: cb_client4 and cb_ident
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
 * The rest of the information is used to track callback path status
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
 * and usage.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
 * cb_state - used as comments for the rfs4_cbstate_t enum indicate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
 * cb_notified_of_cb_path_down - if the callback path was once CB_OK and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
 *	has hence CB_FAILED, the client needs to be notified via RENEW.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
 * cb_timefailed - current time when cb_state transitioned from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
 *	CB_OK -> CB_FAILED.  Meant for observability.  When did that happen?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
 * cb_chc_free/cb_chc - cache of client handles for the callback path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
 * cb_ident - SETCLIENTID provided callback_ident value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
 * callback - SETCLIENTID provided cb_client4 value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
 * cb_refcnt - current number of users of this structure's content
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
 *	protected by cb_lock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
 * cb_badbehavior - how many times did a client do something we didn't like?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
 * cb_lock - lock for contents of cbinfo
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
 * cb_cv - used to allow threads to wait on CB_NULL completion
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
 * cb_nullcaller - is there a thread currently taking care of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
 *	new callback information?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
 * cb_cv_nullcaller - used by the thread doing CB_NULL to wait on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
 *	threads that may be using client handles of the current
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
 *	client handle cache.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
 * newer - new callback info provided by a client and awaiting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
 *	CB_NULL testing and move to regular cbinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
typedef struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
	rfs4_cbstate_t	cb_state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	unsigned	cb_notified_of_cb_path_down:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	time_t		cb_timefailed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	int		cb_chc_free;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	CLIENT		*cb_chc[RFS4_CBCH_MAX];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	uint32_t	cb_ident;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	cb_client4	cb_callback;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	uint32_t	cb_refcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	uint32_t	cb_badbehavior;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	kmutex_t	cb_lock[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	kcondvar_t	cb_cv[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	bool_t		cb_nullcaller;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	kcondvar_t	cb_cv_nullcaller[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
	struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		bool_t		cb_new;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		bool_t		cb_confirmed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		uint32_t	cb_ident;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		cb_client4	cb_callback;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	} cb_newer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
} rfs4_cbinfo_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
 * A server instance. We can associate sets of clients - via a pointer in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
 * rfs4_client_t - with a given server instance, allowing us to treat clients
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
 * in the set differently to clients in other sets.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
 * Currently used only for Sun Cluster HA-NFS support, to group clients
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
 * on NFS resource failover so each set of clients gets its own dedicated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
 * grace period.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
typedef struct rfs4_servinst {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
	krwlock_t		rwlock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
	time_t			start_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	time_t			grace_period;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	struct rfs4_servinst	*next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	struct rfs4_servinst	*prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
} rfs4_servinst_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
 * List declarations (suitable for insque/remque) used to link the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
 * various datastructs listed below.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
typedef struct rfs4_state_list {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	struct rfs4_state_list *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
	struct rfs4_state_list *prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
	struct rfs4_state *sp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
} rfs4_state_list_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
typedef struct rfs4_lo_state_list {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	struct rfs4_lo_state_list *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	struct rfs4_lo_state_list *prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	struct rfs4_lo_state *lsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
} rfs4_lo_state_list_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
typedef struct rfs4_openowner_list {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	struct rfs4_openowner_list *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	struct rfs4_openowner_list *prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	struct rfs4_openowner *oop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
} rfs4_openowner_list_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
typedef struct rfs4_deleg_list {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
	struct rfs4_deleg_list *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	struct rfs4_deleg_list *prev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	struct rfs4_deleg_state *dsp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
} rfs4_deleg_list_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
 * The server maintains a set of state on a per client basis that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
 * matches that of the protocol requirements.  A client's state is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
 * rooted with the rfs4_client_t struct of which there is one per
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
 * client and is created when SETCLIENTID/SETCLIENTID_CONFIRM are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
 * received.  From there, the server then creates rfs4_openowner_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
 * structs for each new open owner from that client and are initiated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
 * at OPEN/OPEN_CONFIRM (when the open owner is new to the server).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
 * At OPEN, at least two other structures are created, and potentially a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
 * third.  rfs4_state_t is created to track the association between an
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
 * open owner and a particular file. An rfs4_file_t struct may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
 * created (if the file is not already open) at OPEN as well.  The
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
 * rfs4_file_t struct is the only one that is per server and not per
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
 * client.  The rfs4_deleg_state_t struct is created in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
 * instance that the server is going to provide a delegation for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
 * file being OPENed.  Finally, the rfs4_lockowner_t is created at the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
 * first use of a lock owner at the server and is a result of the LOCK
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
 * operation.  The rfs4_lo_state_t struct is then created to represent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
 * the relation between the lock owner and the file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
 * The following ascii art represents each of these data structs and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
 * their references to each other.  Note: "<-(x)->" represents the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
 * doubly link lists defined above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
 *                          ____________________
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
 *                         |                    |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
 *                         |    rfs4_client_t   |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
 *                       ->|         (1),(2)    |<-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
 *                      /  |____________________|  \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
 *                     /              ^             \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
 *                    /               |              \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
 *  ____________________    ____________________    ____________________
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
 * |                    |  |                    |  |                    |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
 * |  rfs4_lockowner_t  |  |  rfs4_openowner_t  |  | rfs4_deleg_state_t |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
 * |                    |  |     (3)    <-(1)-> |  |            <-(2)-> |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
 * |____________________|  |____________________|  |____________________|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
 *           ^                        ^                       |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
 *           |                        |                       V
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
 *  ____________________    ____________________    ____________________
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
 * |                    |  |                    |  |                    |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
 * |  rfs4_lo_state_t   |->|    rfs4_state_t    |->|     rfs4_file_t    |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
 * |            <-(4)-> |  |     (4)    <-(3)-> |  |                    |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
 * |____________________|  |____________________|  |____________________|
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
 * Each of these data types are kept in a separate rfs4_table_t and is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
 * actually encapsulated within a rfs4_dbe_t struct.  The various
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
 * tables and their construction is done in nfs4_state.c but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
 * documented here to completeness.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
 * Table		Data struct stored	Indexed by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
 * -----		------------------	----------
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
 * rfs4_client_tab	rfs4_client_t		nfs_client_id4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
 *						clientid4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
 * rfs4_openowner_tab	rfs4_openowner_t	open_owner4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
 * rfs4_state_tab	rfs4_state_t		open_owner4 | file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
 *						stateid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
 * rfs4_lo_state_tab	rfs4_lo_state_t		lockowner | stateid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
 *						lock_stateid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
 * rfs4_lockowner_tab	rfs4_lockowner_t	lockowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
 *						pid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
 * rfs4_file_tab	rfs4_file_t		filehandle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
 * rfs4_deleg_state_tab	rfs4_deleg_state_t	clientid4 | file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
 *						deleg_stateid
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
 * The client struct, it is the root of all state for a particular
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
 * client.  The client is identified by the nfs_client_id4 via
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
 * SETCLIENTID and the server returns the clientid4 as short hand reference
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
 * Client struct - as mentioned above it is the root of all state for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
 * a single client as identified by the client supplied nfs_client_id4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
 * dbe - encapsulation struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
 * clientid - server assigned short hand reference to client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
 * nfs_client - client supplied identifier for itself
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
 * confirm_verf - the value provided to the client for SETCLIENTID_CONFIRM
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
 * need_confirm - does this client need to be SETCLIENTID_CONFIRMed?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
 * unlksys_completed - has an F_UNLKSYS been done for this client which
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
 *		says that the use of cleanlocks() on individual files
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
 *		is not required?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
 * can_reclaim - indicates if client is allowed to reclaim after server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
 * 		start-up (client had previous state at server)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
 * ss_remove - indicates that the rfs4_client_destroy function should
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
 * 		clean up stable storage file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
 * forced_expire - set if the sysadmin has used clear_locks for this client.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
 * deleg_revoked - how many delegations have been revoked for this client?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
 * cp_confirmed - this refers to a confirmed client struct that has
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
 * the same nfs_client_id4 as this client struct.  When/if this client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
 * struct is confirmed via SETCLINETID_CONFIRM, the previously
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
 * confirmed client struct will be "closed" and hence this reference.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
 * last_access - used to determine if the client has let its lease expire
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
 * cbinfo - struct containing all callback related information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
 * cr_set - credentials used for the SETCLIENTID/SETCLIENTID_CONFIRM pair
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
 * sysid - the lock manager sysid allocated for this client's file locks
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
 * openownerlist - root of openowners list associated with this client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
 * clientdeleglist - root of delegations list provided to this client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
 * ss_pn - Pathname to the stable storage file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
 * cl_addr - Clients network address.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
 * server_instance - pointer to the currently associated server instance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
typedef struct rfs4_client {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	rfs4_dbe_t		*dbe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	clientid4		clientid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	nfs_client_id4		nfs_client;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	verifier4		confirm_verf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
	unsigned		need_confirm:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	unsigned		unlksys_completed:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	unsigned		can_reclaim:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	unsigned 		ss_remove:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	unsigned		forced_expire:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	uint_t			deleg_revoked;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	struct rfs4_client	*cp_confirmed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	time_t			last_access;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
	rfs4_cbinfo_t		cbinfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	cred_set_t		cr_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	sysid_t			sysidt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
	rfs4_openowner_list_t	openownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	rfs4_deleg_list_t	clientdeleglist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	rfs4_ss_pn_t		*ss_pn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	struct sockaddr_storage cl_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
	rfs4_servinst_t		*server_instance;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
} rfs4_client_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
 * The openowner contains the client supplied open_owner4 as well as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
 * the matching sequence id and is used to track the client's usage of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
 * the open_owner4.  Note that a reply is saved here as well for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
 * processing of retransmissions.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
 * dbe - encapsulation struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
 * client - reference to rfs4_client_t for this openowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
 * owner - actual client supplied open_owner4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
 * need_confirm - does this openowner need to be OPEN_CONFIRMed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
 * postpone_confirm - set if error received on first use of open_owner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
 * state2confirm - what stateid4 should be used on the OPEN_CONFIRM
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
 * open_seqid - what is the next open_seqid expected for this openowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
 * oo_sw - used to serialize access to the open seqid/reply handling
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
 * cr_set - credential used for the OPEN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
 * ownerstateids - root of state struct list associated with this openowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
 * openownerlist - list of openowners for a client struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
 * reply_fh - open replay processing needs the filehandle so that it is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
 *	able to reset the current filehandle for appropriate compound
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
 *	processing and reply.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
 * reply - last reply sent in relation to this openowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
typedef struct rfs4_openowner {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
	rfs4_dbe_t		*dbe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	rfs4_client_t		*client;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	open_owner4		owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	unsigned		need_confirm:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	unsigned		postpone_confirm:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	seqid4			open_seqid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	rfs4_state_wait_t	oo_sw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	cred_set_t		cr_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	rfs4_state_list_t	ownerstateids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	rfs4_openowner_list_t	openownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	nfs_fh4			reply_fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	nfs_resop4		reply[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
} rfs4_openowner_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
 * This state struct represents the association between an openowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
 * and a file that has been OPENed by that openowner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
 * dbe - encapsulation struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
 * stateid - server provided stateid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
 * owner - reference back to the openowner for this state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
 * finfo - reference to the open file for this state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
 * share_access - how did the openowner OPEN the file (access)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
 * share_deny - how did the openowner OPEN the file (deny)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
 * closed - has this file been closed?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
 * lockownerlist - root of list of lockowners associated with this state/file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
 * ownerstateids - list of state structs for an openowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
typedef struct rfs4_state {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	rfs4_dbe_t		*dbe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	stateid_t		stateid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	rfs4_openowner_t	*owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	struct rfs4_file	*finfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	uint32_t		share_access;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
	uint32_t		share_deny;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	unsigned		closed:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	rfs4_lo_state_list_t	lockownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
	rfs4_state_list_t	ownerstateids;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
} rfs4_state_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
 * Lockowner - track the lockowner and its related info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
 * dbe - encapsulation struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
 * client - reference to the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
 * owner - lockowner supplied by the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
 * pid - local identifier used for file locking
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
typedef struct rfs4_lockowner {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	rfs4_dbe_t	*dbe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	rfs4_client_t	*client;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	lock_owner4	owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	pid_t		pid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
} rfs4_lockowner_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
 * Lockowner_state associated with a state struct and lockowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
 * dbe - encapsulation struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
 * state - reference back to state struct for open file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
 * lockid - stateid for this lockowner/state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
 * locker - reference to lockowner
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
 * seqid - sequence id for this lockowner/state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
 * skip_seqid_check - used on initialization of struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
 * locks_cleaned - have all locks been released for this lockowner/file?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
 * lock_completed - successful LOCK with lockowner/file?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
 * ls_sw - used to serialize update seqid/reply/stateid handling
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
 * lockownerlist - list of lockowners for a state struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
 * reply - last reply sent in relation to this lockowner/state
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
typedef struct rfs4_lo_state {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
	rfs4_dbe_t		*dbe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	rfs4_state_t		*state;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
	stateid_t		lockid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
	rfs4_lockowner_t	*locker;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
	seqid4			seqid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
	unsigned		skip_seqid_check:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
	unsigned		locks_cleaned:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
	unsigned		lock_completed:1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	rfs4_state_wait_t	ls_sw;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
	rfs4_lo_state_list_t	lockownerlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	nfs_resop4		reply[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
} rfs4_lo_state_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
 * Delegation state - per client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
 * dbe - encapsulation struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
 * dtype - type of delegation (NONE, READ, WRITE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
 * delegid - stateid for this delegation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
 * time_granted - time this delegation was assigned to client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
 * time_recalled - time when the server started recall process
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
 * time_revoked - if revoked, time that the revoke occurred
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
 * finfo - reference to the file associated with this delegation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
 * client - reference to client for which this delegation is associated
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
 * delegationlist - list of delegations for the file (WRITE == 1, READ == )
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
 * clientdeleglist - list of delegations for the client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
typedef struct rfs4_deleg_state {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	rfs4_dbe_t		*dbe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
	open_delegation_type4	dtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
	stateid_t		delegid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	time_t			time_granted;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
	time_t			time_recalled;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
	time_t			time_revoked;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	struct rfs4_file	*finfo;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	rfs4_client_t		*client;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
	rfs4_deleg_list_t	delegationlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
	rfs4_deleg_list_t	clientdeleglist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
} rfs4_deleg_state_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
 * Delegation info associated with the file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
 * dtype - type of delegation for file (NONE, READ, WRITE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
 * time_returned - time that last delegation was returned for file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
 * time_recalled - time that recall sequence started
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
 * time_lastgrant - time that last delegation was provided to a client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
 * time_lastwrite - time of last write to use the delegation stateid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
 * time_rm_delayed - time of last remove/rename which was DELAYed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
 * rdgrants - how many read delegations have been provided for this file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
 * wrgrants - how many write delegations provided (can only be one)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
 * recall_count - how many recall threads are outstanding
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
 * recall_lock - lock to protect contents of this struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
 * recall_cv - condition var for the "parent" thread to wait upon
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
 * deleg_change_grant - value for change attribute at time of write grant
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
 * deleg_change - most recent value of change obtained from client
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
 * deleg_change_ts - time of last deleg_change update
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
 * ever_recalled - has this particular delegation ever been recalled?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
 * dont_grant - file deletion is impending, don't grant a delegation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
 * conflicted_client - clientid of the client that caused a CB_RECALL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
 *	to occur. This is used for delegation policy (should a delegation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
 *	be granted shortly after it has been returned?)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
typedef struct rfs4_dinfo {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	open_delegation_type4 dtype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	time_t		time_returned;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
	time_t		time_recalled;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	time_t		time_lastgrant;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
	time_t		time_lastwrite;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	time_t		time_rm_delayed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	uint32_t	rdgrants;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	uint32_t	wrgrants;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	int32_t		recall_count;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	kmutex_t	recall_lock[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
	kcondvar_t	recall_cv[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	bool_t		ever_recalled;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	uint32_t	hold_grant;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
	clientid4	conflicted_client;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
} rfs4_dinfo_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
 * File
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
 * dbe - encapsulation struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
 * vp - vnode for the file that is open or has a delegation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
 * filehandle - the filehandle generated by the server for this file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
 * delegationlist - root of delegation list for this file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
 * dinfo - see struct definition above
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
 * share_deny - union of all deny modes on file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
 * share_access - union of all access modes on file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
 * access_read - count of read access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
 * access_write - count of write access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
 * deny_read - count of deny reads
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
 * deny_write - count of deny writes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
 * file_rwlock - lock for serializing the removal of a file while
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
 *	the state structures are active within the server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
 * 	The only requirement for locking file_rwlock is that the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
 * 	caller have a reference to the containing rfs4_file.  The dbe
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
 * 	lock may or may not be held for lock/unlock of file_rwlock.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
 * 	As mentioned above, the file_rwlock is used for serialization
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
 * 	of file removal and more specifically reference to the held
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
 * 	vnode (e.g. vp).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
typedef struct rfs4_file {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	rfs4_dbe_t	*dbe;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	vnode_t		*vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	nfs_fh4		filehandle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	rfs4_deleg_list_t delegationlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	rfs4_dinfo_t	dinfo[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	uint32_t	share_deny;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
	uint32_t	share_access;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	uint32_t	access_read;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
	uint32_t	access_write;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
	uint32_t	deny_read;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
	uint32_t	deny_write;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
	krwlock_t	file_rwlock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
} rfs4_file_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
extern int	rfs4_servinst_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
extern int	rfs4_seen_first_compound;	/* set first time we see one */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
extern rfs4_servinst_t	*rfs4_cur_servinst;	/* current server instance */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
extern kmutex_t		rfs4_servinst_lock;	/* protects linked list */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
extern void		rfs4_servinst_create(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
extern void		rfs4_servinst_destroy_all(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
extern void		rfs4_servinst_assign(rfs4_client_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
			    rfs4_servinst_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
extern rfs4_servinst_t	*rfs4_servinst(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
extern int		rfs4_clnt_in_grace(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
extern int		rfs4_servinst_in_grace(rfs4_servinst_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
extern int		rfs4_servinst_grace_new(rfs4_servinst_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
extern void		rfs4_grace_start(rfs4_servinst_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
extern void		rfs4_grace_start_new(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
extern void		rfs4_grace_reset_all(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
 * rfs4_deleg_policy is used to signify the server's global delegation
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
 * policy.  The default is to NEVER delegate files and the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
 * administrator must configure the server to enable delegations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
 * The disable/enable delegation functions are used to eliminate a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
 * race with exclusive creates.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
typedef enum {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	SRV_NEVER_DELEGATE = 0,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
	SRV_NORMAL_DELEGATE = 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
} srv_deleg_policy_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
extern srv_deleg_policy_t rfs4_deleg_policy;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
extern kmutex_t rfs4_deleg_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
extern void rfs4_disable_delegation(void), rfs4_enable_delegation(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
 * Request types for delegation. These correspond with
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
 * open_delegation_type4 with the addition of a new value, DELEG_ANY,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
 * to reqequest any delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
typedef enum {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
	DELEG_NONE = 0,		/* Corresponds to OPEN_DELEG_NONE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
	DELEG_READ = 1,		/* Corresponds to OPEN_DELEG_READ */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
	DELEG_WRITE = 2,	/* Corresponds to OPEN_DELEG_WRITE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
	DELEG_ANY = -1		/* New value to request any delegation type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
} delegreq_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
#define	NFS4_DELEG4TYPE2REQTYPE(x) (delegreq_t)(x)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
 * Various interfaces to manipulate the state structures introduced
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
 * above
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
extern	kmutex_t	rfs4_state_lock;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
extern	void		rfs4_clean_state_exi(struct exportinfo *exi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
extern	void		rfs4_free_reply(nfs_resop4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
extern	void		rfs4_copy_reply(nfs_resop4 *, nfs_resop4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
/* rfs4_client_t handling */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
extern	rfs4_client_t	*rfs4_findclient(nfs_client_id4 *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
					bool_t *, rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
extern	rfs4_client_t	*rfs4_findclient_by_id(clientid4, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
extern	void		rfs4_client_rele(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
extern	void		rfs4_client_close(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
extern	void		rfs4_client_state_remove(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
extern	void		rfs4_client_scv_next(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
extern	void		rfs4_update_lease(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
extern	bool_t		rfs4_lease_expired(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
extern	nfsstat4	rfs4_check_clientid(clientid4 *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
/* rfs4_openowner_t handling */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
extern	rfs4_openowner_t *rfs4_findopenowner(open_owner4 *, bool_t *, seqid4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
extern	void		rfs4_update_open_sequence(rfs4_openowner_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
extern	void		rfs4_update_open_resp(rfs4_openowner_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
					nfs_resop4 *, nfs_fh4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
extern	void		rfs4_openowner_rele(rfs4_openowner_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
extern	void		rfs4_free_opens(rfs4_openowner_t *, bool_t, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
/* rfs4_lockowner_t handling */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
extern	rfs4_lockowner_t *rfs4_findlockowner(lock_owner4 *, bool_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
extern	rfs4_lockowner_t *rfs4_findlockowner_by_pid(pid_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
extern	void		rfs4_lockowner_rele(rfs4_lockowner_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
/* rfs4_state_t handling */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
extern	rfs4_state_t	*rfs4_findstate_by_owner_file(rfs4_openowner_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
					rfs4_file_t *, bool_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
extern	void		rfs4_state_rele(rfs4_state_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
extern	void		rfs4_state_close(rfs4_state_t *, bool_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
					bool_t, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
extern	void		rfs4_release_share_lock_state(rfs4_state_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
					cred_t *, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
extern	void		rfs4_close_all_state(rfs4_file_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
/* rfs4_lo_state_t handling */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
extern	rfs4_lo_state_t *rfs4_findlo_state_by_owner(rfs4_lockowner_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
						rfs4_state_t *, bool_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
extern	void		rfs4_lo_state_rele(rfs4_lo_state_t *, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
extern	void		rfs4_update_lock_sequence(rfs4_lo_state_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
extern	void		rfs4_update_lock_resp(rfs4_lo_state_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
					nfs_resop4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
/* rfs4_file_t handling */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
extern	rfs4_file_t	*rfs4_findfile(vnode_t *, nfs_fh4 *, bool_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
extern	rfs4_file_t	*rfs4_findfile_withlock(vnode_t *, nfs_fh4 *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
						bool_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
extern	void		rfs4_file_rele(rfs4_file_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
extern	void		rfs4_file_rele_withunlock(rfs4_file_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
/* General collection of "get state" functions */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
extern	nfsstat4	rfs4_get_state(stateid4 *, rfs4_state_t **,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
					rfs4_dbsearch_type_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
extern	nfsstat4	rfs4_get_deleg_state(stateid4 *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
					rfs4_deleg_state_t **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
extern	nfsstat4	rfs4_get_lo_state(stateid4 *, rfs4_lo_state_t **,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
					bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
extern	nfsstat4	rfs4_check_stateid(int, vnode_t *, stateid4 *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
					bool_t, bool_t *, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
extern	int		rfs4_check_stateid_seqid(rfs4_state_t *, stateid4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
extern	int		rfs4_check_lo_stateid_seqid(rfs4_lo_state_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
					stateid4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
/* return values for rfs4_check_stateid_seqid() */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
#define	NFS4_CHECK_STATEID_OKAY	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
#define	NFS4_CHECK_STATEID_OLD	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
#define	NFS4_CHECK_STATEID_BAD	3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
#define	NFS4_CHECK_STATEID_EXPIRED	4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
#define	NFS4_CHECK_STATEID_REPLAY	5
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
#define	NFS4_CHECK_STATEID_CLOSED	6
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
#define	NFS4_CHECK_STATEID_UNCONFIRMED	7
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
/* delay() time that server is willing to briefly wait for a delegreturn */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
#define	NFS4_DELEGATION_CONFLICT_DELAY	(hz/10)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
 * Interfaces for handling of callback's client handle cache and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
 * callback interfaces themselves.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
extern	void		rfs4_cbinfo_free(rfs4_cbinfo_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
extern	void		rfs4_client_setcb(rfs4_client_t *, cb_client4 *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
					uint32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
extern	void		rfs4_deleg_cb_check(rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
extern	nfsstat4	rfs4_vop_getattr(vnode_t *, vattr_t *, int, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
/* rfs4_deleg_state_t handling and other delegation interfaces */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
extern	rfs4_deleg_state_t *rfs4_finddeleg(rfs4_state_t *, bool_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
extern	rfs4_deleg_state_t *rfs4_finddelegstate(stateid_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
extern	bool_t		rfs4_check_recall(rfs4_state_t *, uint32_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
extern	void		rfs4_recall_deleg(rfs4_file_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
				bool_t, rfs4_client_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
extern	int		rfs4_get_deleg(rfs4_state_t *,  open_delegation_type4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
			open_delegation_type4 (*policy)(rfs4_state_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
				open_delegation_type4 dtype));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
extern	rfs4_deleg_state_t *rfs4_grant_delegation(delegreq_t, rfs4_state_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
				int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
extern	void		rfs4_set_deleg_response(rfs4_deleg_state_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
				open_delegation4 *, nfsace4 *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
extern	void		rfs4_return_deleg(rfs4_deleg_state_t *, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
extern	bool_t		rfs4_is_deleg(rfs4_state_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
extern	void		rfs4_deleg_state_rele(rfs4_deleg_state_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
extern	bool_t		rfs4_check_delegated_byfp(int, rfs4_file_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
					bool_t, bool_t, bool_t, clientid4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
extern	void		rfs4_clear_dont_grant(rfs4_file_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
 * nfs4 monitored operations.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
extern int deleg_rdopen(femarg_t *, int, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
extern int deleg_wropen(femarg_t *, int, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
extern int deleg_rd_rwlock(femarg_t *, int, caller_context_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
extern int deleg_wr_rwlock(femarg_t *, int, caller_context_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
extern int deleg_read(femarg_t *, uio_t *, int, cred_t *, caller_context_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
extern int deleg_write(femarg_t *, uio_t *, int, cred_t *, caller_context_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
extern int deleg_setattr(femarg_t *, vattr_t *, int, cred_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		caller_context_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
extern int deleg_space(femarg_t *, int, flock64_t *, int, offset_t, cred_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
		caller_context_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
extern int deleg_setsecattr(femarg_t *, vsecattr_t *, int, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
extern int deleg_vnevent(femarg_t *, vnevent_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
extern void rfs4_mon_hold(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
extern void rfs4_mon_rele(void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
extern fem_t	*deleg_rdops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
extern fem_t	*deleg_wrops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
extern	void		rfs4_unshare(rfs4_state_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
extern	void		rfs4_set_deleg_policy(srv_deleg_policy_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
#define	NFS4_DEBUG(var, args) if (var) cmn_err args
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
extern int rfs4_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
extern int nfs4_client_attr_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
extern int nfs4_client_state_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
extern int nfs4_client_shadow_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
extern int nfs4_client_lock_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
extern int nfs4_client_lease_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
extern int nfs4_seqid_sync;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
extern int nfs4_client_map_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
extern int nfs4_client_inactive_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
extern int nfs4_client_recov_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
extern int nfs4_client_recov_stub_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
extern int nfs4_client_failover_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
extern int nfs4_client_call_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
extern int nfs4_client_foo_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
extern int nfs4_client_zone_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
extern int nfs4_lost_rqst_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
extern int nfs4_open_stream_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
extern int nfs4_client_open_dg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
extern int nfs4_srvmnt_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
extern int nfs4_utf8_debug;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
void rfs4_dbe_debug(rfs4_dbe_t *e);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
#ifdef NFS4_DEBUG_MUTEX
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
void nfs4_debug_mutex_enter(kmutex_t *, char *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
void nfs4_debug_mutex_exit(kmutex_t *, char *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
#define	mutex_enter(m) nfs4_debug_mutex_enter((m), __FILE__, __LINE__)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
#define	mutex_exit(m) nfs4_debug_mutex_exit((m), __FILE__, __LINE__)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
#endif /* NFS4_DEBUG_MUTEX */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
#else  /* ! DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
#define	NFS4_DEBUG(var, args)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
#endif /* DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
 * XXX - temporary for testing of volatile fh
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
#ifdef VOLATILE_FH_TEST
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
struct nfs_fh4_fmt {
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   946
	fhandle4_t	fh4_i;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
   947
	uint32_t	fh4_flag;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
   948
	uint32_t	fh4_volatile_id;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
#else /* VOLATILE_FH_TEST */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
struct nfs_fh4_fmt {
1610
3436e82414c8 6344186 NFSv3 needs to support .zfs (like NFSv4 already does)
thurlow
parents: 1232
diff changeset
   954
	fhandle4_t	fh4_i;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
   955
	uint32_t	fh4_flag;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
#endif /* VOLATILE_FH_TEST */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
#define	FH4_NAMEDATTR	1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
#define	FH4_ATTRDIR	2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
   963
#define	fh4_fsid	fh4_i.fhx_fsid
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
   964
#define	fh4_len		fh4_i.fhx_len 	/* fid length */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
   965
#define	fh4_data	fh4_i.fhx_data 	/* fid bytes */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
   966
#define	fh4_xlen	fh4_i.fhx_xlen
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
   967
#define	fh4_xdata	fh4_i.fhx_xdata
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
typedef struct nfs_fh4_fmt nfs_fh4_fmt_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
#define	fh4_to_fmt4(fh4p) ((nfs_fh4_fmt_t *)(fh4p)->nfs_fh4_val)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
#define	get_fh4_flag(fh4p, flag) ((fh4_to_fmt4(fh4p)->fh4_flag) & (flag))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
#define	set_fh4_flag(fh4p, flag) ((fh4_to_fmt4(fh4p)->fh4_flag) |= (flag))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
#define	clr_fh4_flag(fh4p, flag) ((fh4_to_fmt4(fh4p)->fh4_flag) &= ~(flag))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
#define	NFS_FH4_LEN	sizeof (nfs_fh4_fmt_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
 * A few definitions of repeatedly used constructs for nfsv4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
#define	UTF8STRING_FREE(str)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
	kmem_free((str).utf8string_val,	(str).utf8string_len);	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
	(str).utf8string_val = NULL;				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
	(str).utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
 * NFS4_VOLATILE_FH yields non-zero if the filesystem uses non-persistent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
 * filehandles.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
#define	NFS4_VOLATILE_FH(mi)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
	((mi)->mi_fh_expire_type &				\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
	(FH4_VOLATILE_ANY | FH4_VOL_MIGRATION | FH4_VOL_RENAME))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
 * NFS_IS_DOTNAME checks if the name given represents a dot or dotdot entry
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
#define	NFS_IS_DOTNAME(name)					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
	(((name)[0] == '.') &&					\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
	(((name)[1] == '\0') || (((name)[1] == '.') && ((name)[2] == '\0'))))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
 * Define the number of bits in a bitmap word (uint32)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
#define	NFS4_BITMAP4_BITSPERWORD	(sizeof (uint32_t) * 8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
 * Define the value for the access field of the compound_state structure
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
 * based on the result of nfsauth access checking.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
#define	CS_ACCESS_OK		0x1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
#define	CS_ACCESS_DENIED	0x2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
#define	CS_ACCESS_LIMITED	0x4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
 * compound state in nfsv4 server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
struct compound_state {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
	struct exportinfo *exi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
	struct exportinfo *saved_exi;	/* export struct for saved_vp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
	cred_t 		*basecr;	/* UNIX cred:  only RPC request */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
	caddr_t 	principal;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
	int 		nfsflavor;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
	cred_t 		*cr;		/* UNIX cred: RPC request and */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
					/* target export */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
	bool_t  	cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
	uint_t 		access;		/* access perm on vp per request */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
	bool_t 		deleg;		/* TRUE if current fh has */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
					/* write delegated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
	vnode_t 	*vp;		/* modified by PUTFH, and by ops that */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
					/* input to GETFH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
	bool_t 		mandlock;	/* Is mandatory locking in effect */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
					/* for vp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
	vnode_t 	*saved_vp;	/* modified by SAVEFH, copied to */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
					/* vp by RESTOREFH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
	nfsstat4 	*statusp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	nfs_fh4 	fh;		/* ditto. valid only if vp != NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
	nfs_fh4 	saved_fh;	/* ditto. valid only if */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
					/* 	saved_vp != NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
	struct svc_req	*req;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
	char 		fhbuf[NFS4_FHSIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
 * Conversion commands for nfsv4 server attr checking
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
enum nfs4_attr_cmd {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
	NFS4ATTR_SUPPORTED = 0,		/* check which attrs supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
	NFS4ATTR_GETIT = 1,		/* getattr - sys to fattr4 (r) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
	NFS4ATTR_SETIT = 2,		/* setattr - fattr4 to sys (w) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
	NFS4ATTR_VERIT = 3,		/* verify - fattr4 to sys (r) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
	NFS4ATTR_FREEIT = 4		/* free any alloc'd space for attr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
typedef enum nfs4_attr_cmd nfs4_attr_cmd_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
struct nfs4_svgetit_arg {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
	nfs4_attr_cmd_t op;		/* getit or setit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
	struct compound_state *cs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
	struct statvfs64 *sbp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
	uint_t 		flag;		/* VOP_GETATTR/VOP_SETATTR flag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
	uint_t 		xattr;		/* object is xattr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
	bool_t 		rdattr_error_req; /* if readdir & client wants */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
						/* rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
	nfsstat4	rdattr_error;	/* used for per-entry status */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
					/* (if rdattr_err) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
	bool_t		mntdfid_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
	fattr4_mounted_on_fileid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
			mounted_on_fileid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
					/* readdir op can always return	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
					/* d_ino from server fs dirent  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
					/* for mounted_on_fileid attr.	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
					/* This field holds d_ino so	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
					/* srv attr conv code can avoid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
					/* doing an untraverse.		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
	vattr_t		vap[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
struct nfs4_ntov_map {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
	bitmap4		fbit; 		/* FATTR4_XXX_MASKY */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	uint_t 		vbit; 		/* AT_XXX */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
	bool_t 		vfsstat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
	bool_t 		mandatory; 	/* attribute mandatory to implement? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	uint_t 		nval;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
	int		xdr_size;	/* Size of XDR'd attr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
	xdrproc_t 	xfunc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
	int (*sv_getit)(nfs4_attr_cmd_t, struct nfs4_svgetit_arg *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
		union nfs4_attr_u *);	/* subroutine for getting attr. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
	char 		*prtstr;	/* string attr for printing */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
struct nfs4attr_to_vattr {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
	vnode_t 	*vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
	vattr_t 	*vap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
	nfs_fh4   	*fhp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
	nfsstat4	rdattr_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
	uint32_t	flag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
	fattr4_change	change;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
	fattr4_fsid	srv_fsid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
	fattr4_mounted_on_fileid	mntd_fid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
typedef struct nfs4attr_to_vattr ntov4_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
 * nfs4attr_to_vattr flags
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
#define	NTOV_FHP_VALID			0x01
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
#define	NTOV_RDATTR_ERROR_VALID		0x02
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
#define	NTOV_CHANGE_VALID		0x04
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
#define	NTOV_SUPP_VALID			0x08
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
#define	NTOV_SRV_FSID_VALID		0x10
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
#define	NTOV_MOUNTED_ON_FILEID_VALID	0x20
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
#define	FATTR4_MANDATTR_MASK (		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	FATTR4_SUPPORTED_ATTRS_MASK |	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
	FATTR4_TYPE_MASK |		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
	FATTR4_FH_EXPIRE_TYPE_MASK |	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
	FATTR4_CHANGE_MASK |		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
	FATTR4_SIZE_MASK |		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
	FATTR4_LINK_SUPPORT_MASK |	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
	FATTR4_SYMLINK_SUPPORT_MASK |	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
	FATTR4_NAMED_ATTR_MASK |	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
	FATTR4_FSID_MASK |		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
	FATTR4_UNIQUE_HANDLES_MASK |	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
	FATTR4_LEASE_TIME_MASK |	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
	FATTR4_RDATTR_ERROR_MASK |	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	FATTR4_FILEHANDLE_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
struct nfs4attr_to_osattr {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
	void *attrconv_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
	uint_t mask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
struct mntinfo4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
 * lkp4_attr_setup lists the different options for attributes when calling
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
 * nfs4lookup_setup - either no attributes (just lookups - e.g., secinfo),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
 * one component only (normal component lookup), get attributes for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
 * last component (e.g., mount), attributes for each component (e.g.,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
 * failovers later), just the filehandle for the last component (e.g.,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
 * volatile filehandle recovery), or stuff that needs OPENATTR (e.g.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
 * looking up a named attribute or it's hidden directory).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
enum lkp4_attr_setup {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
	LKP4_NO_ATTRIBUTES = 0,		/* no attrs or filehandles */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
	LKP4_ALL_ATTRIBUTES = 3,	/* multi-comp: attrs for all comps */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
	LKP4_LAST_NAMED_ATTR = 5,	/* multi-comp: named attr & attrdir */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
	LKP4_LAST_ATTRDIR = 6,		/* multi-comp: just attrdir */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
	LKP4_ALL_ATTR_SECINFO = 7	/* multi-comp: attrs for all comp and */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
					/*	secinfo for last comp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
 * lookup4_param a set of parameters to nfs4lookup_setup -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
 * used to setup a path lookup compound request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
typedef struct lookup4_param {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
	enum lkp4_attr_setup l4_getattrs; /* (in) get attrs in the lookup? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
	int 		header_len;	/* (in) num ops before first lookup  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
	int 		trailer_len;	/* (in) num ops after last	*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
					/*	Lookup/Getattr		*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	bitmap4 	ga_bits;	/* (in) Which attributes for Getattr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
	COMPOUND4args_clnt *argsp;	/* (in/out) args for compound struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
	COMPOUND4res_clnt  *resp;	/* (in/out) res for compound  struct */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
	int 		arglen;		/* (out) argop buffer alloc'd length */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
	struct mntinfo4 *mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
} lookup4_param_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
#define	NFS4_FATTR4_FINISH	-1	/* fattr4 index indicating finish */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
typedef int (*nfs4attr_to_os_t)(int, union nfs4_attr_u *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
		struct nfs4attr_to_osattr *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
 * The nfs4_error_t is the basic structure to return error values
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
 * from rfs4call.  It encapsulates the unix errno
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
 * value, the nfsstat4 value and the rpc status value into a single
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
 * structure.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
 * If error is set, then stat is ignored and rpc_status may be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
 * set if the error occurred as the result of a CLNT_CALL.  If
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
 * stat is set, then rpc request succeeded, error and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
 * rpc_status are set to 0 and stat contains the result of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
 * operation, NFS4_OK or one of the NFS4ERR_* values.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
 * Functions which want to generate errors independently from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
 * rfs4call should set error to the desired errno value and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
 * set stat and rpc_status to 0.  nfs4_error_init() is a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
 * convenient function to do this.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
typedef struct {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
	int		error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
	nfsstat4	stat;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
	enum clnt_stat	rpc_status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
} nfs4_error_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
 * Shared functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
extern void	rfs4_op_readdir(nfs_argop4 *, nfs_resop4 *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
			struct svc_req *, struct compound_state *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
extern void	nfs_fh4_copy(nfs_fh4 *, nfs_fh4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
extern void	nfs4_fattr4_free(fattr4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
extern int	nfs4lookup_setup(char *, lookup4_param_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
extern void	nfs4_getattr_otw_norecovery(vnode_t *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
			nfs4_ga_res_t *, nfs4_error_t *, cred_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
extern int	nfs4_getattr_otw(vnode_t *, nfs4_ga_res_t *, cred_t *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
extern int	nfs4cmpfh(const nfs_fh4 *, const nfs_fh4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
extern int	nfs4cmpfhandle(nfs4_fhandle_t *, nfs4_fhandle_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
extern int	nfs4getattr(vnode_t *, struct vattr *, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
extern int	nfs4_waitfor_purge_complete(vnode_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
extern int	nfs4_validate_caches(vnode_t *, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
extern int	nfs4init(int, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
extern void	nfs4fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
extern int	nfs4_vfsinit(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
extern void	nfs4_vfsfini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
extern void	nfs4_vnops_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
extern void	nfs4_vnops_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
extern void	nfs_idmap_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
extern void	nfs_idmap_flush(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
extern void	nfs_idmap_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
extern int	nfs4_rnode_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
extern int	nfs4_rnode_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
extern int	nfs4_shadow_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
extern int	nfs4_shadow_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
extern int	nfs4_acache_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
extern int	nfs4_acache_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
extern int	nfs4_subr_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
extern int	nfs4_subr_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
extern void	nfs4_acl_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
extern void	nfs4_acl_free_cache(vsecattr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
extern int	geterrno4(nfsstat4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
extern nfsstat4	puterrno4(int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
extern int	nfs4_need_to_bump_seqid(COMPOUND4res_clnt *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
extern int	nfs4tsize(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
extern int	checkauth4(struct compound_state *, struct svc_req *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
extern nfsstat4 call_checkauth4(struct compound_state *, struct svc_req *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
extern int	is_exported_sec(int, struct exportinfo *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
extern void	nfs4_vmask_to_nmask(uint_t, bitmap4 *);
602
4ef537c7acd0 6284687 SETATTR(size) with special stateid=0 does not have bitmask set
jasmith
parents: 92
diff changeset
  1248
extern void	nfs4_vmask_to_nmask_set(uint_t, bitmap4 *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
extern int	nfs_idmap_str_uid(utf8string *u8s, uid_t *, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
extern int	nfs_idmap_str_gid(utf8string *u8s, gid_t *, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
extern int	nfs_idmap_uid_str(uid_t, utf8string *u8s, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
extern int	nfs_idmap_gid_str(gid_t gid, utf8string *u8s, bool_t);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
extern int	nfs4_time_ntov(nfstime4 *, timestruc_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
extern int	nfs4_time_vton(timestruc_t *, nfstime4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
extern char	*utf8_to_str(utf8string *, uint_t *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
extern char	*utf8_to_fn(utf8string *, uint_t *, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
extern utf8string *str_to_utf8(char *, utf8string *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
extern utf8string *utf8_copy(utf8string *, utf8string *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
extern int	utf8_compare(const utf8string *, const utf8string *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
extern int	utf8_dir_verify(utf8string *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
extern char	*utf8_strchr(utf8string *, const char);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
extern int	ln_ace4_cmp(nfsace4 *, nfsace4 *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
extern int	vs_aent_to_ace4(vsecattr_t *, vsecattr_t *, int, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
extern int	vs_ace4_to_aent(vsecattr_t *, vsecattr_t *, uid_t, gid_t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
    int, int, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
extern int	vs_ace4_to_acet(vsecattr_t *, vsecattr_t *, uid_t, gid_t,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 602
diff changeset
  1267
    int, int);
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 602
diff changeset
  1268
extern int	vs_acet_to_ace4(vsecattr_t *, vsecattr_t *, int);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
extern void	vs_acet_destroy(vsecattr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
extern void	vs_ace4_destroy(vsecattr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
extern void	vs_aent_destroy(vsecattr_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
extern int	stateid4_cmp(stateid4 *, stateid4 *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
extern vtype_t	nf4_to_vt[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
extern struct nfs4_ntov_map nfs4_ntov_map[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
extern uint_t nfs4_ntov_map_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
extern kstat_named_t	*rfsproccnt_v4_ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
extern struct vfsops	*nfs4_vfsops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
extern struct vnodeops	*nfs4_vnodeops;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
extern const struct	fs_operation_def nfs4_vnodeops_template[];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
extern uint_t nfs4_tsize(struct knetconfig *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
extern uint_t rfs4_tsize(struct svc_req *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1288
extern bool_t	xdr_inline_decode_nfs_fh4(uint32_t *, nfs_fh4_fmt_t *,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 806
diff changeset
  1289
			uint32_t);
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
  1290
extern bool_t	xdr_inline_encode_nfs_fh4(uint32_t **, uint32_t *,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
  1291
			nfs_fh4_fmt_t *);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 789
diff changeset
  1292
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
extern int		rfs4_do_pre_op_attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
extern int		rfs4_do_post_op_attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
extern stateid4 clnt_special0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
extern stateid4 clnt_special1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
#define	CLNT_ISSPECIAL(id) (stateid4_cmp(id, &clnt_special0) || \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
				stateid4_cmp(id, &clnt_special1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
 * The NFS Version 4 service procedures.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
extern void	rfs4_compound(COMPOUND4args *, COMPOUND4res *,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
			struct exportinfo *, struct svc_req *, cred_t *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
extern void	rfs4_compound_free(COMPOUND4res *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
extern void	rfs4_compound_flagproc(COMPOUND4args *, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
extern int	rfs4_srvrinit(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
extern void	rfs4_srvrfini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
extern void	rfs4_state_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
extern void	rfs4_state_fini(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
#ifdef	__cplusplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
#endif /* _NFS4_H */