usr/src/uts/common/fs/nfs/nfs4_xdr.c
author robinson
Tue, 10 Jan 2006 08:52:24 -0800
changeset 1232 1a9b1651d839
parent 967 cf6233442405
child 1610 3436e82414c8
permissions -rw-r--r--
4799697 nfs messages could be more useful 6354997 File changes on NFSv4 servers take a long time to be detected 6355634 Client handling of CB_GETATTR fails to set bitmap
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
    23
 *	Copyright 2006 Sun Microsystems, Inc.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 *	All rights reserved.  Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 * A handcoded version based on the original rpcgen code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 * Note: All future NFS4 protocol changes should be added by hand
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * to this file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 * CAUTION: All protocol changes must also be propagated to:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 *     usr/src/cmd/cmd-inet/usr.sbin/snoop/nfs4_xdr.c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#include <sys/sunddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
#include <sys/dnlc.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#include <nfs/nfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#include <nfs/nfs4_kprot.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#include <nfs/rnode4.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <nfs/nfs4.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <nfs/nfs4_clnt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/sdt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <rpc/rpc_rdma.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
xdr_bitmap4(XDR *xdrs, bitmap4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
	int32_t len, size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
	 * Simplified bitmap4 processing, always encode from uint64_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
	 * to 2 uint32_t's, always decode first 2 uint32_t's into a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
	 * uint64_t and ignore all of the rest.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
	if (xdrs->x_op == XDR_ENCODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
		len = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
		if (!XDR_PUTINT32(xdrs, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
#if defined(_LITTLE_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
		if (XDR_PUTINT32(xdrs, (int32_t *)((char *)objp +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
						BYTES_PER_XDR_UNIT)) == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
			return (XDR_PUTINT32(xdrs, (int32_t *)objp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
#elif defined(_BIG_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
		if (XDR_PUTINT32(xdrs, (int32_t *)objp) == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
			return (XDR_PUTINT32(xdrs, (int32_t *)((char *)objp +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
						BYTES_PER_XDR_UNIT)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
	if (!XDR_GETINT32(xdrs, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
	 * Common fast DECODE cases
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
	if (len == 2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
#if defined(_LITTLE_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
		if (XDR_GETINT32(xdrs, (int32_t *)((char *)objp +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
					BYTES_PER_XDR_UNIT)) == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
			return (XDR_GETINT32(xdrs, (int32_t *)objp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
#elif defined(_BIG_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
		if (XDR_GETINT32(xdrs, (int32_t *)objp) == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
			return (XDR_GETINT32(xdrs, (int32_t *)((char *)objp +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
					BYTES_PER_XDR_UNIT)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
	*objp = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
	if (len == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	 * The not so common DECODE cases, len == 1 || len > 2
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
#if defined(_LITTLE_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	if (!XDR_GETINT32(xdrs, (int32_t *)((char *)objp + BYTES_PER_XDR_UNIT)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
	if (--len == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
	if (!XDR_GETINT32(xdrs, (int32_t *)objp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
#elif defined(_BIG_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
	if (!XDR_GETINT32(xdrs, (int32_t *)objp))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
	if (--len == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
	if (!XDR_GETINT32(xdrs, (int32_t *)((char *)objp + BYTES_PER_XDR_UNIT)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	if (--len == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	size = len * BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	return (XDR_CONTROL(xdrs, XDR_SKIPBYTES, &size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
/* Called by xdr_array, nfsid_map_xdr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
xdr_utf8string(XDR *xdrs, utf8string *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	if (xdrs->x_op != XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		return (xdr_bytes(xdrs, (char **)&objp->utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
			(uint_t *)&objp->utf8string_len, NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	if (objp->utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
		kmem_free(objp->utf8string_val, objp->utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
		objp->utf8string_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
/*
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   152
 * XDR_INLINE decode a filehandle.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   153
 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   154
bool_t
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   155
xdr_inline_decode_nfs_fh4(uint32_t *ptr, nfs_fh4_fmt_t *fhp, uint32_t fhsize)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   156
{
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   157
	uchar_t *bp = (uchar_t *)ptr;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   158
	uchar_t *cp;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   159
	uint32_t dsize;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   160
	uintptr_t resid;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   161
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   162
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   163
	 * Check to see if what the client sent us is bigger or smaller
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   164
	 * than what we can ever possibly send out. NFS_FHMAXDATA is
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   165
	 * unfortunately badly named as it is no longer the max and is
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   166
	 * really the min of what is sent over the wire.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   167
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   168
	if (fhsize > sizeof (nfs_fh4_fmt_t) || fhsize < (sizeof (fsid_t) +
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   169
	    sizeof (ushort_t) + NFS_FHMAXDATA +
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   170
	    sizeof (ushort_t) + NFS_FHMAXDATA)) {
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   171
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   172
	}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   173
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   174
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   175
	 * All internal parts of a filehandle are in native byte order.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   176
	 *
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   177
	 * Decode what should be fh4_fsid, it is aligned.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   178
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   179
	fhp->fh4_fsid.val[0] = *(uint32_t *)bp;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   180
	bp += BYTES_PER_XDR_UNIT;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   181
	fhp->fh4_fsid.val[1] = *(uint32_t *)bp;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   182
	bp += BYTES_PER_XDR_UNIT;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   183
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   184
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   185
	 * Decode what should be fh4_len.  fh4_len is two bytes, so we're
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   186
	 * unaligned now.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   187
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   188
	cp = (uchar_t *)&fhp->fh4_len;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   189
	*cp++ = *bp++;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   190
	*cp++ = *bp++;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   191
	fhsize -= 2 * BYTES_PER_XDR_UNIT + sizeof (ushort_t);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   192
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   193
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   194
	 * For backwards compatability, the fid length may be less than
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   195
	 * NFS_FHMAXDATA, but it was always encoded as NFS_FHMAXDATA bytes.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   196
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   197
	dsize = fhp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_len;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   198
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   199
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   200
	 * Make sure the client isn't sending us a bogus length for fh4_data.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   201
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   202
	if (fhsize < dsize)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   203
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   204
	bcopy(bp, fhp->fh4_data, dsize);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   205
	bp += dsize;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   206
	fhsize -= dsize;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   207
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   208
	if (fhsize < sizeof (ushort_t))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   209
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   210
	cp = (uchar_t *)&fhp->fh4_xlen;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   211
	*cp++ = *bp++;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   212
	*cp++ = *bp++;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   213
	fhsize -= sizeof (ushort_t);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   214
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   215
	dsize = fhp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_xlen;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   216
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   217
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   218
	 * Make sure the client isn't sending us a bogus length for fh4_xdata.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   219
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   220
	if (fhsize < dsize)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   221
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   222
	bcopy(bp, fhp->fh4_xdata, dsize);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   223
	fhsize -= dsize;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   224
	bp += dsize;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   225
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   226
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   227
	 * We realign things on purpose, so skip any padding
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   228
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   229
	resid = (uintptr_t)bp % BYTES_PER_XDR_UNIT;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   230
	if (resid != 0) {
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   231
		if (fhsize < (BYTES_PER_XDR_UNIT - resid))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   232
			return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   233
		bp += BYTES_PER_XDR_UNIT - resid;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   234
		fhsize -= BYTES_PER_XDR_UNIT - resid;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   235
	}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   236
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   237
	if (fhsize < BYTES_PER_XDR_UNIT)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   238
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   239
	fhp->fh4_flag = *(uint32_t *)bp;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   240
	bp += BYTES_PER_XDR_UNIT;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   241
	fhsize -= BYTES_PER_XDR_UNIT;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   242
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   243
#ifdef VOLATILE_FH_TEST
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   244
	if (fhsize < BYTES_PER_XDR_UNIT)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   245
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   246
	fhp->fh4_volatile_id = *(uint32_t *)bp;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   247
	bp += BYTES_PER_XDR_UNIT;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   248
	fhsize -= BYTES_PER_XDR_UNIT;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   249
#endif
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   250
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   251
	 * Make sure client didn't send extra bytes
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   252
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   253
	if (fhsize != 0)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   254
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   255
	return (TRUE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   256
}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   257
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   258
static bool_t
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   259
xdr_decode_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   260
{
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   261
	uint32_t fhsize;		/* filehandle size */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   262
	uint32_t bufsize;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   263
	rpc_inline_t *ptr;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   264
	uchar_t *buf, *bp;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   265
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   266
	ASSERT(xdrs->x_op == XDR_DECODE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   267
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   268
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   269
	 * Retrieve the filehandle length.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   270
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   271
	if (!XDR_GETINT32(xdrs, (int32_t *)&fhsize))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   272
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   273
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   274
	objp->nfs_fh4_val = NULL;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   275
	objp->nfs_fh4_len = 0;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   276
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   277
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   278
	 * Check to see if what the client sent us is bigger or smaller
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   279
	 * than what we can ever possibly send out. NFS_FHMAXDATA is
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   280
	 * unfortunately badly named as it is no longer the max and is
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   281
	 * really the min of what is sent over the wire.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   282
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   283
	if (fhsize > sizeof (nfs_fh4_fmt_t) || fhsize < (sizeof (fsid_t) +
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   284
	    sizeof (ushort_t) + NFS_FHMAXDATA +
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   285
	    sizeof (ushort_t) + NFS_FHMAXDATA)) {
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   286
		if (!XDR_CONTROL(xdrs, XDR_SKIPBYTES, &fhsize))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   287
			return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   288
		return (TRUE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   289
	}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   290
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   291
	/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   292
	 * bring in fhsize plus any padding
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   293
	 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   294
	bufsize = RNDUP(fhsize);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   295
	ptr = XDR_INLINE(xdrs, bufsize);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   296
	bp = (uchar_t *)ptr;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   297
	if (ptr == NULL) {
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   298
		bp = buf = kmem_alloc(bufsize, KM_SLEEP);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   299
		if (!xdr_opaque(xdrs, (char *)bp, bufsize))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   300
			return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   301
	}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   302
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   303
	objp->nfs_fh4_val = kmem_zalloc(sizeof (nfs_fh4_fmt_t), KM_SLEEP);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   304
	objp->nfs_fh4_len = sizeof (nfs_fh4_fmt_t);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   305
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   306
	if (xdr_inline_decode_nfs_fh4((uint32_t *)bp,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   307
	    (nfs_fh4_fmt_t *)objp->nfs_fh4_val, fhsize) == FALSE) {
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   308
		/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   309
		 * If in the process of decoding we find the file handle
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   310
		 * is not correctly formed, we need to continue decoding
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   311
		 * and trigger an NFS layer error. Set the nfs_fh4_len to
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   312
		 * zero so it gets caught as a bad length.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   313
		 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   314
		kmem_free(objp->nfs_fh4_val, objp->nfs_fh4_len);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   315
		objp->nfs_fh4_val = NULL;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   316
		objp->nfs_fh4_len = 0;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   317
	}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   318
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   319
	if (ptr == NULL)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   320
		kmem_free(buf, bufsize);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   321
	return (TRUE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   322
}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   323
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   324
/*
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   325
 * XDR_INLINE encode a filehandle.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   326
 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   327
bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   328
xdr_inline_encode_nfs_fh4(uint32_t **ptrp, uint32_t *ptr_redzone,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   329
	nfs_fh4_fmt_t *fhp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   330
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   331
	uint32_t *ptr = *ptrp;
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   332
	uchar_t *cp;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   333
	uint_t otw_len, fsize, xsize;   /* otw, file, and export sizes */
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   334
	uint32_t padword;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   335
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   336
	fsize = fhp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_len;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   337
	xsize = fhp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_xlen;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   338
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   339
	/*
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   340
	 * First get the initial and variable sized part of the filehandle.
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   341
	 */
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   342
	otw_len = sizeof (fhp->fh4_fsid) +
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   343
	    sizeof (fhp->fh4_len) + fsize +
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   344
	    sizeof (fhp->fh4_xlen) + xsize;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   345
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   346
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   347
	 * Round out to a full word.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   348
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   349
	otw_len = RNDUP(otw_len);
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   350
	padword = (otw_len / BYTES_PER_XDR_UNIT);	/* includes fhlen */
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   351
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   352
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   353
	 * Add in the fixed sized pieces.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   354
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   355
	otw_len += sizeof (fhp->fh4_flag);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   356
#ifdef VOLATILE_FH_TEST
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   357
	otw_len += sizeof (fhp->fh4_volatile_id);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   358
#endif
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   359
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   360
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   361
	 * Make sure we don't exceed our buffer.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   362
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   363
	if ((ptr + (otw_len / BYTES_PER_XDR_UNIT) + 1) > ptr_redzone)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   364
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   365
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   366
	IXDR_PUT_U_INT32(ptr, otw_len);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   367
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   368
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   369
	 * Zero out the pading.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   370
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   371
	ptr[padword] = 0;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   372
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   373
	/*
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   374
	 * The rest of the filehandle is in native byteorder
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   375
	 */
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   376
	/* fh4_fsid */
836
dfdf8a665ca9 6345690 nfsv4-test panics: assertion failed: ((((nfs_fh4_fmt_t *)(&cs->fh)->nfs_fh4_val)->fh4_flag) & (2))
ek110237
parents: 806
diff changeset
   377
	*ptr++ = (uint32_t)fhp->fh4_fsid.val[0];
dfdf8a665ca9 6345690 nfsv4-test panics: assertion failed: ((((nfs_fh4_fmt_t *)(&cs->fh)->nfs_fh4_val)->fh4_flag) & (2))
ek110237
parents: 806
diff changeset
   378
	*ptr++ = (uint32_t)fhp->fh4_fsid.val[1];
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   379
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   380
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   381
	 * Since the next pieces are unaligned, we need to
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   382
	 * do bytewise copies.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   383
	 */
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   384
	cp = (uchar_t *)ptr;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   385
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   386
	/* fh4_len + fh4_data */
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   387
	bcopy(&fhp->fh4_len, cp, sizeof (fhp->fh4_len) + fsize);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   388
	cp += sizeof (fhp->fh4_len) + fsize;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   389
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   390
	/* fh4_xlen + fh4_xdata */
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   391
	bcopy(&fhp->fh4_xlen, cp, sizeof (fhp->fh4_xlen) + xsize);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   392
	cp += sizeof (fhp->fh4_xlen) + xsize;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   393
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   394
	/* do necessary rounding/padding */
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   395
	cp = (uchar_t *)RNDUP((uintptr_t)cp);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   396
	ptr = (uint32_t *)cp;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   397
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   398
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   399
	 * With the above padding, we're word aligned again.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   400
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   401
	ASSERT(((uintptr_t)ptr % BYTES_PER_XDR_UNIT) == 0);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   402
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   403
	/* fh4_flag */
836
dfdf8a665ca9 6345690 nfsv4-test panics: assertion failed: ((((nfs_fh4_fmt_t *)(&cs->fh)->nfs_fh4_val)->fh4_flag) & (2))
ek110237
parents: 806
diff changeset
   404
	*ptr++ = (uint32_t)fhp->fh4_flag;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   405
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   406
#ifdef VOLATILE_FH_TEST
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   407
	/* fh4_volatile_id */
836
dfdf8a665ca9 6345690 nfsv4-test panics: assertion failed: ((((nfs_fh4_fmt_t *)(&cs->fh)->nfs_fh4_val)->fh4_flag) & (2))
ek110237
parents: 806
diff changeset
   408
	*ptr++ = (uint32_t)fhp->fh4_volatile_id;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   409
#endif
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   410
	*ptrp = ptr;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   411
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   412
	return (TRUE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   413
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   414
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   415
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   416
xdr_encode_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   417
{
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   418
	uint_t otw_len, fsize, xsize;   /* otw, file, and export sizes */
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   419
	bool_t ret;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   420
	rpc_inline_t *ptr;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   421
	rpc_inline_t *buf = NULL;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   422
	uint32_t *ptr_redzone;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   423
	nfs_fh4_fmt_t *fhp;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   424
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   425
	ASSERT(xdrs->x_op == XDR_ENCODE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   426
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   427
	fhp = (nfs_fh4_fmt_t *)objp->nfs_fh4_val;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   428
	fsize = fhp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_len;
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   429
	xsize = fhp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_xlen;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   430
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   431
	/*
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   432
	 * First get the over the wire size, it is the 4 bytes
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   433
	 * for the length, plus the combined size of the
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   434
	 * file handle components.
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   435
	 */
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   436
	otw_len = BYTES_PER_XDR_UNIT + sizeof (fhp->fh4_fsid) +
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   437
	    sizeof (fhp->fh4_len) + fsize +
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   438
	    sizeof (fhp->fh4_xlen) + xsize +
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   439
	    sizeof (fhp->fh4_flag);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   440
#ifdef VOLATILE_FH_TEST
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   441
	otw_len += sizeof (fhp->fh4_volatile_id);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   442
#endif
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   443
	/*
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   444
	 * Round out to a full word.
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   445
	 */
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   446
	otw_len = RNDUP(otw_len);
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   447
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   448
	/*
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   449
	 * Next try to inline the XDR stream, if that fails (rare)
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   450
	 * allocate a buffer to encode the file handle and then
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   451
	 * copy it using xdr_opaque and free the buffer.
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   452
	 */
967
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   453
	ptr = XDR_INLINE(xdrs, otw_len);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   454
	if (ptr == NULL)
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   455
		ptr = buf = kmem_alloc(otw_len, KM_SLEEP);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   456
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   457
	ptr_redzone = (uint32_t *)(ptr + (otw_len / BYTES_PER_XDR_UNIT));
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   458
	ret = xdr_inline_encode_nfs_fh4((uint32_t **)&ptr, ptr_redzone, fhp);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   459
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   460
	if (buf != NULL) {
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   461
		if (ret == TRUE)
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   462
			ret = xdr_opaque(xdrs, (char *)buf, otw_len);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   463
		kmem_free(buf, otw_len);
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   464
	}
cf6233442405 6351165 Off by one word in xdr_decode_nfs_fh4
robinson
parents: 836
diff changeset
   465
	return (ret);
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   466
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   467
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   468
/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   469
 * XDR a NFSv4 filehandle.
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   470
 * Encoding interprets the contents (server).
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   471
 * Decoding the contents are opaque (client).
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
xdr_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
{
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   476
	switch (xdrs->x_op) {
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   477
	case XDR_ENCODE:
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   478
		return (xdr_encode_nfs_fh4(xdrs, objp));
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   479
	case XDR_DECODE:
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   480
		return (xdr_bytes(xdrs, (char **)&objp->nfs_fh4_val,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   481
		    (uint_t *)&objp->nfs_fh4_len, NFS4_FHSIZE));
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   482
	case XDR_FREE:
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   483
		if (objp->nfs_fh4_val != NULL) {
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   484
			kmem_free(objp->nfs_fh4_val, objp->nfs_fh4_len);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   485
			objp->nfs_fh4_val = NULL;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   486
		}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   487
		return (TRUE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	}
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
   489
	return (FALSE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
/* Called by xdr_array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
xdr_fs_location4(XDR *xdrs, fs_location4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
	if (!xdr_array(xdrs, (char **)&objp->server_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
			(uint_t *)&objp->server_len, NFS4_FS_LOCATIONS_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
			sizeof (utf8string), (xdrproc_t)xdr_utf8string))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	return (xdr_array(xdrs, (char **)&objp->rootpath.pathname4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
			(uint_t *)&objp->rootpath.pathname4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
			NFS4_MAX_PATHNAME4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
			sizeof (utf8string), (xdrproc_t)xdr_utf8string));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
/* Called by xdr_array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
xdr_nfsace4(XDR *xdrs, nfsace4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		if (!xdr_u_int(xdrs, &objp->type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
		if (!xdr_u_int(xdrs, &objp->flag))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
		if (!xdr_u_int(xdrs, &objp->access_mask))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
		if (xdrs->x_op == XDR_DECODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
			objp->who.utf8string_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
			objp->who.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
		return (xdr_bytes(xdrs, (char **)&objp->who.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
			(uint_t *)&objp->who.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
			NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
	if (objp->who.utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
		kmem_free(objp->who.utf8string_val, objp->who.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		objp->who.utf8string_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
 * These functions are called out of nfs4_attr.c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
xdr_fattr4_fsid(XDR *xdrs, fattr4_fsid *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->major))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	return (xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->minor));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
xdr_fattr4_acl(XDR *xdrs, fattr4_acl *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	return (xdr_array(xdrs, (char **)&objp->fattr4_acl_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
			(uint_t *)&objp->fattr4_acl_len, NFS4_ACL_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
			sizeof (nfsace4), (xdrproc_t)xdr_nfsace4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
xdr_fattr4_fs_locations(XDR *xdrs, fattr4_fs_locations *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
	if (!xdr_array(xdrs, (char **)&objp->fs_root.pathname4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
			(uint_t *)&objp->fs_root.pathname4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
			NFS4_MAX_PATHNAME4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
			sizeof (utf8string), (xdrproc_t)xdr_utf8string))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
	return (xdr_array(xdrs, (char **)&objp->locations_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
			(uint_t *)&objp->locations_len, NFS4_FS_LOCATIONS_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
			sizeof (fs_location4), (xdrproc_t)xdr_fs_location4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
xdr_fattr4_rawdev(XDR *xdrs, fattr4_rawdev *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
	if (!xdr_u_int(xdrs, &objp->specdata1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
	return (xdr_u_int(xdrs, &objp->specdata2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
xdr_nfstime4(XDR *xdrs, nfstime4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
	if (!xdr_longlong_t(xdrs, (longlong_t *)&objp->seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	return (xdr_u_int(xdrs, &objp->nseconds));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
 * structured used for calls into xdr_ga_fattr_res() as a means
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
 * to do an immediate/short-term cache of owner/group strings
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
 * for callers like the readdir processing.  In the case of readdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
 * it is likely that the directory objects will be owned by the same
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
 * owner/group and if so there is no need to call into the uid/gid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
 * mapping code.  While the uid/gid interfaces have their own cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
 * having one here will reduct pathlength further.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
#define	MAX_OG_NAME 100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
typedef struct ug_cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
	uid_t	uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	gid_t	gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
	utf8string u_curr, u_last;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	utf8string g_curr, g_last;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	char	u_buf1[MAX_OG_NAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	char	u_buf2[MAX_OG_NAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	char	g_buf1[MAX_OG_NAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	char	g_buf2[MAX_OG_NAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
} ug_cache_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
#define	U_SWAP_CURR_LAST(ug) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	(ug)->u_last.utf8string_len = (ug)->u_curr.utf8string_len;	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	if ((ug)->u_last.utf8string_val == (ug)->u_buf1) {		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
		(ug)->u_last.utf8string_val = (ug)->u_buf2;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
		(ug)->u_curr.utf8string_val = (ug)->u_buf1;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
	} else {							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
		(ug)->u_last.utf8string_val = (ug)->u_buf1;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
		(ug)->u_curr.utf8string_val = (ug)->u_buf2;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
#define	G_SWAP_CURR_LAST(ug) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
	(ug)->g_last.utf8string_len = (ug)->g_curr.utf8string_len;	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
	if ((ug)->g_last.utf8string_val == (ug)->g_buf1) {		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
		(ug)->g_last.utf8string_val = (ug)->g_buf2;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
		(ug)->g_curr.utf8string_val = (ug)->g_buf1;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
	} else {							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
		(ug)->g_last.utf8string_val = (ug)->g_buf1;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		(ug)->g_curr.utf8string_val = (ug)->g_buf2;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
static ug_cache_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
alloc_ugcache()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
	ug_cache_t *pug = kmem_alloc(sizeof (ug_cache_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	pug->uid = pug->gid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	pug->u_curr.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	pug->u_last.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
	pug->g_curr.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
	pug->g_last.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
	pug->u_curr.utf8string_val = pug->u_buf1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	pug->u_last.utf8string_val = pug->u_buf2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
	pug->g_curr.utf8string_val = pug->g_buf1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	pug->g_last.utf8string_val = pug->g_buf2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	return (pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
xdr_ga_prefill_vattr(struct nfs4_ga_res *garp, struct mntinfo4 *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	static vattr_t s_vattr = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
		AT_ALL,		/* va_mask */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
		VNON,		/* va_type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
		0777,		/* va_mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
		UID_NOBODY,	/* va_uid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
		GID_NOBODY,	/* va_gid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
		0,		/* va_fsid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
		0,		/* va_nodeid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
		1,		/* va_nlink */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
		0,		/* va_size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
		{0, 0},		/* va_atime */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
		{0, 0},		/* va_mtime */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
		{0, 0},		/* va_ctime */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
		0,		/* va_rdev */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
		MAXBSIZE,	/* va_blksize */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
		0,		/* va_nblocks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
		0		/* va_seq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	garp->n4g_va = s_vattr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	garp->n4g_va.va_fsid = mi->mi_vfsp->vfs_dev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
	hrt2ts(gethrtime(), &garp->n4g_va.va_atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	garp->n4g_va.va_mtime = garp->n4g_va.va_ctime = garp->n4g_va.va_atime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
xdr_ga_prefill_statvfs(struct nfs4_ga_ext_res *gesp, struct mntinfo4 *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	static statvfs64_t s_sb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
		MAXBSIZE,	/* f_bsize */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
		DEV_BSIZE,	/* f_frsize */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
		(fsfilcnt64_t)-1, /* f_blocks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
		(fsfilcnt64_t)-1, /* f_bfree */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
		(fsfilcnt64_t)-1, /* f_bavail */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		(fsfilcnt64_t)-1, /* f_files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
		(fsfilcnt64_t)-1, /* f_ffree */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
		(fsfilcnt64_t)-1, /* f_favail */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
		0,		/* f_fsid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
		"\0",		/* f_basetype */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
		0,		/* f_flag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
		MAXNAMELEN,	/* f_namemax */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
		"\0",		/* f_fstr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	gesp->n4g_sb = s_sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
	gesp->n4g_sb.f_fsid = mi->mi_vfsp->vfs_fsid.val[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
xdr_ga_fattr_res(XDR *xdrs, struct nfs4_ga_res *garp, bitmap4 resbmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
		bitmap4 argbmap, struct mntinfo4 *mi, ug_cache_t *pug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
	int truefalse;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
	struct nfs4_ga_ext_res ges, *gesp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
	vattr_t *vap = &garp->n4g_va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
	vsecattr_t *vsap = &garp->n4g_vsa;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
	ASSERT(xdrs->x_op == XDR_DECODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
	if (garp->n4g_ext_res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
		gesp = garp->n4g_ext_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
		gesp = &ges;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
	vap->va_mask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
	/* Check to see if the vattr should be pre-filled */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
	if (argbmap & NFS4_VATTR_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
		xdr_ga_prefill_vattr(garp, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	if (argbmap & NFS4_STATFS_ATTR_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
		xdr_ga_prefill_statvfs(gesp, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
	    (FATTR4_SUPPORTED_ATTRS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
	    FATTR4_TYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
	    FATTR4_FH_EXPIRE_TYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
	    FATTR4_CHANGE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	    FATTR4_SIZE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
	    FATTR4_LINK_SUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
	    FATTR4_SYMLINK_SUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
	    FATTR4_NAMED_ATTR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
		if (resbmap & FATTR4_SUPPORTED_ATTRS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
			if (!xdr_bitmap4(xdrs, &gesp->n4g_suppattrs))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
		if (resbmap & FATTR4_TYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
			if (!XDR_GETINT32(xdrs, (int *)&vap->va_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
			if (vap->va_type < NF4REG ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
			    vap->va_type > NF4NAMEDATTR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
				vap->va_type = VBAD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
				vap->va_type = nf4_to_vt[vap->va_type];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
			if (vap->va_type == VBLK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
				vap->va_blksize = DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
			vap->va_mask |= AT_TYPE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
		if (resbmap & FATTR4_FH_EXPIRE_TYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
			if (!XDR_GETINT32(xdrs, (int *)&gesp->n4g_fet))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
		if (resbmap & FATTR4_CHANGE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
				(u_longlong_t *)&garp->n4g_change))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
			garp->n4g_change_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
		if (resbmap & FATTR4_SIZE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
					(u_longlong_t *)&vap->va_size))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
			if (!NFS4_SIZE_OK(vap->va_size)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
				garp->n4g_attrerr = EFBIG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
				garp->n4g_attrwhy = NFS4_GETATTR_ATSIZE_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
				vap->va_mask |= AT_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
		if (resbmap & FATTR4_LINK_SUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
			gesp->n4g_pc4.pc4_link_support =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
		if (resbmap & FATTR4_SYMLINK_SUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
			gesp->n4g_pc4.pc4_symlink_support =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
		if (resbmap & FATTR4_NAMED_ATTR_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
			gesp->n4g_pc4.pc4_xattr_exists = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
			gesp->n4g_pc4.pc4_xattr_exists =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
	    (FATTR4_FSID_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
	    FATTR4_UNIQUE_HANDLES_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	    FATTR4_LEASE_TIME_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
	    FATTR4_RDATTR_ERROR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
		if (resbmap & FATTR4_FSID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
		    if ((!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
				(u_longlong_t *)&garp->n4g_fsid.major)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
			(!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
				(u_longlong_t *)&garp->n4g_fsid.minor)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
		    garp->n4g_fsid_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
		if (resbmap & FATTR4_UNIQUE_HANDLES_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
			gesp->n4g_pc4.pc4_unique_handles =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
		if (resbmap & FATTR4_LEASE_TIME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
			if (!XDR_GETINT32(xdrs, (int *)&gesp->n4g_leasetime))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
		if (resbmap & FATTR4_RDATTR_ERROR_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
			if (!XDR_GETINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
					(int *)&gesp->n4g_rdattr_error))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	    (FATTR4_ACL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	    FATTR4_ACLSUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
	    FATTR4_ARCHIVE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	    FATTR4_CANSETTIME_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
		if (resbmap & FATTR4_ACL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
			fattr4_acl	acl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
			acl.fattr4_acl_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
			acl.fattr4_acl_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
			if (!xdr_fattr4_acl(xdrs, &acl))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
			vsap->vsa_aclcnt = acl.fattr4_acl_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
			vsap->vsa_aclentp = acl.fattr4_acl_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
			vsap->vsa_mask = VSA_ACE | VSA_ACECNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
		if (resbmap & FATTR4_ACLSUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
			if (!XDR_GETINT32(xdrs, (int *)&gesp->n4g_aclsupport))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		if (resbmap & FATTR4_ARCHIVE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
		if (resbmap & FATTR4_CANSETTIME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
			gesp->n4g_pc4.pc4_cansettime =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
	    (FATTR4_CASE_INSENSITIVE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
	    FATTR4_CASE_PRESERVING_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
	    FATTR4_CHOWN_RESTRICTED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
	    FATTR4_FILEHANDLE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
	    FATTR4_FILEID_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
	    FATTR4_FILES_AVAIL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
	    FATTR4_FILES_FREE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
	    FATTR4_FILES_TOTAL_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
		if (resbmap & FATTR4_CASE_INSENSITIVE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
			gesp->n4g_pc4.pc4_case_insensitive =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
		if (resbmap & FATTR4_CASE_PRESERVING_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
			gesp->n4g_pc4.pc4_case_preserving =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
		if (resbmap & FATTR4_CHOWN_RESTRICTED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
			gesp->n4g_pc4.pc4_chown_restricted =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
		if (resbmap & FATTR4_FILEHANDLE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
			gesp->n4g_fh_u.nfs_fh4_alt.len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
			gesp->n4g_fh_u.nfs_fh4_alt.val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
				gesp->n4g_fh_u.nfs_fh4_alt.data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
			if (!xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
			    (char **)&gesp->n4g_fh_u.n4g_fh.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
			    (uint_t *)&gesp->n4g_fh_u.n4g_fh.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
			    NFS4_FHSIZE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
		if (resbmap & FATTR4_FILEID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
					(u_longlong_t *)&vap->va_nodeid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
			vap->va_mask |= AT_NODEID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
		if (resbmap & FATTR4_FILES_AVAIL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
				(u_longlong_t *)&gesp->n4g_sb.f_favail))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
		if (resbmap & FATTR4_FILES_FREE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
				(u_longlong_t *)&gesp->n4g_sb.f_ffree))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
		if (resbmap & FATTR4_FILES_TOTAL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
				(u_longlong_t *)&gesp->n4g_sb.f_files))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
	    (FATTR4_FS_LOCATIONS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
	    FATTR4_HIDDEN_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
	    FATTR4_HOMOGENEOUS_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
		if (resbmap & FATTR4_FS_LOCATIONS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
		if (resbmap & FATTR4_HIDDEN_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
		if (resbmap & FATTR4_HOMOGENEOUS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
			gesp->n4g_pc4.pc4_homogeneous =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
	    (FATTR4_MAXFILESIZE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
	    FATTR4_MAXLINK_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
	    FATTR4_MAXNAME_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	    FATTR4_MAXREAD_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
	    FATTR4_MAXWRITE_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
		if (resbmap & FATTR4_MAXFILESIZE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
				(u_longlong_t *)&gesp->n4g_maxfilesize))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
		if (resbmap & FATTR4_MAXLINK_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
			if (!XDR_GETINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
					(int *)&gesp->n4g_pc4.pc4_link_max))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
		if (resbmap & FATTR4_MAXNAME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
			if (!XDR_GETINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
					(int *)&gesp->n4g_pc4.pc4_name_max))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
			gesp->n4g_sb.f_namemax = gesp->n4g_pc4.pc4_name_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
		if (resbmap & FATTR4_MAXREAD_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
				(u_longlong_t *)&gesp->n4g_maxread))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
		if (resbmap & FATTR4_MAXWRITE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
				(u_longlong_t *)&gesp->n4g_maxwrite))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
				return (FALSE);
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
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
	    (FATTR4_MIMETYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
	    FATTR4_MODE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
	    FATTR4_NO_TRUNC_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
	    FATTR4_NUMLINKS_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
		if (resbmap & FATTR4_MIMETYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
		if (resbmap & FATTR4_MODE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
			if (!XDR_GETINT32(xdrs, (int *)&vap->va_mode))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
			vap->va_mask |= AT_MODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
		if (resbmap & FATTR4_NO_TRUNC_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
			gesp->n4g_pc4.pc4_no_trunc =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
		if (resbmap & FATTR4_NUMLINKS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
			if (!XDR_GETINT32(xdrs, (int *)&vap->va_nlink))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
			vap->va_mask |= AT_NLINK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
	    (FATTR4_OWNER_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
	    FATTR4_OWNER_GROUP_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
	    FATTR4_QUOTA_AVAIL_HARD_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
	    FATTR4_QUOTA_AVAIL_SOFT_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
		if (resbmap & FATTR4_OWNER_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
			uint_t *owner_length, ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
			char *owner_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
			char *owner_alloc = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
			utf8string ov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
			/* get the OWNER_LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
			if (!xdr_u_int(xdrs, &ol))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
			/* Manage the owner length location */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
			if (pug && ol <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
				owner_length = &pug->u_curr.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
				*owner_length = ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
				owner_length = &ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
			/* find memory to store the decode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
			if (*owner_length > MAX_OG_NAME || pug == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
				owner_val = owner_alloc =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
					kmem_alloc(*owner_length, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
				owner_val = pug->u_curr.utf8string_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
			/* get the OWNER string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
			if (!xdr_opaque(xdrs, owner_val, *owner_length)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
				if (owner_alloc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
					kmem_free(owner_alloc, *owner_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
				return (FALSE);
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
			/* Optimize for matching if called for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
			if (pug &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
			    *owner_length == pug->u_last.utf8string_len &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
			    bcmp(owner_val, pug->u_last.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
					*owner_length) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
				vap->va_uid = pug->uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
				vap->va_mask |= AT_UID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
				uid_t uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
				ov.utf8string_len = *owner_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
				ov.utf8string_val = owner_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
				error = nfs_idmap_str_uid(&ov, &uid, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
				 * String was mapped, but to nobody because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
				 * we are nfsmapid, indicate it should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
				 * be cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
				if (error == ENOTSUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
					error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
						NFS4_GETATTR_NOCACHE_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
					garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
						NFS4_GETATTR_ATUID_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
					vap->va_uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
					vap->va_mask |= AT_UID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
					if (pug && ol <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
						pug->uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
						U_SWAP_CURR_LAST(pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
				if (owner_alloc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
					kmem_free(owner_alloc, *owner_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
		if (resbmap & FATTR4_OWNER_GROUP_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
			uint_t *group_length, gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
			char *group_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
			char *group_alloc = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
			utf8string gv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
			/* get the OWNER_GROUP_LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
			if (!xdr_u_int(xdrs, &gl))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
			/* Manage the group length location */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
			if (pug && gl <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
				group_length = &pug->g_curr.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
				*group_length = gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
				group_length = &gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
			/* find memory to store the decode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
			if (*group_length > MAX_OG_NAME || pug == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
				group_val = group_alloc =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
					kmem_alloc(*group_length, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
				group_val = pug->g_curr.utf8string_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
			/* get the OWNER_GROUP string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
			if (!xdr_opaque(xdrs, group_val, *group_length)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
				if (group_alloc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
					kmem_free(group_alloc, *group_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
			/* Optimize for matching if called for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
			if (pug &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
			    *group_length == pug->g_last.utf8string_len &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
			    bcmp(group_val, pug->g_last.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
					*group_length) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
				vap->va_gid = pug->gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
				vap->va_mask |= AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
				uid_t gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
				gv.utf8string_len = *group_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
				gv.utf8string_val = group_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
				error = nfs_idmap_str_gid(&gv, &gid, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
				 * String was mapped, but to nobody because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
				 * we are nfsmapid, indicate it should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
				 * be cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
				if (error == ENOTSUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
					error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
						NFS4_GETATTR_NOCACHE_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
					garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
						NFS4_GETATTR_ATGID_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
					vap->va_gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
					vap->va_mask |= AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
					if (pug && gl <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
						pug->gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
						G_SWAP_CURR_LAST(pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
				if (group_alloc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
					kmem_free(group_alloc, *group_length);
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
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
		if (resbmap & FATTR4_QUOTA_AVAIL_HARD_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
		if (resbmap & FATTR4_QUOTA_AVAIL_SOFT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
	    (FATTR4_QUOTA_USED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
	    FATTR4_SPACE_AVAIL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
	    FATTR4_SPACE_FREE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
	    FATTR4_SPACE_TOTAL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
	    FATTR4_SPACE_USED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
	    FATTR4_SYSTEM_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
		if (resbmap & FATTR4_QUOTA_USED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
		if (resbmap & FATTR4_RAWDEV_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
			fattr4_rawdev rawdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
			if (!xdr_fattr4_rawdev(xdrs, &rawdev))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
			if (vap->va_type == VCHR || vap->va_type == VBLK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
				vap->va_rdev = makedevice(rawdev.specdata1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
							rawdev.specdata2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
				vap->va_rdev = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
			vap->va_mask |= AT_RDEV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
		if (resbmap & FATTR4_SPACE_AVAIL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
				(u_longlong_t *)&gesp->n4g_sb.f_bavail))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
			gesp->n4g_sb.f_bavail /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
		if (resbmap & FATTR4_SPACE_FREE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
				(u_longlong_t *)&gesp->n4g_sb.f_bfree))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
			gesp->n4g_sb.f_bfree /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
		if (resbmap & FATTR4_SPACE_TOTAL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
				(u_longlong_t *)&gesp->n4g_sb.f_blocks))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
			gesp->n4g_sb.f_blocks /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
		if (resbmap & FATTR4_SPACE_USED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
			uint64_t space_used;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
						(u_longlong_t *)&space_used))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
			/* Compute space depending on device type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
			ASSERT((vap->va_mask & AT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
			if (vap->va_type == VREG || vap->va_type == VDIR ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
			    vap->va_type == VLNK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
				vap->va_nblocks = (u_longlong_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
					((space_used + (offset4)DEV_BSIZE -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
					(offset4)1) / (offset4)DEV_BSIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
				vap->va_nblocks = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
			vap->va_mask |= AT_NBLOCKS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		if (resbmap & FATTR4_SYSTEM_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
	    (FATTR4_TIME_ACCESS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
	    FATTR4_TIME_ACCESS_SET_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
	    FATTR4_TIME_BACKUP_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
	    FATTR4_TIME_CREATE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
	    FATTR4_TIME_DELTA_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
	    FATTR4_TIME_METADATA_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
	    FATTR4_TIME_MODIFY_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
	    FATTR4_TIME_MODIFY_SET_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
	    FATTR4_MOUNTED_ON_FILEID_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
		if (resbmap & FATTR4_TIME_ACCESS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
			nfstime4 atime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
			if (!xdr_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
					    (longlong_t *)&atime.seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
			if (!XDR_GETINT32(xdrs, (int *)&atime.nseconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
			error = nfs4_time_ntov(&atime, &vap->va_atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
				garp->n4g_attrwhy = NFS4_GETATTR_ATATIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
			vap->va_mask |= AT_ATIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
		if (resbmap & FATTR4_TIME_ACCESS_SET_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
		if (resbmap & FATTR4_TIME_BACKUP_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
		if (resbmap & FATTR4_TIME_CREATE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
		if (resbmap & FATTR4_TIME_DELTA_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
			if ((!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
			    (u_longlong_t *)&gesp->n4g_delta.seconds)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
			    (!xdr_u_int(xdrs, &gesp->n4g_delta.nseconds)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
		if (resbmap & FATTR4_TIME_METADATA_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
			nfstime4 mdt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
			if (!xdr_longlong_t(xdrs, (longlong_t *)&mdt.seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
			if (!XDR_GETINT32(xdrs, (int32_t *)&mdt.nseconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
			error = nfs4_time_ntov(&mdt, &vap->va_ctime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
				garp->n4g_attrwhy = NFS4_GETATTR_ATCTIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
			vap->va_mask |= AT_CTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
		if (resbmap & FATTR4_TIME_MODIFY_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
			nfstime4 mtime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
			if (!xdr_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
					    (longlong_t *)&mtime.seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
			if (!XDR_GETINT32(xdrs, (int32_t *)&mtime.nseconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
			error = nfs4_time_ntov(&mtime, &vap->va_mtime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
				garp->n4g_attrwhy = NFS4_GETATTR_ATMTIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
			vap->va_mask |= AT_MTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
		if (resbmap & FATTR4_TIME_MODIFY_SET_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
		if (resbmap & FATTR4_MOUNTED_ON_FILEID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
					(u_longlong_t *)&garp->n4g_mon_fid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
			garp->n4g_mon_fid_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
	if (resbmap & ~(NFS4_VATTR_MASK | FATTR4_ACL_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
		/* copy only if not provided */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
		if (garp->n4g_ext_res == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
			garp->n4g_ext_res = kmem_alloc(sizeof (ges), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
			bcopy(&ges, garp->n4g_ext_res, sizeof (ges));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
 * Inlined version of get_bitmap4 processing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
bitmap4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
xdr_get_bitmap4_inline(uint32_t **iptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
	uint32_t resbmaplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
	bitmap4 bm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
	uint32_t *ptr = *iptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
	/* bitmap LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
	resbmaplen = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
	/* Inline the bitmap and attrlen for common case of two word map */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
	if (resbmaplen == 2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
		IXDR_GET_HYPER(ptr, bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
#if defined(_LITTLE_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
	bm = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
	if (--resbmaplen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
	*((uint32_t *)&bm) |= IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
	if (--resbmaplen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
	ptr += resbmaplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
	*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
	return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
#elif defined(_BIG_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
	*((uint32_t *)&bm) = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
	if (--resbmaplen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
	bm |= IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	if (--resbmaplen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
	ptr += resbmaplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
	return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
	ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
	ptr += resbmaplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
	*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
xdr_ga_fattr_res_inline(uint32_t *ptr, struct nfs4_ga_res *garp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
			bitmap4 resbmap, bitmap4 argbmap, struct mntinfo4 *mi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
			ug_cache_t *pug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
	int truefalse;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
	struct nfs4_ga_ext_res ges, *gesp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
	vattr_t *vap = &garp->n4g_va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
	if (garp->n4g_ext_res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
		gesp = garp->n4g_ext_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
		gesp = &ges;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
	vap->va_mask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
	/* Check to see if the vattr should be pre-filled */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
	if (argbmap & NFS4_VATTR_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
		xdr_ga_prefill_vattr(garp, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
	if (argbmap & NFS4_STATFS_ATTR_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
		xdr_ga_prefill_statvfs(gesp, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
	    (FATTR4_SUPPORTED_ATTRS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
	    FATTR4_TYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	    FATTR4_FH_EXPIRE_TYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
	    FATTR4_CHANGE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
	    FATTR4_SIZE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
	    FATTR4_LINK_SUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
	    FATTR4_SYMLINK_SUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
	    FATTR4_NAMED_ATTR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
		if (resbmap & FATTR4_SUPPORTED_ATTRS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
			gesp->n4g_suppattrs = xdr_get_bitmap4_inline(&ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
		if (resbmap & FATTR4_TYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
			vap->va_type = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
			if (vap->va_type < NF4REG ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
			    vap->va_type > NF4NAMEDATTR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
				vap->va_type = VBAD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
				vap->va_type = nf4_to_vt[vap->va_type];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
			if (vap->va_type == VBLK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
				vap->va_blksize = DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
			vap->va_mask |= AT_TYPE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
		if (resbmap & FATTR4_FH_EXPIRE_TYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
			gesp->n4g_fet = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
		if (resbmap & FATTR4_CHANGE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
			IXDR_GET_U_HYPER(ptr, garp->n4g_change);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
			garp->n4g_change_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
		if (resbmap & FATTR4_SIZE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
			IXDR_GET_U_HYPER(ptr, vap->va_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
			if (!NFS4_SIZE_OK(vap->va_size)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
				garp->n4g_attrerr = EFBIG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
				garp->n4g_attrwhy = NFS4_GETATTR_ATSIZE_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
				vap->va_mask |= AT_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
		if (resbmap & FATTR4_LINK_SUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
			gesp->n4g_pc4.pc4_link_support =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
		if (resbmap & FATTR4_SYMLINK_SUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
			gesp->n4g_pc4.pc4_symlink_support =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
		if (resbmap & FATTR4_NAMED_ATTR_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
			gesp->n4g_pc4.pc4_xattr_exists = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
			gesp->n4g_pc4.pc4_xattr_exists =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	    (FATTR4_FSID_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
	    FATTR4_UNIQUE_HANDLES_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
	    FATTR4_LEASE_TIME_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
	    FATTR4_RDATTR_ERROR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
		if (resbmap & FATTR4_FSID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
			IXDR_GET_U_HYPER(ptr, garp->n4g_fsid.major);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
			IXDR_GET_U_HYPER(ptr, garp->n4g_fsid.minor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
			garp->n4g_fsid_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
		if (resbmap & FATTR4_UNIQUE_HANDLES_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
			gesp->n4g_pc4.pc4_unique_handles =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
		if (resbmap & FATTR4_LEASE_TIME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
			gesp->n4g_leasetime = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
		if (resbmap & FATTR4_RDATTR_ERROR_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
			gesp->n4g_rdattr_error = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
	    (FATTR4_ACL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
	    FATTR4_ACLSUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
	    FATTR4_ARCHIVE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
	    FATTR4_CANSETTIME_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
		if (resbmap & FATTR4_ACL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
		if (resbmap & FATTR4_ACLSUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
			gesp->n4g_aclsupport = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
		if (resbmap & FATTR4_ARCHIVE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
		if (resbmap & FATTR4_CANSETTIME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
			gesp->n4g_pc4.pc4_cansettime =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
	    (FATTR4_CASE_INSENSITIVE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
	    FATTR4_CASE_PRESERVING_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
	    FATTR4_CHOWN_RESTRICTED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
	    FATTR4_FILEHANDLE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
	    FATTR4_FILEID_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
	    FATTR4_FILES_AVAIL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
	    FATTR4_FILES_FREE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
	    FATTR4_FILES_TOTAL_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
		if (resbmap & FATTR4_CASE_INSENSITIVE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
			gesp->n4g_pc4.pc4_case_insensitive =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
		if (resbmap & FATTR4_CASE_PRESERVING_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
			gesp->n4g_pc4.pc4_case_preserving =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
		if (resbmap & FATTR4_CHOWN_RESTRICTED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
			gesp->n4g_pc4.pc4_chown_restricted =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
		if (resbmap & FATTR4_FILEHANDLE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
			int len = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
			gesp->n4g_fh_u.nfs_fh4_alt.len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
			gesp->n4g_fh_u.nfs_fh4_alt.val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
				gesp->n4g_fh_u.nfs_fh4_alt.data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
			gesp->n4g_fh_u.n4g_fh.nfs_fh4_len = len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
			bcopy(ptr, gesp->n4g_fh_u.n4g_fh.nfs_fh4_val, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
			ptr += RNDUP(len) / BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
		if (resbmap & FATTR4_FILEID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
			IXDR_GET_U_HYPER(ptr, vap->va_nodeid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
			vap->va_mask |= AT_NODEID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
		if (resbmap & FATTR4_FILES_AVAIL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_favail);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
		if (resbmap & FATTR4_FILES_FREE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_ffree);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
		if (resbmap & FATTR4_FILES_TOTAL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_files);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
	    (FATTR4_FS_LOCATIONS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
	    FATTR4_HIDDEN_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
	    FATTR4_HOMOGENEOUS_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
		if (resbmap & FATTR4_FS_LOCATIONS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
		if (resbmap & FATTR4_HIDDEN_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
		if (resbmap & FATTR4_HOMOGENEOUS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
			gesp->n4g_pc4.pc4_homogeneous =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
	    (FATTR4_MAXFILESIZE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
	    FATTR4_MAXLINK_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
	    FATTR4_MAXNAME_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
	    FATTR4_MAXREAD_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
	    FATTR4_MAXWRITE_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
		if (resbmap & FATTR4_MAXFILESIZE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
			IXDR_GET_U_HYPER(ptr, gesp->n4g_maxfilesize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
		if (resbmap & FATTR4_MAXLINK_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
			gesp->n4g_pc4.pc4_link_max = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
		if (resbmap & FATTR4_MAXNAME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
			gesp->n4g_pc4.pc4_name_max = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
			gesp->n4g_sb.f_namemax = gesp->n4g_pc4.pc4_name_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
		if (resbmap & FATTR4_MAXREAD_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
			IXDR_GET_U_HYPER(ptr, gesp->n4g_maxread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
		if (resbmap & FATTR4_MAXWRITE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
			IXDR_GET_U_HYPER(ptr, gesp->n4g_maxwrite);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
	    (FATTR4_MIMETYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
	    FATTR4_MODE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
	    FATTR4_NO_TRUNC_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
	    FATTR4_NUMLINKS_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
		if (resbmap & FATTR4_MIMETYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
		if (resbmap & FATTR4_MODE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
			vap->va_mode = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
			vap->va_mask |= AT_MODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
		if (resbmap & FATTR4_NO_TRUNC_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
			gesp->n4g_pc4.pc4_no_trunc =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
		if (resbmap & FATTR4_NUMLINKS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
			vap->va_nlink = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
			vap->va_mask |= AT_NLINK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
	    (FATTR4_OWNER_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
	    FATTR4_OWNER_GROUP_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
	    FATTR4_QUOTA_AVAIL_HARD_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
	    FATTR4_QUOTA_AVAIL_SOFT_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
		if (resbmap & FATTR4_OWNER_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
			uint_t *owner_length, ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
			char *owner_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
			utf8string ov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
			/* get the OWNER_LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
			ol = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
			/* Manage the owner length location */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
			if (pug && ol <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
				owner_length = &pug->u_curr.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
				*owner_length = ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
				owner_length = &ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
			/* find memory to store the decode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
			if (*owner_length > MAX_OG_NAME || pug == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
				owner_val = (char *)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
				owner_val = (char *)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
			/* Optimize for matching if called for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
			if (pug &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
			    *owner_length == pug->u_last.utf8string_len &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
			    bcmp(owner_val, pug->u_last.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
					*owner_length) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
				vap->va_uid = pug->uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
				vap->va_mask |= AT_UID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
				uid_t uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
				ov.utf8string_len = *owner_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
				ov.utf8string_val = owner_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
				error = nfs_idmap_str_uid(&ov, &uid, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
				 * String was mapped, but to nobody because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
				 * we are nfsmapid, indicate it should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
				 * be cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
				if (error == ENOTSUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
					error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
						NFS4_GETATTR_NOCACHE_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
					garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
						NFS4_GETATTR_ATUID_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
					vap->va_uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
					vap->va_mask |= AT_UID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
					/* save the results for next time */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
					if (pug && ol <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
						pug->uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
						pug->u_curr.utf8string_len =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
							ov.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
						bcopy(owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
						pug->u_curr.utf8string_val, ol);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
						U_SWAP_CURR_LAST(pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
			ptr += RNDUP(ol) / BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
		if (resbmap & FATTR4_OWNER_GROUP_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
			uint_t *group_length, gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
			char *group_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
			utf8string gv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
			/* get the OWNER_GROUP_LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
			gl = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
			/* Manage the group length location */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
			if (pug && gl <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
				group_length = &pug->g_curr.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
				*group_length = gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
				group_length = &gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
			/* find memory to store the decode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
			if (*group_length > MAX_OG_NAME || pug == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
				group_val = (char *)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
				group_val = (char *)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
			/* Optimize for matching if called for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
			if (pug &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
			    *group_length == pug->g_last.utf8string_len &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
			    bcmp(group_val, pug->g_last.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
					*group_length) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
				vap->va_gid = pug->gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
				vap->va_mask |= AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
				uid_t gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
				gv.utf8string_len = *group_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
				gv.utf8string_val = group_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
				error = nfs_idmap_str_gid(&gv, &gid, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
				 * String was mapped, but to nobody because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
				 * we are nfsmapid, indicate it should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
				 * be cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
				if (error == ENOTSUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
					error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
						NFS4_GETATTR_NOCACHE_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
					garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
						NFS4_GETATTR_ATGID_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
					vap->va_gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
					vap->va_mask |= AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
					if (pug && gl <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
						pug->gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
						pug->g_curr.utf8string_len =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
							gv.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
						bcopy(group_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
						    pug->g_curr.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
						    gl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
						G_SWAP_CURR_LAST(pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
			ptr += RNDUP(gl) / BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
		if (resbmap & FATTR4_QUOTA_AVAIL_HARD_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
		if (resbmap & FATTR4_QUOTA_AVAIL_SOFT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
	    (FATTR4_QUOTA_USED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
	    FATTR4_SPACE_AVAIL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
	    FATTR4_SPACE_FREE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
	    FATTR4_SPACE_TOTAL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
	    FATTR4_SPACE_USED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
	    FATTR4_SYSTEM_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
		if (resbmap & FATTR4_QUOTA_USED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
		if (resbmap & FATTR4_RAWDEV_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
			fattr4_rawdev rawdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
			rawdev.specdata1 = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
			rawdev.specdata2 = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
			if (vap->va_type == VCHR || vap->va_type == VBLK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
				vap->va_rdev = makedevice(rawdev.specdata1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
							rawdev.specdata2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
				vap->va_rdev = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
			vap->va_mask |= AT_RDEV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
		if (resbmap & FATTR4_SPACE_AVAIL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_bavail);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
			gesp->n4g_sb.f_bavail /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
		if (resbmap & FATTR4_SPACE_FREE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_bfree);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
			gesp->n4g_sb.f_bfree /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
		if (resbmap & FATTR4_SPACE_TOTAL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_blocks);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
			gesp->n4g_sb.f_blocks /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
		if (resbmap & FATTR4_SPACE_USED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
			uint64_t space_used;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
			IXDR_GET_U_HYPER(ptr, space_used);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
			/* Compute space depending on device type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
			ASSERT((vap->va_mask & AT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
			if (vap->va_type == VREG || vap->va_type == VDIR ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
			    vap->va_type == VLNK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
				vap->va_nblocks = (u_longlong_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
					((space_used + (offset4)DEV_BSIZE -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
					(offset4)1) / (offset4)DEV_BSIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
				vap->va_nblocks = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
			vap->va_mask |= AT_NBLOCKS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
		if (resbmap & FATTR4_SYSTEM_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
	    (FATTR4_TIME_ACCESS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
	    FATTR4_TIME_ACCESS_SET_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
	    FATTR4_TIME_BACKUP_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
	    FATTR4_TIME_CREATE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
	    FATTR4_TIME_DELTA_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
	    FATTR4_TIME_METADATA_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
	    FATTR4_TIME_MODIFY_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
	    FATTR4_TIME_MODIFY_SET_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
	    FATTR4_MOUNTED_ON_FILEID_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
		if (resbmap & FATTR4_TIME_ACCESS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
			nfstime4 atime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
			IXDR_GET_U_HYPER(ptr, atime.seconds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
			atime.nseconds = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
			error = nfs4_time_ntov(&atime, &vap->va_atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
				garp->n4g_attrwhy = NFS4_GETATTR_ATATIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
			vap->va_mask |= AT_ATIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
		if (resbmap & FATTR4_TIME_ACCESS_SET_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
		if (resbmap & FATTR4_TIME_BACKUP_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
		if (resbmap & FATTR4_TIME_CREATE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
		if (resbmap & FATTR4_TIME_DELTA_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
			IXDR_GET_U_HYPER(ptr, gesp->n4g_delta.seconds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
			gesp->n4g_delta.nseconds = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
		if (resbmap & FATTR4_TIME_METADATA_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
			nfstime4 mdt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
			IXDR_GET_U_HYPER(ptr, mdt.seconds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
			mdt.nseconds = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
			error = nfs4_time_ntov(&mdt, &vap->va_ctime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
				garp->n4g_attrwhy = NFS4_GETATTR_ATCTIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
			vap->va_mask |= AT_CTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
		if (resbmap & FATTR4_TIME_MODIFY_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
			nfstime4 mtime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
			IXDR_GET_U_HYPER(ptr, mtime.seconds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
			mtime.nseconds = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
			error = nfs4_time_ntov(&mtime, &vap->va_mtime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
				garp->n4g_attrwhy = NFS4_GETATTR_ATMTIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
			vap->va_mask |= AT_MTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
		if (resbmap & FATTR4_TIME_MODIFY_SET_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
		if (resbmap & FATTR4_MOUNTED_ON_FILEID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
			IXDR_GET_U_HYPER(ptr, garp->n4g_mon_fid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
			garp->n4g_mon_fid_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
	 * FATTR4_ACL_MASK is not yet supported by this function, but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
	 * we check against it anyway, in case it ever is.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
	if (resbmap & ~(NFS4_VATTR_MASK | FATTR4_ACL_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
		/* copy only if not provided */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
		if (garp->n4g_ext_res == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
			garp->n4g_ext_res = kmem_alloc(sizeof (ges), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
			bcopy(&ges, garp->n4g_ext_res, sizeof (ges));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
 * "." and ".." buffers for filling in on read and readdir
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
 * calls. Intialize the first time and fill in on every
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
 * call to to readdir.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
char	*nfs4_dot_entries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
char	*nfs4_dot_dot_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
 * Create the "." or ".." and pad the buffer once so they are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
 * copied out as required into the user supplied buffer everytime.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
 * DIRENT64_RECLEN(sizeof (".") - 1) = DIRENT64_RECLEN(1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
 * DIRENT64_RECLEN(sizeof ("..") - 1) = DIRENT64_RECLEN(2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
nfs4_init_dot_entries()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
	struct dirent64 *odp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
	 * zalloc it so it zeros the buffer out. Need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
	 * to just do it once.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
	nfs4_dot_entries = kmem_zalloc(DIRENT64_RECLEN(1) + DIRENT64_RECLEN(2),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
	    KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
	odp = (struct dirent64 *)nfs4_dot_entries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
	odp->d_off = 1; /* magic cookie for "." entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
	odp->d_reclen = DIRENT64_RECLEN(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
	odp->d_name[0] = '.';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
	odp->d_name[1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
	nfs4_dot_dot_entry = nfs4_dot_entries + DIRENT64_RECLEN(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
	odp = (struct dirent64 *)nfs4_dot_dot_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
	odp->d_off = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
	odp->d_reclen = DIRENT64_RECLEN(2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
	odp->d_name[0] = '.';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
	odp->d_name[1] = '.';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
	odp->d_name[2] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
nfs4_destroy_dot_entries()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
	if (nfs4_dot_entries)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
		kmem_free(nfs4_dot_entries, DIRENT64_RECLEN(1) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
		    DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
	nfs4_dot_entries = nfs4_dot_dot_entry = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
xdr_READDIR4res_clnt(XDR *xdrs, READDIR4res_clnt *objp, READDIR4args *aobjp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
	bool_t more_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
	rddir4_cache *rdc = aobjp->rdc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
	dirent64_t *dp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
	int entry_length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
	int space_left = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
	bitmap4 resbmap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
	uint32_t attrlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
	nfs4_ga_res_t gar;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
	struct nfs4_ga_ext_res ges;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
	uint64_t last_cookie = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
	int skip_to_end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
	ug_cache_t *pug = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
	ASSERT(xdrs->x_op == XDR_DECODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
	ASSERT(rdc->entries == NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
	ASSERT(aobjp->dircount > 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
	gar.n4g_va.va_mask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
	gar.n4g_change_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
	gar.n4g_mon_fid_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
	gar.n4g_fsid_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
	gar.n4g_vsa.vsa_mask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
	gar.n4g_attrwhy = NFS4_GETATTR_OP_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
	ges.n4g_pc4.pc4_cache_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
	ges.n4g_pc4.pc4_xattr_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
	gar.n4g_ext_res = &ges;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
	/* READDIR4res_clnt_free needs to kmem_free this buffer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
	rdc->entries = kmem_alloc(aobjp->dircount, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
	dp = (dirent64_t *)rdc->entries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
	rdc->entlen = rdc->buflen = space_left = aobjp->dircount;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
	/* Fill in dot and dot-dot if needed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
	if (rdc->nfs4_cookie == (nfs_cookie4) 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
		    rdc->nfs4_cookie == (nfs_cookie4) 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
		if (rdc->nfs4_cookie == (nfs_cookie4)0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
			bcopy(nfs4_dot_entries, rdc->entries,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
				    DIRENT64_RECLEN(1) + DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
			objp->dotp = dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
			dp = (struct dirent64 *)(((char *)dp) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
							DIRENT64_RECLEN(1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
			objp->dotdotp = dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
			dp = (struct dirent64 *)(((char *)dp) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
							DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
			space_left -= DIRENT64_RECLEN(1) + DIRENT64_RECLEN(2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
		} else	{	/* for ".." entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
			bcopy(nfs4_dot_dot_entry, rdc->entries,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
						DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
			objp->dotp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
			objp->dotdotp = dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
			dp = (struct dirent64 *)(((char *)dp) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
							DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
			space_left -= DIRENT64_RECLEN(2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
		/* Magic NFSv4 number for entry after start */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
		last_cookie = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
	/* Get the cookie VERIFIER */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cookieverf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
		goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
	/* Get the do-we-have-a-next-entry BOOL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
	if (!xdr_bool(xdrs, &more_data))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
		goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
	if (aobjp->attr_request & (FATTR4_OWNER_MASK | FATTR4_OWNER_GROUP_MASK))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
		pug = alloc_ugcache();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
	skip_to_end = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
	while (more_data) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
		uint_t namelen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
		uint64_t cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
		/* Get the COOKIE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&cookie))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
		/* Get the LENGTH of the entry name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
		if (!xdr_u_int(xdrs, &namelen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
		if (!skip_to_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
			 * With the length of the directory entry name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
			 * in hand, figure out if there is room left
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
			 * to encode it for the requestor.  If not,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
			 * that is okay, but the rest of the readdir
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
			 * operation result must be decoded in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
			 * case there are following operations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
			 * in the compound request.  Therefore, mark
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
			 * the rest of the response as "skip" and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
			 * decode or skip the remaining data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
			entry_length = DIRENT64_RECLEN(namelen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
			if (space_left < entry_length)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
				skip_to_end = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
		/* Get the NAME of the entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
		if (!skip_to_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
			if (!xdr_opaque(xdrs, dp->d_name, namelen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
				goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
			bzero(&dp->d_name[namelen],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
				DIRENT64_NAMELEN(entry_length) - namelen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
			dp->d_off = last_cookie = cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
			dp->d_reclen = entry_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
			if (!XDR_CONTROL(xdrs, XDR_SKIPBYTES, &namelen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
				goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
		/* Get the attribute BITMAP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
		if (!xdr_bitmap4(xdrs, &resbmap))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
		/* Get the LENGTH of the attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
		if (!xdr_u_int(xdrs, (uint_t *)&attrlen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
		/* Get the ATTRIBUTES */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
		if (!skip_to_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
			uint32_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
			if (!(resbmap & FATTR4_ACL_MASK) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
			    (ptr = (uint32_t *)XDR_INLINE(xdrs, attrlen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
			    != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
				if (!xdr_ga_fattr_res_inline(ptr, &gar, resbmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
							aobjp->attr_request,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
							aobjp->mi, pug))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
					goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
				if (!xdr_ga_fattr_res(xdrs, &gar, resbmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
							aobjp->attr_request,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
							aobjp->mi, pug))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
					goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
			/* Fill in the d_ino per the server's fid values */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
			 * Important to note that the mounted on fileid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
			 * is returned in d_ino if supported.  This is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
			 * expected, readdir returns the mounted on fileid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
			 * while stat() returns the fileid of the object
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
			 * on "top" of the mount.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
			if (gar.n4g_mon_fid_valid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
				dp->d_ino = gar.n4g_mon_fid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
			else if (gar.n4g_va.va_mask & AT_NODEID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
				dp->d_ino = gar.n4g_va.va_nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
				dp->d_ino = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
			/* See about creating an rnode for this entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
			if ((resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
			    (NFS4_VATTR_MASK | FATTR4_FILEHANDLE_MASK)) ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
			    (NFS4_VATTR_MASK | FATTR4_FILEHANDLE_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
				nfs4_sharedfh_t *sfhp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
				vnode_t *vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
				sfhp = sfh4_put(&ges.n4g_fh_u.n4g_fh,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
							aobjp->mi, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
				vp = makenfs4node(sfhp, &gar,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
					aobjp->dvp->v_vfsp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
					aobjp->t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
					aobjp->cr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
					aobjp->dvp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
					fn_get(VTOSV(aobjp->dvp)->sv_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
						dp->d_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
				sfh4_rele(&sfhp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
				dnlc_update(aobjp->dvp, dp->d_name, vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
				VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
			dp = (struct dirent64 *)(((caddr_t)dp) + dp->d_reclen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
			space_left -= entry_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
			if (!XDR_CONTROL(xdrs, XDR_SKIPBYTES, &attrlen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
				goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
		/* Get the do-we-have-a-next-entry BOOL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
		if (!xdr_bool(xdrs, &more_data))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
	if (pug) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
		kmem_free(pug, sizeof (ug_cache_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
		pug = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
	 * Finish up the rddir cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
	 * If no entries were returned, free up buffer &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
	 * set ncookie to the starting cookie for this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
	 * readdir request so that the direof caching
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
	 * will work properly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
	ASSERT(rdc->entries);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
	if (last_cookie == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
		kmem_free(rdc->entries, rdc->entlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
		rdc->entries = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
		last_cookie = rdc->nfs4_cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
	rdc->actlen = rdc->entlen - space_left;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
	rdc->nfs4_ncookie = last_cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
	/* Get the EOF marker */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
	if (!xdr_bool(xdrs, &objp->eof))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
		goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
	 * If the server returns eof and there were no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
	 * skipped entries, set eof
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
	rdc->eof = (objp->eof && !skip_to_end) ? TRUE : FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
	 * If we encoded entries we are done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
	if (rdc->entries) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
		rdc->error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
	 * If there were no entries and we skipped because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
	 * there was not enough space, return EINVAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
	if (skip_to_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
		rdc->error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
	 * No entries, nothing skipped, and EOF, return OK.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
	if (objp->eof == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
		rdc->error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
	 * No entries, nothing skipped, and not EOF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
	 * probably a bad cookie, return ENOENT.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
	rdc->error = ENOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
noentries:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
	if (rdc->entries) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
		kmem_free(rdc->entries, rdc->entlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
		rdc->entries = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
	if (pug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
		kmem_free(pug, sizeof (ug_cache_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
	rdc->error = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
 * xdr_ga_res
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
 * Returns: FALSE on raw data processing errors, TRUE otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
 * This function pre-processes the OP_GETATTR response, and then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
 * calls common routines to process the GETATTR fattr4 results into
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
 * vnode attributes and other components that the client is interested
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
 * in. If an error other than an RPC error is encountered, the details
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
 * of the error are filled into objp, although the result of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
 * processing is set to TRUE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
xdr_ga_res(XDR *xdrs, GETATTR4res *objp, GETATTR4args *aobjp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
	uint32_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
	bitmap4 resbmap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
	uint32_t attrlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
	ASSERT(xdrs->x_op == XDR_DECODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
	/* Initialize objp attribute error values */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
	objp->ga_res.n4g_attrerr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
		objp->ga_res.n4g_attrwhy = NFS4_GETATTR_OP_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
	if (!xdr_bitmap4(xdrs, &resbmap))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
	/* save the response bitmap for the caller */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
	objp->ga_res.n4g_resbmap = resbmap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
	/* attrlen */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
	if (!XDR_GETINT32(xdrs, (int32_t *)&attrlen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
	 * Handle case where request and response bitmaps don't match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
	if (aobjp->attr_request && aobjp->attr_request != resbmap) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
		bitmap4 deltabmap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
		 * Return error for case where server sent extra attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
		 * because the "unknown" attributes may be anywhere in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
		 * xdr stream and can't be properly processed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
		deltabmap = ((aobjp->attr_request ^ resbmap) & resbmap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
		if (deltabmap) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
			objp->ga_res.n4g_attrerr = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
			objp->ga_res.n4g_attrwhy = NFS4_GETATTR_BITMAP_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
		 * Return error for case where there is a mandatory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
		 * attribute missing in the server response. Note that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
		 * missing recommended attributes are evaluated in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
		 * specific routines that decode the server response.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
		deltabmap = ((aobjp->attr_request ^ resbmap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
				& aobjp->attr_request);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
		if ((deltabmap & FATTR4_MANDATTR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
			objp->ga_res.n4g_attrerr = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
			objp->ga_res.n4g_attrwhy = NFS4_GETATTR_MANDATTR_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
	/* Check to see if the attrs can be inlined and go for it if so */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
	if (!(resbmap & FATTR4_ACL_MASK) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
	    (ptr = (uint32_t *)XDR_INLINE(xdrs, attrlen)) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
		return (xdr_ga_fattr_res_inline(ptr, &objp->ga_res,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
					resbmap, aobjp->attr_request,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
					aobjp->mi, NULL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
		return (xdr_ga_fattr_res(xdrs, &objp->ga_res,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
					resbmap, aobjp->attr_request,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
					aobjp->mi, NULL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
#if defined(DEBUG) && !defined(lint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
 * We assume that an enum is a 32-bit value, check it once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
static enum szchk { SZVAL } szchkvar;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
xdr_settime4(XDR *xdrs, settime4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
#if defined(DEBUG) && !defined(lint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
	ASSERT(sizeof (szchkvar) == sizeof (int32_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
	if (!xdr_int(xdrs, (int *)&objp->set_it))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
	if (objp->set_it != SET_TO_CLIENT_TIME4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
	/* xdr_nfstime4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
	if (!xdr_longlong_t(xdrs, (longlong_t *)&objp->time.seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
	return (xdr_u_int(xdrs, &objp->time.nseconds));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
xdr_fattr4(XDR *xdrs, fattr4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
		if (!xdr_bitmap4(xdrs, &objp->attrmask))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
		return (xdr_bytes(xdrs, (char **)&objp->attrlist4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
			(uint_t *)&objp->attrlist4_len, NFS4_FATTR4_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
	if (objp->attrlist4 != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
		kmem_free(objp->attrlist4, objp->attrlist4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
xdr_ACCESS4res(XDR *xdrs, ACCESS4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
	if (!xdr_u_int(xdrs, &objp->supported))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
	return (xdr_u_int(xdrs, &objp->access));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
xdr_CLOSE4args(XDR *xdrs, CLOSE4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
	if (!xdr_u_int(xdrs, &objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
	return (xdr_opaque(xdrs, objp->open_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
xdr_CLOSE4res(XDR *xdrs, CLOSE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
	return (xdr_opaque(xdrs, objp->open_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
xdr_CREATE4args(XDR *xdrs, CREATE4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
		if (!xdr_int(xdrs, (int32_t *)&objp->type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
		switch (objp->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
		case NF4LNK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
			if (!xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
			    (char **)&objp->ftype4_u.linkdata.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
			    (uint_t *)&objp->ftype4_u.linkdata.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
			    NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
		case NF4BLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
		case NF4CHR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
			if (!xdr_u_int(xdrs, &objp->ftype4_u.devdata.specdata1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
			if (!xdr_u_int(xdrs, &objp->ftype4_u.devdata.specdata2))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
		case NF4SOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
		case NF4FIFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
		case NF4DIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
			break;	/* server should return NFS4ERR_BADTYPE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
		if (!xdr_bytes(xdrs, (char **)&objp->objname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
				(uint_t *)&objp->objname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
				NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
		return (xdr_fattr4(xdrs, &objp->createattrs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
	if (objp->type == NF4LNK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
		if (objp->ftype4_u.linkdata.utf8string_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
			kmem_free(objp->ftype4_u.linkdata.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
				objp->ftype4_u.linkdata.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
	if (objp->objname.utf8string_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
		kmem_free(objp->objname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
			objp->objname.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
	return (xdr_fattr4(xdrs, &objp->createattrs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
xdr_CREATE4cargs(XDR *xdrs, CREATE4cargs *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
	ASSERT(xdrs->x_op == XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
	if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
	switch (objp->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
	case NF4LNK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
		len = strlen(objp->ftype4_u.clinkdata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
		if (!XDR_PUTINT32(xdrs, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
		if (!xdr_opaque(xdrs, objp->ftype4_u.clinkdata, len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
	case NF4BLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
	case NF4CHR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
		if (!XDR_PUTINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
				(int32_t *)&objp->ftype4_u.devdata.specdata1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
		if (!XDR_PUTINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
				(int32_t *)&objp->ftype4_u.devdata.specdata2))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
	case NF4SOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
	case NF4FIFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
	case NF4DIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
		break;	/* server should return NFS4ERR_BADTYPE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
	len = strlen(objp->cname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
	if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
	if (!XDR_PUTINT32(xdrs, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
	if (!xdr_opaque(xdrs, objp->cname, len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
	return (xdr_fattr4(xdrs, &objp->createattrs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
xdr_CREATE4res(XDR *xdrs, CREATE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
	if (!xdr_bool(xdrs, &objp->cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.after))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
	return (xdr_bitmap4(xdrs, &objp->attrset));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
xdr_LINK4res(XDR *xdrs, LINK4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
	if (!xdr_bool(xdrs, &objp->cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
	return (xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.after));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
xdr_LOCK4args(XDR *xdrs, LOCK4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
		if (!xdr_int(xdrs, (int *)&objp->locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
		if (!xdr_bool(xdrs, &objp->reclaim))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->length))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
		if (!xdr_bool(xdrs, &objp->locker.new_lock_owner))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
		if (objp->locker.new_lock_owner == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
			if (!xdr_u_int(xdrs, &objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
							open_seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
			if (!xdr_u_int(xdrs, &objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
							open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
			if (!xdr_opaque(xdrs, objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
							open_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
				    12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
			if (!xdr_u_int(xdrs, &objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
							lock_seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
				    (u_longlong_t *)&objp->locker.locker4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
					open_owner.lock_owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
			return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
				(char **)&objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
				    lock_owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
				(uint_t *)&objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
				    lock_owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
				NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
		if (objp->locker.new_lock_owner != FALSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
		if (!xdr_u_int(xdrs, &objp->locker.locker4_u.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
							lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
		if (!xdr_opaque(xdrs, objp->locker.locker4_u.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
							lock_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
			    12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
		return (xdr_u_int(xdrs, &objp->locker.locker4_u.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
							lock_seqid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
	if (objp->locker.new_lock_owner == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
		if (objp->locker.locker4_u.open_owner.lock_owner.owner_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
								NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
			kmem_free(objp->locker.locker4_u.open_owner.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
							owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
				objp->locker.locker4_u.open_owner.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
							owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
xdr_LOCK4res(XDR *xdrs, LOCK4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
		if (objp->status == NFS4_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
			if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
					&objp->LOCK4res_u.lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
				objp->LOCK4res_u.lock_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
		if (objp->status != NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->LOCK4res_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
				denied.offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->LOCK4res_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
				denied.length))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
		if (!xdr_int(xdrs, (int *)&objp->LOCK4res_u.denied.locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->LOCK4res_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
				denied.owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
			    (char **)&objp->LOCK4res_u.denied.owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
			    (uint_t *)&objp->LOCK4res_u.denied.owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
			    NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
	if (objp->status == NFS4_OK || objp->status != NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
	if (objp->LOCK4res_u.denied.owner.owner_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
		kmem_free(objp->LOCK4res_u.denied.owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
			objp->LOCK4res_u.denied.owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
xdr_LOCKT4args(XDR *xdrs, LOCKT4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
		if (!xdr_int(xdrs, (int *)&objp->locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->length))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
					(u_longlong_t *)&objp->owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
		return (xdr_bytes(xdrs, (char **)&objp->owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
			(uint_t *)&objp->owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
			NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
	if (objp->owner.owner_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
		kmem_free(objp->owner.owner_val, objp->owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
xdr_LOCKT4res(XDR *xdrs, LOCKT4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
		if (objp->status == NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
		if (objp->status != NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
		/* xdr_LOCK4denied */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
					(u_longlong_t *)&objp->denied.offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
					(u_longlong_t *)&objp->denied.length))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
		if (!xdr_int(xdrs, (int *)&objp->denied.locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
				(u_longlong_t *)&objp->denied.owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
		    (char **)&objp->denied.owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
		    (uint_t *)&objp->denied.owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
		    NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
	if (objp->status == NFS4_OK || objp->status != NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
	if (objp->denied.owner.owner_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
		kmem_free(objp->denied.owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
				objp->denied.owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
xdr_LOCKU4args(XDR *xdrs, LOCKU4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
	if (!xdr_int(xdrs, (int *)&objp->locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
	if (!xdr_u_int(xdrs, &objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
	if (!xdr_u_int(xdrs, &objp->lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
	if (!xdr_opaque(xdrs, objp->lock_stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
	return (xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->length));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
xdr_OPEN4args(XDR *xdrs, OPEN4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
		if (!xdr_u_int(xdrs, &objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
		if (!xdr_u_int(xdrs, &objp->share_access))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
		if (!xdr_u_int(xdrs, &objp->share_deny))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
		/* xdr_open_owner4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
					(u_longlong_t *)&objp->owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
		if (!xdr_bytes(xdrs, (char **)&objp->owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
				(uint_t *)&objp->owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
				NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
		/* xdr_openflag4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
		if (!xdr_int(xdrs, (int *)&objp->opentype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
		if (objp->opentype == OPEN4_CREATE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
			/* xdr_createhow4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
			if (!xdr_int(xdrs, (int *)&objp->mode))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
			switch (objp->mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
			case UNCHECKED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
			case GUARDED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
				if (!xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
					    &objp->createhow4_u.createattrs))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
			case EXCLUSIVE4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2756
				if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2757
				    (u_longlong_t *)&objp->createhow4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
				    createverf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2764
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2766
		/* xdr_open_claim4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
		if (!xdr_int(xdrs, (int *)&objp->claim))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
		switch (objp->claim) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
		case CLAIM_NULL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
			return (xdr_bytes(xdrs, (char **)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
					file.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
				(uint_t *)&objp->open_claim4_u.file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
					utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
				NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
		case CLAIM_PREVIOUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
			return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
				(int *)&objp->open_claim4_u.delegate_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
		case CLAIM_DELEGATE_CUR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
			if (!xdr_u_int(xdrs, (uint_t *)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
				    delegate_cur_info.delegate_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
			if (!xdr_opaque(xdrs, objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
				    delegate_cur_info.delegate_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
				    12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
			return (xdr_bytes(xdrs, (char **)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2789
				delegate_cur_info.file.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
			    (uint_t *)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
				delegate_cur_info.file.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
			    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
		case CLAIM_DELEGATE_PREV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
			return (xdr_bytes(xdrs, (char **)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
				file_delegate_prev.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2796
			    (uint_t *)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2797
				file_delegate_prev.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2798
			    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2799
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2800
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2801
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2802
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2804
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2805
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2806
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2807
	if (objp->owner.owner_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
		kmem_free(objp->owner.owner_val, objp->owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
	if (objp->opentype == OPEN4_CREATE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
		switch (objp->mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
		case UNCHECKED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
		case GUARDED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
			(void) xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
					&objp->createhow4_u.createattrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
		case EXCLUSIVE4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
	switch (objp->claim) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
	case CLAIM_NULL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
		if (objp->open_claim4_u.file.utf8string_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
			kmem_free(objp->open_claim4_u.file.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
				objp->open_claim4_u.file.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
	case CLAIM_PREVIOUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2831
	case CLAIM_DELEGATE_CUR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
		if (objp->open_claim4_u.delegate_cur_info.file.utf8string_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
								NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
			kmem_free(objp->open_claim4_u.delegate_cur_info.file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
				objp->open_claim4_u.delegate_cur_info.file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2838
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2839
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2840
	case CLAIM_DELEGATE_PREV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2841
		if (objp->open_claim4_u.file_delegate_prev.utf8string_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2842
								NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
			kmem_free(objp->open_claim4_u.file_delegate_prev.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
				objp->open_claim4_u.file_delegate_prev.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
xdr_OPEN4cargs(XDR *xdrs, OPEN4cargs *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
	int op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
	rpc_inline_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
	ASSERT(xdrs->x_op == XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
	 * We must always define the client's open_owner to be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
	 * 4 byte aligned and sized.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
	ASSERT(objp->owner.owner_len <= NFS4_OPAQUE_LIMIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2868
	ASSERT(!(objp->owner.owner_len % BYTES_PER_XDR_UNIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
	len = objp->owner.owner_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
	if ((ptr = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT + len)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
		int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
		int32_t *ip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
		IXDR_PUT_U_INT32(ptr, OP_OPEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
		IXDR_PUT_U_INT32(ptr, objp->seqid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
		IXDR_PUT_U_INT32(ptr, objp->share_access);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
		IXDR_PUT_U_INT32(ptr, objp->share_deny);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
		/* xdr_open_owner4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
		IXDR_PUT_HYPER(ptr, objp->owner.clientid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
		IXDR_PUT_U_INT32(ptr, objp->owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
		/* We know this is very short so don't bcopy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
		ip = (int32_t *)objp->owner.owner_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
		len /= BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
		for (i = 0; i < len; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
			*ptr++ = *ip++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
		/* xdr_openflag4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
		IXDR_PUT_U_INT32(ptr, objp->opentype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
		op = OP_OPEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
		if (!XDR_PUTINT32(xdrs, (int32_t *)&op))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->share_access))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2899
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->share_deny))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2901
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
		/* xdr_open_owner4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2903
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
				(u_longlong_t *)&objp->owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->owner.owner_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
		if (!xdr_opaque(xdrs, objp->owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
				objp->owner.owner_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2912
		/* xdr_openflag4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->opentype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
	if (objp->opentype == OPEN4_CREATE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
		/* xdr_createhow4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->mode))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
		switch (objp->mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
		case UNCHECKED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
		case GUARDED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
			if (!xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
				    &objp->createhow4_u.createattrs))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
		case EXCLUSIVE4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
			    (u_longlong_t *)&objp->createhow4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2931
			    createverf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2932
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2933
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2934
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2935
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2936
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2937
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2938
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2939
	/* xdr_open_claim4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2940
	if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->claim))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2941
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2942
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2943
	switch (objp->claim) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2944
	case CLAIM_NULL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2945
		len = strlen(objp->open_claim4_u.cfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2946
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2947
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2948
		if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2949
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2950
				objp->open_claim4_u.cfile, len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2951
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2952
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2953
	case CLAIM_PREVIOUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2954
		return (XDR_PUTINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2955
			(int32_t *)&objp->open_claim4_u.delegate_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2956
	case CLAIM_DELEGATE_CUR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2957
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2958
				delegate_cur_info.delegate_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2959
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2960
		if (!xdr_opaque(xdrs, objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2961
				delegate_cur_info.delegate_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2962
				12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2963
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2964
		len = strlen(objp->open_claim4_u.delegate_cur_info.cfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2965
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2966
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2967
		if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2968
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2969
				objp->open_claim4_u.delegate_cur_info.cfile,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2970
				len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2971
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2972
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2973
	case CLAIM_DELEGATE_PREV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2974
		len = strlen(objp->open_claim4_u.cfile_delegate_prev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2975
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2976
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2977
		if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2978
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2979
				objp->open_claim4_u.cfile_delegate_prev, len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2980
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2981
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2982
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2983
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2984
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2985
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2986
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2987
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2988
xdr_OPEN4res(XDR *xdrs, OPEN4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2989
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2990
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2991
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2992
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2993
		if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2994
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2995
		if (!xdr_u_int(xdrs, &objp->stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2996
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2997
		if (!xdr_opaque(xdrs, objp->stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2998
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2999
		if (!xdr_bool(xdrs, &objp->cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3000
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3001
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3002
				(u_longlong_t *)&objp->cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3003
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3004
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.after))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3005
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3006
		if (!xdr_u_int(xdrs, &objp->rflags))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3007
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3008
		if (!xdr_bitmap4(xdrs, &objp->attrset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3009
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3010
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3011
			    (int *)&objp->delegation.delegation_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3012
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3013
		switch (objp->delegation.delegation_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3014
		case OPEN_DELEGATE_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3015
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3016
		case OPEN_DELEGATE_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3017
			if (!xdr_u_int(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3018
					open_delegation4_u.read.stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3019
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3020
			if (!xdr_opaque(xdrs, objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3021
					open_delegation4_u.read.stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3022
					12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3023
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3024
			if (!xdr_bool(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3025
					open_delegation4_u.read.recall))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3026
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3027
			return (xdr_nfsace4(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3028
					open_delegation4_u.read.permissions));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3029
		case OPEN_DELEGATE_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3030
			if (!xdr_u_int(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3031
					open_delegation4_u.write.stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3032
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3033
			if (!xdr_opaque(xdrs, objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3034
					open_delegation4_u.write.stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3035
					12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3036
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3037
			if (!xdr_bool(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3038
					open_delegation4_u.write.recall))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3039
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3040
			if (!xdr_int(xdrs, (int *)&objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3041
					open_delegation4_u.write.space_limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3042
					limitby))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3043
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3044
			switch (objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3045
					open_delegation4_u.write.space_limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3046
					limitby) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3047
			case NFS_LIMIT_SIZE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3048
				if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3049
				    (u_longlong_t *)&objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3050
				    open_delegation4_u.write.space_limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3051
				    nfs_space_limit4_u.filesize))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3052
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3053
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3054
			case NFS_LIMIT_BLOCKS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3055
				if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3056
				    &objp->delegation.open_delegation4_u.write.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3057
				    space_limit.nfs_space_limit4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3058
				    mod_blocks.num_blocks))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3059
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3060
				if (!xdr_u_int(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3061
				    open_delegation4_u.write.space_limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3062
				    nfs_space_limit4_u.mod_blocks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3063
				    bytes_per_block))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3064
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3065
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3066
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3067
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3068
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3069
			return (xdr_nfsace4(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3070
			    open_delegation4_u.write.permissions));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3071
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3072
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3073
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3074
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3075
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3076
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3077
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3078
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3079
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3080
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3081
	switch (objp->delegation.delegation_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3082
	case OPEN_DELEGATE_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3083
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3084
	case OPEN_DELEGATE_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3085
		return (xdr_nfsace4(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3086
					open_delegation4_u.read.permissions));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3087
	case OPEN_DELEGATE_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3088
		switch (objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3089
				open_delegation4_u.write.space_limit.limitby) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3090
		case NFS_LIMIT_SIZE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3091
		case NFS_LIMIT_BLOCKS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3092
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3093
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3094
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3095
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3096
		return (xdr_nfsace4(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3097
				open_delegation4_u.write.permissions));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3098
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3099
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3100
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3102
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3103
xdr_OPEN_CONFIRM4res(XDR *xdrs, OPEN_CONFIRM4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3104
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3105
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3106
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3107
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3108
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3109
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3110
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3111
	return (xdr_opaque(xdrs, objp->open_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3112
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3114
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3115
xdr_OPEN_DOWNGRADE4args(XDR *xdrs, OPEN_DOWNGRADE4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3116
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3117
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3118
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3119
	if (!xdr_opaque(xdrs, objp->open_stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3120
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3121
	if (!xdr_u_int(xdrs, &objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3122
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3123
	if (!xdr_u_int(xdrs, &objp->share_access))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3124
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3125
	return (xdr_u_int(xdrs, &objp->share_deny));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3126
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3128
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3129
xdr_OPEN_DOWNGRADE4res(XDR *xdrs, OPEN_DOWNGRADE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3130
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3131
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3132
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3133
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3134
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3135
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3136
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3137
	return (xdr_opaque(xdrs, objp->open_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3138
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3139
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3140
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3141
xdr_READ4args(XDR *xdrs, READ4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3142
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3143
	if (!xdr_u_int(xdrs, &objp->stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3144
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3145
	if (!xdr_opaque(xdrs, objp->stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3146
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3147
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3148
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3149
	return (xdr_u_int(xdrs, &objp->count));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3150
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3152
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3153
xdr_READ4res(XDR *xdrs, READ4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3154
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3155
	int i, rndup;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3156
	mblk_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3158
	if (xdrs->x_op == XDR_DECODE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3159
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3161
	if (xdrs->x_op == XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3162
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3163
		 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3164
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3165
		if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3166
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3167
		if (objp->data_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3168
			kmem_free(objp->data_val, objp->data_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3169
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3170
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3172
	/* on with ENCODE paths */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3173
	if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3174
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3175
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3176
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3177
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3178
	if (!XDR_PUTINT32(xdrs, &objp->eof))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3179
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3180
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3181
	mp = objp->mblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3182
	if (mp != NULL && xdrs->x_ops == &xdrmblk_ops) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3183
		mp->b_wptr += objp->data_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3184
		rndup = BYTES_PER_XDR_UNIT -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3185
			(objp->data_len % BYTES_PER_XDR_UNIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3186
		if (rndup != BYTES_PER_XDR_UNIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3187
			for (i = 0; i < rndup; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3188
				*mp->b_wptr++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3189
		if (xdrmblk_putmblk(xdrs, mp, objp->data_len) == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3190
			objp->mblk = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3191
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3192
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3193
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3194
	return (xdr_bytes(xdrs, (char **)&objp->data_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3195
			(uint_t *)&objp->data_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3196
			objp->data_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3197
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3199
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3200
xdr_READ4res_clnt(XDR *xdrs, READ4res *objp, READ4args *aobjp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3201
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3202
	mblk_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3203
	size_t n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3204
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3205
	uint_t size = aobjp->res_maxsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3207
	if (xdrs->x_op == XDR_ENCODE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3208
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3209
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3210
	if (xdrs->x_op == XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3211
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3212
		 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3213
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3214
		if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3215
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3216
		if (objp->data_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3217
			kmem_free(objp->data_val, objp->data_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3218
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3219
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3221
	if (!XDR_GETINT32(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3222
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3223
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3224
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3226
	if (!XDR_GETINT32(xdrs, &objp->eof))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3227
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3230
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3231
	 * This is a special case such that the caller is providing a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3232
	 * uio as a guide to eventual data location; this is used for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3233
	 * handling DIRECTIO reads.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3234
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3235
	if (aobjp->res_uiop != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3236
		struct uio *uiop = aobjp->res_uiop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3237
		int32_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3238
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3239
		if (xdrs->x_ops == &xdrmblk_ops) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3240
			if (!xdrmblk_getmblk(xdrs, &mp, &objp->data_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3241
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3243
			if (objp->data_len == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3244
				return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3246
			if (objp->data_len > size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3247
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3248
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3249
			size = objp->data_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3250
			do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3251
				n = MIN(size, mp->b_wptr - mp->b_rptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3252
				if ((n = MIN(uiop->uio_resid, n)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3254
					error =	uiomove((char *)mp->b_rptr, n,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3255
							UIO_READ, uiop);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3256
					if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3257
						return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3258
					mp->b_rptr += n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3259
					size -= n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3260
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3262
				while (mp && (mp->b_rptr >= mp->b_wptr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3263
					mp = mp->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3264
			} while (mp && size > 0 && uiop->uio_resid > 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3266
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3267
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3269
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3270
		 * This isn't an xdrmblk stream.   Handle the likely
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3271
		 * case that it can be inlined (ex. xdrmem).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3272
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3273
		if (!XDR_GETINT32(xdrs, (int32_t *)&objp->data_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3274
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3276
		if (objp->data_len == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3277
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3279
		if (objp->data_len > size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3280
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3281
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3282
		size = (int)objp->data_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3283
		if ((ptr = XDR_INLINE(xdrs, size)) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3284
			return (uiomove(ptr, size, UIO_READ, uiop) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3285
				FALSE : TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3287
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3288
		 * Handle some other (unlikely) stream type that will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3289
		 * need a copy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3290
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3291
		if ((ptr = kmem_alloc(size, KM_NOSLEEP)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3292
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3293
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3294
		if (!XDR_GETBYTES(xdrs, (caddr_t)ptr, size)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3295
			kmem_free(ptr, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3296
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3297
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3298
		error = uiomove(ptr, size, UIO_READ, uiop);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3299
		kmem_free(ptr, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3300
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3301
		return (error ? FALSE : TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3302
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3304
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3305
	 * Check for the other special case of the caller providing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3306
	 * the target area for the data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3307
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3308
	if (aobjp->res_data_val_alt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3309
		return (xdr_bytes(xdrs, (char **)&aobjp->res_data_val_alt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3310
				(uint_t *)&objp->data_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3311
				aobjp->res_maxsize));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3313
	/* caller didn't set things up right if we got this far */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3314
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3315
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3317
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3318
xdr_READDIR4args(XDR *xdrs, READDIR4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3319
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3320
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cookie))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3321
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3322
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cookieverf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3323
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3324
	if (!xdr_u_int(xdrs, &objp->dircount))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3325
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3326
	if (!xdr_u_int(xdrs, &objp->maxcount))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3327
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3328
	return (xdr_bitmap4(xdrs, &objp->attr_request));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3329
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3331
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3332
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3333
xdrmblk_putmblk_rd(XDR *xdrs, mblk_t *m)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3334
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3335
	if (((m->b_wptr - m->b_rptr) % BYTES_PER_XDR_UNIT) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3336
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3338
	/* LINTED pointer alignment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3339
	((mblk_t *)xdrs->x_base)->b_cont = m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3340
	xdrs->x_base = (caddr_t)m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3341
	xdrs->x_handy = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3342
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3343
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3345
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3346
xdr_READDIR4res(XDR *xdrs, READDIR4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3347
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3348
	mblk_t *mp = objp->mblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3349
	bool_t ret_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3350
	uint_t flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3352
	ASSERT(xdrs->x_op == XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3354
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3355
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3356
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3357
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3358
	if (mp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3359
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3361
	if (xdrs->x_ops == &xdrmblk_ops) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3362
		if (xdrmblk_putmblk_rd(xdrs, mp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3363
				    == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3364
			/* mblk successfully inserted into outgoing chain */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3365
			objp->mblk = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3366
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3367
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3368
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3370
	ASSERT(mp->b_cont == NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3371
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3372
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3373
	 * If running over RDMA, the pre-encoded m_blk needs to be moved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3374
	 * without being chunked.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3375
	 * Check if chunking is disabled for this xdr stream. If not disable
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3376
	 * it for this op and then enable it back on.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3377
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3378
	XDR_CONTROL(xdrs, XDR_RDMAGET, &flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3379
	if (flags & RDMA_NOCHUNK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3380
		return (xdr_opaque(xdrs, (char *)mp->b_rptr, objp->data_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3382
	flags |= RDMA_NOCHUNK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3383
	(void) XDR_CONTROL(xdrs, XDR_RDMASET, &flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3384
	ret_val = xdr_opaque(xdrs, (char *)mp->b_rptr, objp->data_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3385
	flags &= ~RDMA_NOCHUNK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3386
	(void) XDR_CONTROL(xdrs, XDR_RDMASET, &flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3387
	return (ret_val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3388
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3390
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3391
xdr_READLINK4res(XDR *xdrs, READLINK4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3392
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3393
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3394
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3395
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3396
		if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3397
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3398
		return (xdr_bytes(xdrs, (char **)&objp->link.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3399
			(uint_t *)&objp->link.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3400
			NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3401
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3403
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3404
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3405
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3406
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3407
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3408
	if (objp->link.utf8string_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3409
		kmem_free(objp->link.utf8string_val, objp->link.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3410
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3411
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3413
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3414
xdr_REMOVE4res(XDR *xdrs, REMOVE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3415
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3416
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3417
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3418
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3419
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3420
	if (!xdr_bool(xdrs, &objp->cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3421
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3422
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3423
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3424
	return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3425
		(u_longlong_t *)&objp->cinfo.after));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3426
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3428
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3429
xdr_RENAME4res(XDR *xdrs, RENAME4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3430
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3431
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3432
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3433
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3434
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3435
	if (!xdr_bool(xdrs, &objp->source_cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3436
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3437
	if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3438
	    (u_longlong_t *)&objp->source_cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3439
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3440
	if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3441
	    (u_longlong_t *)&objp->source_cinfo.after))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3442
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3443
	if (!xdr_bool(xdrs, &objp->target_cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3444
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3445
	if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3446
	    (u_longlong_t *)&objp->target_cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3447
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3448
	return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3449
		(u_longlong_t *)&objp->target_cinfo.after));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3450
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3452
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3453
xdr_secinfo4(XDR *xdrs, secinfo4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3454
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3455
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3456
		if (!xdr_u_int(xdrs, &objp->flavor))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3457
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3458
		if (objp->flavor != RPCSEC_GSS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3459
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3460
		if (!xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3461
			    (char **)&objp->flavor_info.oid.sec_oid4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3462
			    (uint_t *)&objp->flavor_info.oid.sec_oid4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3463
			    NFS4_MAX_SECOID4))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3464
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3465
		if (!xdr_u_int(xdrs, &objp->flavor_info.qop))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3466
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3467
		return (xdr_int(xdrs, (int *)&objp->flavor_info.service));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3468
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3470
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3471
	 * Optimized free path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3472
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3473
	if (objp->flavor != RPCSEC_GSS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3474
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3476
	if (objp->flavor_info.oid.sec_oid4_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3477
		kmem_free(objp->flavor_info.oid.sec_oid4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3478
			objp->flavor_info.oid.sec_oid4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3479
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3480
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3482
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3483
xdr_SETCLIENTID4args(XDR *xdrs, SETCLIENTID4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3484
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3485
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3486
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3487
					(u_longlong_t *)&objp->client.verifier))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3488
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3489
		if (!xdr_bytes(xdrs, (char **)&objp->client.id_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3490
			    (uint_t *)&objp->client.id_len, NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3491
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3492
		if (!xdr_u_int(xdrs, &objp->callback.cb_program))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3493
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3494
		if (!xdr_string(xdrs, &objp->callback.cb_location.r_netid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3495
						NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3496
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3497
		if (!xdr_string(xdrs, &objp->callback.cb_location.r_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3498
						NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3499
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3500
		return (xdr_u_int(xdrs, &objp->callback_ident));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3501
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3503
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3504
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3505
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3506
	if (objp->client.id_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3507
		kmem_free(objp->client.id_val, objp->client.id_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3508
	(void) xdr_string(xdrs, &objp->callback.cb_location.r_netid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3509
							NFS4_OPAQUE_LIMIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3510
	return (xdr_string(xdrs, &objp->callback.cb_location.r_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3511
							NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3512
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3514
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3515
xdr_SETCLIENTID4res(XDR *xdrs, SETCLIENTID4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3516
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3517
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3518
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3519
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3520
		switch (objp->status) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3521
		case NFS4_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3522
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3523
			    (u_longlong_t *)&objp->SETCLIENTID4res_u.resok4.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3524
			    clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3525
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3526
			return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3527
			    (u_longlong_t *)&objp->SETCLIENTID4res_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3528
						resok4.setclientid_confirm));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3529
		case NFS4ERR_CLID_INUSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3530
			if (!xdr_string(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3531
				    &objp->SETCLIENTID4res_u.client_using.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3532
				    r_netid, NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3533
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3534
			return (xdr_string(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3535
				    &objp->SETCLIENTID4res_u.client_using.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3536
				    r_addr, NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3537
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3538
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3539
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3541
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3542
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3543
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3544
	if (objp->status != NFS4ERR_CLID_INUSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3545
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3546
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3547
	if (!xdr_string(xdrs, &objp->SETCLIENTID4res_u.client_using.r_netid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3548
							NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3549
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3550
	return (xdr_string(xdrs, &objp->SETCLIENTID4res_u.client_using.r_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3551
							NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3552
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3554
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3555
xdr_WRITE4args(XDR *xdrs, WRITE4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3556
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3557
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3558
		if (!xdr_u_int(xdrs, &objp->stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3559
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3560
		if (!xdr_opaque(xdrs, objp->stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3561
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3562
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3563
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3564
		if (!xdr_int(xdrs, (int *)&objp->stable))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3565
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3566
		if (xdrs->x_op == XDR_DECODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3567
			if (xdrs->x_ops == &xdrmblk_ops) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3568
				objp->data_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3569
				return (xdrmblk_getmblk(xdrs, &objp->mblk,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3570
							&objp->data_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3571
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3572
			/* Else fall thru for the xdr_bytes(). */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3573
			objp->mblk = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3574
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3575
		return (xdr_bytes(xdrs, (char **)&objp->data_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3576
				(uint_t *)&objp->data_len, NFS4_DATA_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3577
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3578
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3579
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3580
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3581
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3582
	if (objp->data_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3583
		kmem_free(objp->data_val, objp->data_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3584
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3585
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3587
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3588
xdr_WRITE4res(XDR *xdrs, WRITE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3589
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3590
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3591
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3592
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3593
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3594
	if (!xdr_u_int(xdrs, &objp->count))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3595
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3596
	if (!xdr_int(xdrs, (int *)&objp->committed))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3597
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3598
	return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3599
			(u_longlong_t *)&objp->writeverf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3600
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3602
static bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3603
xdr_snfs_argop4_free(XDR *xdrs, nfs_argop4 **arrayp, int len)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3604
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3605
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3606
	nfs_argop4 *array = *arrayp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3607
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3608
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3609
	 * Optimized XDR_FREE only args array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3610
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3611
	ASSERT(xdrs->x_op == XDR_FREE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3612
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3613
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3614
	 * Nothing to do?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3615
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3616
	if (array == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3617
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3618
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3619
	for (i = 0; i < len; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3620
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3621
		 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3622
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3623
		switch (array[i].argop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3624
		case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3625
			if (array[i].nfs_argop4_u.opputfh.object.nfs_fh4_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3626
								NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3627
				kmem_free(array[i].nfs_argop4_u.opputfh.object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3628
								nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3629
					array[i].nfs_argop4_u.opputfh.object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3630
								nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3631
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3632
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3633
		case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3634
		case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3635
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3636
		case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3637
			if (array[i].nfs_argop4_u.oplookup.objname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3638
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3639
				kmem_free(array[i].nfs_argop4_u.oplookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3640
						objname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3641
					array[i].nfs_argop4_u.oplookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3642
						objname.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3643
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3644
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3645
		case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3646
			(void) xdr_OPEN4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3647
						&array[i].nfs_argop4_u.opopen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3648
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3649
		case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3650
		case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3651
		case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3652
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3653
		case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3654
			(void) xdr_WRITE4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3655
						&array[i].nfs_argop4_u.opwrite);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3656
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3657
		case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3658
		case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3659
		case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3660
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3661
		case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3662
			if (array[i].nfs_argop4_u.opremove.target.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3663
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3664
				kmem_free(array[i].nfs_argop4_u.opremove.target.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3665
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3666
					array[i].nfs_argop4_u.opremove.target.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3667
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3668
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3669
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3670
		case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3671
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3672
		case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3673
			(void) xdr_CREATE4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3674
					&array[i].nfs_argop4_u.opcreate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3675
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3676
		case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3677
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3678
		case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3679
			if (array[i].nfs_argop4_u.oplink.newname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3680
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3681
				kmem_free(array[i].nfs_argop4_u.oplink.newname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3682
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3683
					array[i].nfs_argop4_u.oplink.newname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3684
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3685
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3686
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3687
		case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3688
			(void) xdr_LOCK4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3689
						&array[i].nfs_argop4_u.oplock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3690
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3691
		case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3692
			(void) xdr_LOCKT4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3693
						&array[i].nfs_argop4_u.oplockt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3694
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3695
		case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3696
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3697
		case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3698
			(void) xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3699
			    &array[i].nfs_argop4_u.opnverify.obj_attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3700
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3701
		case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3702
		case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3703
		case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3704
		case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3705
		case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3706
		case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3707
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3708
		case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3709
			if (array[i].nfs_argop4_u.oprename.oldname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3710
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3711
				kmem_free(array[i].nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3712
						oldname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3713
					array[i].nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3714
						oldname.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3715
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3716
			if (array[i].nfs_argop4_u.oprename.newname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3717
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3718
				kmem_free(array[i].nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3719
						newname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3720
					array[i].nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3721
						newname.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3722
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3723
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3724
		case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3725
		case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3726
		case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3727
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3728
		case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3729
			if (array[i].nfs_argop4_u.opsecinfo.name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3730
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3731
				kmem_free(array[i].nfs_argop4_u.opsecinfo.name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3732
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3733
					array[i].nfs_argop4_u.opsecinfo.name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3734
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3735
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3736
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3737
		case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3738
			(void) xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3739
			    &array[i].nfs_argop4_u.opsetattr.obj_attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3740
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3741
		case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3742
			(void) xdr_SETCLIENTID4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3743
					&array[i].nfs_argop4_u.opsetclientid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3744
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3745
		case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3746
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3747
		case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3748
			(void) xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3749
				&array[i].nfs_argop4_u.opverify.obj_attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3750
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3751
		case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3752
			if (array[i].nfs_argop4_u.oprelease_lockowner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3753
						lock_owner.owner_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3754
				kmem_free(array[i].nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3755
				    oprelease_lockowner.lock_owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3756
					array[i].nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3757
				    oprelease_lockowner.lock_owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3758
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3759
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3760
		case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3761
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3762
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3763
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3764
			 * An invalid op is a coding error, it should never
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3765
			 * have been decoded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3766
			 * Don't error because the caller cannot finish
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3767
			 * freeing the residual memory of the array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3768
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3769
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3770
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3771
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3773
	kmem_free(*arrayp, len * sizeof (nfs_argop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3774
	*arrayp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3775
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3776
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3777
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3778
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3779
xdr_nfs_argop4(XDR *xdrs, nfs_argop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3780
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3781
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3782
	 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3783
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3784
	switch (objp->argop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3785
	case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3786
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3787
		    (char **)&objp->nfs_argop4_u.opputfh.object.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3788
		    (uint_t *)&objp->nfs_argop4_u.opputfh.object.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3789
		    NFS4_FHSIZE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3790
	case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3791
		return (xdr_bitmap4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3792
				&objp->nfs_argop4_u.opgetattr.attr_request));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3793
	case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3794
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3795
	case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3796
		return (xdr_bytes(xdrs, (char **)&objp->nfs_argop4_u.oplookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3797
				objname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3798
			(uint_t *)&objp->nfs_argop4_u.oplookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3799
				objname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3800
			NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3801
	case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3802
		return (xdr_OPEN4args(xdrs, &objp->nfs_argop4_u.opopen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3803
	case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3804
		return (xdr_CLOSE4args(xdrs, &objp->nfs_argop4_u.opclose));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3805
	case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3806
		return (xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3807
				&objp->nfs_argop4_u.opaccess.access));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3808
	case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3809
		return (xdr_READ4args(xdrs, &objp->nfs_argop4_u.opread));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3810
	case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3811
		return (xdr_WRITE4args(xdrs, &objp->nfs_argop4_u.opwrite));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3812
	case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3813
		if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3814
		    &objp->nfs_argop4_u.opdelegreturn.deleg_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3815
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3816
		return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3817
		    objp->nfs_argop4_u.opdelegreturn.deleg_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3818
	case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3819
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3820
	case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3821
		return (xdr_READDIR4args(xdrs, &objp->nfs_argop4_u.opreaddir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3822
	case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3823
		return (xdr_bytes(xdrs, (char **)&objp->nfs_argop4_u.opremove.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3824
				target.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3825
			(uint_t *)&objp->nfs_argop4_u.opremove.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3826
				target.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3827
			NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3828
	case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3829
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3830
		    (u_longlong_t *)&objp->nfs_argop4_u.opcommit.offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3831
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3832
		return (xdr_u_int(xdrs, &objp->nfs_argop4_u.opcommit.count));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3833
	case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3834
		return (xdr_CREATE4args(xdrs, &objp->nfs_argop4_u.opcreate));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3835
	case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3836
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3837
		    (u_longlong_t *)&objp->nfs_argop4_u.opdelegpurge.clientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3838
	case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3839
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3840
		    (char **)&objp->nfs_argop4_u.oplink.newname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3841
		    (uint_t *)&objp->nfs_argop4_u.oplink.newname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3842
		    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3843
	case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3844
		return (xdr_LOCK4args(xdrs, &objp->nfs_argop4_u.oplock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3845
	case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3846
		return (xdr_LOCKT4args(xdrs, &objp->nfs_argop4_u.oplockt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3847
	case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3848
		return (xdr_LOCKU4args(xdrs, &objp->nfs_argop4_u.oplocku));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3849
	case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3850
		return (xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3851
				&objp->nfs_argop4_u.opnverify.obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3852
	case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3853
		return (xdr_bool(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3854
				&objp->nfs_argop4_u.opopenattr.createdir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3855
	case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3856
		if (!xdr_u_int(xdrs, &objp->nfs_argop4_u.opopen_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3857
						open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3858
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3859
		if (!xdr_opaque(xdrs, objp->nfs_argop4_u.opopen_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3860
						open_stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3861
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3862
		return (xdr_u_int(xdrs, &objp->nfs_argop4_u.opopen_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3863
						seqid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3864
	case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3865
		return (xdr_OPEN_DOWNGRADE4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3866
				&objp->nfs_argop4_u.opopen_downgrade));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3867
	case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3868
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3869
	case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3870
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3871
	case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3872
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3873
	case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3874
		if (!xdr_bytes(xdrs, (char **)&objp->nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3875
						oldname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3876
			    (uint_t *)&objp->nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3877
						oldname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3878
			    NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3879
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3880
		return (xdr_bytes(xdrs, (char **)&objp->nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3881
						newname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3882
			    (uint_t *)&objp->nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3883
						newname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3884
			    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3885
	case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3886
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3887
			(u_longlong_t *)&objp->nfs_argop4_u.oprenew.clientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3888
	case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3889
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3890
	case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3891
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3892
	case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3893
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3894
		    (char **)&objp->nfs_argop4_u.opsecinfo.name.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3895
		    (uint_t *)&objp->nfs_argop4_u.opsecinfo.name.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3896
		    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3897
	case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3898
		if (!xdr_u_int(xdrs, &objp->nfs_argop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3899
						stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3900
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3901
		if (!xdr_opaque(xdrs, objp->nfs_argop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3902
						stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3903
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3904
		return (xdr_fattr4(xdrs, &objp->nfs_argop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3905
						obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3906
	case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3907
		return (xdr_SETCLIENTID4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3908
				&objp->nfs_argop4_u.opsetclientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3909
	case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3910
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3911
				opsetclientid_confirm.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3912
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3913
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3914
				(u_longlong_t *)&objp->nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3915
				opsetclientid_confirm.setclientid_confirm));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3916
	case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3917
		return (xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3918
				&objp->nfs_argop4_u.opverify.obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3919
	case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3920
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3921
			    (u_longlong_t *)&objp->nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3922
				oprelease_lockowner.lock_owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3923
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3924
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3925
			(char **)&objp->nfs_argop4_u.oprelease_lockowner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3926
				lock_owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3927
			(uint_t *)&objp->nfs_argop4_u.oprelease_lockowner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3928
				lock_owner.owner_len, NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3929
	case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3930
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3931
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3932
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3933
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3934
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3935
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3936
xdr_cnfs_argop4_wrap(XDR *xdrs, nfs_argop4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3937
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3938
	if (!xdr_int(xdrs, (int *)&objp->argop))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3939
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3940
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3941
	return (xdr_nfs_argop4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3942
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3943
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3944
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3945
xdr_snfs_argop4(XDR *xdrs, nfs_argop4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3946
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3947
	if (!xdr_int(xdrs, (int *)&objp->argop))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3948
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3949
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3950
	switch (objp->argop) {
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3951
	case OP_PUTFH:
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3952
		return (xdr_decode_nfs_fh4(xdrs,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3953
			&objp->nfs_argop4_u.opputfh.object));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3954
	default:
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3955
		return (xdr_nfs_argop4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3956
	}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3957
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3958
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3959
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3960
 * Client side encode only arg op processing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3961
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3962
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3963
xdr_cnfs_argop4(XDR *xdrs, nfs_argop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3964
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3965
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3966
	int op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3967
	nfs4_sharedfh_t *sfh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3968
	mntinfo4_t *mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3969
	rpc_inline_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3970
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3971
	ASSERT(xdrs->x_op == XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3972
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3973
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3974
	 * Special case the private pseudo ops
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3975
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3976
	if (!(objp->argop & SUNW_PRIVATE_OP))
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3977
		return (xdr_cnfs_argop4_wrap(xdrs, objp));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3979
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3980
	 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3981
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3982
	switch (objp->argop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3983
	case OP_CPUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3984
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3985
		 * We are passed in the file handle as a nfs4_sharedfh_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3986
		 * We need to acquire the correct locks so we can copy it out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3987
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3988
		sfh = (nfs4_sharedfh_t *)objp->nfs_argop4_u.opcputfh.sfh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3989
		mi = sfh->sfh_mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3990
		(void) nfs_rw_enter_sig(&mi->mi_fh_lock, RW_READER, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3991
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3992
		len = sfh->sfh_fh.nfs_fh4_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3993
		ASSERT(len <= NFS4_FHSIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3994
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3995
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3996
		 * First try and inline the copy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3997
		 * Must first be a multiple of BYTES_PER_XDR_UNIT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3998
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3999
		if (!(len % BYTES_PER_XDR_UNIT) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4000
		    (ptr = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT + len)) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4001
									NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4002
			IXDR_PUT_U_INT32(ptr, OP_PUTFH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4003
			IXDR_PUT_U_INT32(ptr, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4004
			bcopy(sfh->sfh_fh.nfs_fh4_val, ptr, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4005
			nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4006
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4007
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4008
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4009
		op = OP_PUTFH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4010
		if (!XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4011
			nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4012
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4013
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4014
		if (!XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4015
			nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4016
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4017
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4018
		if (!(len % BYTES_PER_XDR_UNIT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4019
			if (XDR_PUTBYTES(xdrs, sfh->sfh_fh.nfs_fh4_val, len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4020
				nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4021
				return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4022
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4023
		} else if (xdr_opaque(xdrs, sfh->sfh_fh.nfs_fh4_val, len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4024
			nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4025
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4026
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4027
		nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4028
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4029
	case OP_CLOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4030
		len = strlen(objp->nfs_argop4_u.opclookup.cname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4031
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4032
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4033
		op = OP_LOOKUP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4034
		if (XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4035
			if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4036
				return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4037
					objp->nfs_argop4_u.opclookup.cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4038
					len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4039
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4040
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4041
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4042
	case OP_COPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4043
		/* op processing inlined in xdr_OPEN4cargs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4044
		return (xdr_OPEN4cargs(xdrs, &objp->nfs_argop4_u.opcopen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4045
	case OP_CREMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4046
		len = strlen(objp->nfs_argop4_u.opcremove.ctarget);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4047
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4048
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4049
		op = OP_REMOVE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4050
		if (XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4051
			if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4052
				return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4053
					objp->nfs_argop4_u.opcremove.ctarget,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4054
					len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4055
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4056
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4057
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4058
	case OP_CCREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4059
		op = OP_CREATE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4060
		if (!XDR_PUTINT32(xdrs, &op))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4061
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4062
		return (xdr_CREATE4cargs(xdrs, &objp->nfs_argop4_u.opccreate));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4063
	case OP_CLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4064
		len = strlen(objp->nfs_argop4_u.opclink.cnewname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4065
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4066
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4067
		op = OP_LINK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4068
		if (XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4069
			if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4070
				return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4071
					objp->nfs_argop4_u.opclink.cnewname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4072
					len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4073
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4074
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4075
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4076
	case OP_CRENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4077
		len = strlen(objp->nfs_argop4_u.opcrename.coldname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4078
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4079
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4080
		op = OP_RENAME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4081
		if (!XDR_PUTINT32(xdrs, &op))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4082
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4083
		if (!XDR_PUTINT32(xdrs, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4084
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4085
		if (!xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4086
				objp->nfs_argop4_u.opcrename.coldname, len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4087
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4088
		len = strlen(objp->nfs_argop4_u.opcrename.cnewname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4089
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4090
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4091
		if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4092
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4093
				objp->nfs_argop4_u.opcrename.cnewname, len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4094
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4095
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4096
	case OP_CSECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4097
		len = strlen(objp->nfs_argop4_u.opcsecinfo.cname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4098
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4099
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4100
		op = OP_SECINFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4101
		if (XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4102
			if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4103
				return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4104
					objp->nfs_argop4_u.opcsecinfo.cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4105
					len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4106
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4107
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4108
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4109
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4110
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4111
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4113
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4114
 * Note that the len and decode_len will only be different in the case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4115
 * of the client's use of this free function.  If the server is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4116
 * freeing results, then the len/decode_len will always match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4117
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4118
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4119
xdr_nfs_resop4_free(XDR *xdrs, nfs_resop4 **arrayp, int len, int decode_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4120
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4121
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4122
	nfs_resop4 *array = *arrayp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4124
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4125
	 * Optimized XDR_FREE only results array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4126
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4127
	ASSERT(xdrs->x_op == XDR_FREE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4129
	if (array == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4130
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4132
	for (i = 0; i < decode_len; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4133
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4134
		 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4135
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4136
		switch (array[i].resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4137
		case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4138
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4139
		case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4140
			if (array[i].nfs_resop4_u.opgetattr.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4141
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4142
			if (array[i].nfs_resop4_u.opgetattr.ga_res.n4g_ext_res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4143
				kmem_free(array[i].nfs_resop4_u.opgetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4144
					ga_res.n4g_ext_res,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4145
					sizeof (struct nfs4_ga_ext_res));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4146
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4147
		case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4148
			if (array[i].nfs_resop4_u.opgetfh.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4149
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4150
			if (array[i].nfs_resop4_u.opgetfh.object.nfs_fh4_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4151
							NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4152
				kmem_free(array[i].nfs_resop4_u.opgetfh.object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4153
							nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4154
					array[i].nfs_resop4_u.opgetfh.object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4155
							nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4156
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4157
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4158
		case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4159
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4160
		case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4161
			(void) xdr_OPEN4res(xdrs, &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4162
								opopen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4163
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4164
		case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4165
		case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4166
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4167
		case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4168
			(void) xdr_READ4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4169
					    &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4170
								opread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4171
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4172
		case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4173
		case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4174
		case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4175
		case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4176
		case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4177
		case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4178
		case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4179
		case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4180
		case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4181
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4182
		case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4183
			(void) xdr_LOCK4res(xdrs, &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4184
								oplock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4185
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4186
		case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4187
			(void) xdr_LOCKT4res(xdrs, &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4188
								oplockt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4189
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4190
		case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4191
		case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4192
		case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4193
		case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4194
		case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4195
		case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4196
		case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4197
		case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4198
		case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4199
		case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4200
		case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4201
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4202
		case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4203
			(void) xdr_READLINK4res(xdrs, &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4204
								opreadlink);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4205
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4206
		case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4207
			(void) xdr_array(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4208
				(char **)&array[i].nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4209
					SECINFO4resok_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4210
				(uint_t *)&array[i].nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4211
					SECINFO4resok_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4212
				NFS4_SECINFO_LIMIT, sizeof (secinfo4),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4213
				(xdrproc_t)xdr_secinfo4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4214
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4215
		case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4216
			(void) xdr_SETCLIENTID4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4217
					&array[i].nfs_resop4_u.opsetclientid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4218
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4219
		case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4220
		case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4221
		case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4222
		case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4223
		case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4224
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4225
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4226
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4227
			 * An invalid op is a coding error, it should never
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4228
			 * have been decoded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4229
			 * Don't error because the caller cannot finish
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4230
			 * freeing the residual memory of the array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4231
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4232
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4233
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4234
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4236
	kmem_free(*arrayp, len * sizeof (nfs_resop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4237
	*arrayp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4238
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4239
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4240
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4241
static bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4242
xdr_snfs_resop4_free(XDR *xdrs, nfs_resop4 **arrayp, int len, int decode_len)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4243
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4244
	return (xdr_nfs_resop4_free(xdrs, arrayp, len, decode_len));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4245
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4246
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4247
static bool_t
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4248
xdr_nfs_resop4(XDR *xdrs, nfs_resop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4249
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4250
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4251
	 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4252
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4253
	switch (objp->resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4254
	case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4255
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4256
				(int32_t *)&objp->nfs_resop4_u.opputfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4257
	case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4258
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4259
			    (int32_t *)&objp->nfs_resop4_u.opgetattr.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4260
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4261
		if (objp->nfs_resop4_u.opgetattr.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4262
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4263
		return (xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4264
			    &objp->nfs_resop4_u.opgetattr.obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4265
	case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4266
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4267
				(int32_t *)&objp->nfs_resop4_u.opgetfh.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4268
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4269
		if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4270
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4271
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4272
		    (char **)&objp->nfs_resop4_u.opgetfh.object.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4273
		    (uint_t *)&objp->nfs_resop4_u.opgetfh.object.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4274
		    NFS4_FHSIZE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4275
	case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4276
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4277
			(int32_t *)&objp->nfs_resop4_u.oplookup.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4278
	case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4279
		return (xdr_OPEN4res(xdrs, &objp->nfs_resop4_u.opopen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4280
	case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4281
		return (xdr_CLOSE4res(xdrs, &objp->nfs_resop4_u.opclose));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4282
	case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4283
		return (xdr_ACCESS4res(xdrs, &objp->nfs_resop4_u.opaccess));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4284
	case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4285
		return (xdr_READ4res(xdrs, &objp->nfs_resop4_u.opread));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4286
	case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4287
		return (xdr_WRITE4res(xdrs, &objp->nfs_resop4_u.opwrite));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4288
	case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4289
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4290
			(int32_t *)&objp->nfs_resop4_u.opdelegreturn.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4291
	case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4292
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4293
			(int32_t *)&objp->nfs_resop4_u.oplookupp.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4294
	case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4295
		return (xdr_READDIR4res(xdrs, &objp->nfs_resop4_u.opreaddir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4296
	case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4297
		return (xdr_REMOVE4res(xdrs, &objp->nfs_resop4_u.opremove));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4299
	case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4300
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4301
			    (int32_t *)&objp->nfs_resop4_u.opcommit.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4302
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4303
		if (objp->nfs_resop4_u.opcommit.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4304
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4305
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4306
				(u_longlong_t *)&objp->nfs_resop4_u.opcommit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4307
						writeverf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4308
	case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4309
		return (xdr_CREATE4res(xdrs, &objp->nfs_resop4_u.opcreate));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4310
	case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4311
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4312
			(int32_t *)&objp->nfs_resop4_u.opdelegpurge.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4313
	case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4314
		return (xdr_LINK4res(xdrs, &objp->nfs_resop4_u.oplink));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4315
	case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4316
		return (xdr_LOCK4res(xdrs, &objp->nfs_resop4_u.oplock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4317
	case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4318
		return (xdr_LOCKT4res(xdrs, &objp->nfs_resop4_u.oplockt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4319
	case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4320
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4321
				(int32_t *)&objp->nfs_resop4_u.oplocku.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4322
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4323
		if (objp->nfs_resop4_u.oplocku.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4324
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4325
		if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4326
		    &objp->nfs_resop4_u.oplocku.lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4327
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4328
		return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4329
		    objp->nfs_resop4_u.oplocku.lock_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4330
		    12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4331
	case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4332
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4333
			(int32_t *)&objp->nfs_resop4_u.opnverify.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4334
	case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4335
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4336
			(int32_t *)&objp->nfs_resop4_u.opopenattr.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4337
	case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4338
		return (xdr_OPEN_CONFIRM4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4339
				&objp->nfs_resop4_u.opopen_confirm));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4340
	case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4341
		return (xdr_OPEN_DOWNGRADE4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4342
				&objp->nfs_resop4_u.opopen_downgrade));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4343
	case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4344
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4345
			(int32_t *)&objp->nfs_resop4_u.opputpubfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4346
	case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4347
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4348
			(int32_t *)&objp->nfs_resop4_u.opputrootfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4349
	case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4350
		return (xdr_READLINK4res(xdrs, &objp->nfs_resop4_u.opreadlink));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4351
	case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4352
		return (xdr_RENAME4res(xdrs, &objp->nfs_resop4_u.oprename));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4353
	case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4354
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4355
				(int32_t *)&objp->nfs_resop4_u.oprenew.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4356
	case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4357
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4358
			(int32_t *)&objp->nfs_resop4_u.oprestorefh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4359
	case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4360
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4361
			(int32_t *)&objp->nfs_resop4_u.opsavefh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4362
	case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4363
		if (!xdr_int(xdrs, (int32_t *)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4364
					status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4365
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4366
		if (objp->nfs_resop4_u.opsecinfo.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4367
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4368
		return (xdr_array(xdrs, (char **)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4369
					SECINFO4resok_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4370
			(uint_t *)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4371
					SECINFO4resok_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4372
			NFS4_SECINFO_LIMIT, sizeof (secinfo4),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4373
			(xdrproc_t)xdr_secinfo4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4374
	case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4375
		if (!xdr_int(xdrs, (int32_t *)&objp->nfs_resop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4376
						status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4377
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4378
		return (xdr_bitmap4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4379
				&objp->nfs_resop4_u.opsetattr.attrsset));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4380
	case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4381
		return (xdr_SETCLIENTID4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4382
				&objp->nfs_resop4_u.opsetclientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4383
	case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4384
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4385
			(int32_t *)&objp->nfs_resop4_u.opsetclientid_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4386
					status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4387
	case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4388
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4389
			(int32_t *)&objp->nfs_resop4_u.opverify.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4390
	case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4391
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4392
		    (int32_t *)&objp->nfs_resop4_u.oprelease_lockowner.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4393
	case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4394
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4395
			(int32_t *)&objp->nfs_resop4_u.opillegal.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4396
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4397
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4398
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4399
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4400
static bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4401
xdr_cnfs_resop4_wrap(XDR *xdrs, nfs_resop4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4402
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4403
	if (!xdr_int(xdrs, (int *)&objp->resop))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4404
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4405
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4406
	return (xdr_nfs_resop4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4407
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4408
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4409
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4410
xdr_snfs_resop4(XDR *xdrs, nfs_resop4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4411
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4412
	if (!xdr_int(xdrs, (int *)&objp->resop))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4413
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4414
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4415
	switch (objp->resop) {
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4416
	case OP_GETFH:
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4417
		if (!XDR_PUTINT32(xdrs,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4418
		    (int32_t *)&objp->nfs_resop4_u.opgetfh.status))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4419
			return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4420
		if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4421
			return (TRUE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4422
		return (xdr_encode_nfs_fh4(xdrs,
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4423
		    &objp->nfs_resop4_u.opgetfh.object));
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4424
	default:
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4425
		return (xdr_nfs_resop4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4426
	}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4427
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4428
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4429
static bool_t
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4430
xdr_nfs_resop4_clnt(XDR *xdrs, nfs_resop4 *objp, nfs_argop4 *aobjp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4431
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4432
	if (!xdr_int(xdrs, (int *)&objp->resop))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4433
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4434
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4435
	 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4436
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4437
	switch (objp->resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4438
	case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4439
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4440
				(int32_t *)&objp->nfs_resop4_u.opputfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4441
	case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4442
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4443
			    (int32_t *)&objp->nfs_resop4_u.opgetattr.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4444
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4445
		if (objp->nfs_resop4_u.opgetattr.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4446
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4447
		return (xdr_ga_res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4448
				(GETATTR4res *)&objp->nfs_resop4_u.opgetattr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4449
				&aobjp->nfs_argop4_u.opgetattr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4450
	case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4451
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4452
				(int32_t *)&objp->nfs_resop4_u.opgetfh.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4453
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4454
		if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4455
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4456
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4457
		    (char **)&objp->nfs_resop4_u.opgetfh.object.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4458
		    (uint_t *)&objp->nfs_resop4_u.opgetfh.object.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4459
		    NFS4_FHSIZE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4460
	case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4461
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4462
			(int32_t *)&objp->nfs_resop4_u.oplookup.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4463
	case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4464
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4465
			(int32_t *)&objp->nfs_resop4_u.opnverify.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4466
	case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4467
		return (xdr_OPEN4res(xdrs, &objp->nfs_resop4_u.opopen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4468
	case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4469
		return (xdr_CLOSE4res(xdrs, &objp->nfs_resop4_u.opclose));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4470
	case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4471
		return (xdr_ACCESS4res(xdrs, &objp->nfs_resop4_u.opaccess));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4472
	case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4473
		return (xdr_READ4res_clnt(xdrs, &objp->nfs_resop4_u.opread,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4474
					&aobjp->nfs_argop4_u.opread));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4475
	case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4476
		return (xdr_WRITE4res(xdrs, &objp->nfs_resop4_u.opwrite));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4477
	case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4478
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4479
			(int32_t *)&objp->nfs_resop4_u.opdelegreturn.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4480
	case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4481
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4482
			(int32_t *)&objp->nfs_resop4_u.oplookupp.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4483
	case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4484
		return (xdr_READDIR4res_clnt(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4485
				&objp->nfs_resop4_u.opreaddirclnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4486
				&aobjp->nfs_argop4_u.opreaddir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4487
	case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4488
		return (xdr_REMOVE4res(xdrs, &objp->nfs_resop4_u.opremove));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4489
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4490
	case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4491
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4492
			    (int32_t *)&objp->nfs_resop4_u.opcommit.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4493
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4494
		if (objp->nfs_resop4_u.opcommit.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4495
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4496
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4497
				(u_longlong_t *)&objp->nfs_resop4_u.opcommit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4498
						writeverf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4499
	case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4500
		return (xdr_CREATE4res(xdrs, &objp->nfs_resop4_u.opcreate));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4501
	case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4502
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4503
			(int32_t *)&objp->nfs_resop4_u.opdelegpurge.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4504
	case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4505
		return (xdr_LINK4res(xdrs, &objp->nfs_resop4_u.oplink));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4506
	case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4507
		return (xdr_LOCK4res(xdrs, &objp->nfs_resop4_u.oplock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4508
	case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4509
		return (xdr_LOCKT4res(xdrs, &objp->nfs_resop4_u.oplockt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4510
	case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4511
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4512
				(int32_t *)&objp->nfs_resop4_u.oplocku.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4513
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4514
		if (objp->nfs_resop4_u.oplocku.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4515
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4516
		if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4517
		    &objp->nfs_resop4_u.oplocku.lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4518
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4519
		return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4520
		    objp->nfs_resop4_u.oplocku.lock_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4521
		    12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4522
	case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4523
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4524
			(int32_t *)&objp->nfs_resop4_u.opopenattr.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4525
	case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4526
		return (xdr_OPEN_CONFIRM4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4527
				&objp->nfs_resop4_u.opopen_confirm));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4528
	case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4529
		return (xdr_OPEN_DOWNGRADE4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4530
				&objp->nfs_resop4_u.opopen_downgrade));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4531
	case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4532
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4533
			(int32_t *)&objp->nfs_resop4_u.opputpubfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4534
	case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4535
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4536
			(int32_t *)&objp->nfs_resop4_u.opputrootfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4537
	case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4538
		return (xdr_READLINK4res(xdrs, &objp->nfs_resop4_u.opreadlink));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4539
	case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4540
		return (xdr_RENAME4res(xdrs, &objp->nfs_resop4_u.oprename));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4541
	case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4542
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4543
				(int32_t *)&objp->nfs_resop4_u.oprenew.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4544
	case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4545
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4546
			(int32_t *)&objp->nfs_resop4_u.oprestorefh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4547
	case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4548
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4549
			(int32_t *)&objp->nfs_resop4_u.opsavefh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4550
	case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4551
		if (!xdr_int(xdrs, (int32_t *)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4552
					status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4553
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4554
		if (objp->nfs_resop4_u.opsecinfo.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4555
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4556
		return (xdr_array(xdrs, (char **)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4557
					SECINFO4resok_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4558
			(uint_t *)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4559
					SECINFO4resok_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4560
			~0, sizeof (secinfo4), (xdrproc_t)xdr_secinfo4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4561
	case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4562
		if (!xdr_int(xdrs, (int32_t *)&objp->nfs_resop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4563
						status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4564
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4565
		return (xdr_bitmap4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4566
				&objp->nfs_resop4_u.opsetattr.attrsset));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4567
	case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4568
		return (xdr_SETCLIENTID4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4569
				&objp->nfs_resop4_u.opsetclientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4570
	case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4571
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4572
			(int32_t *)&objp->nfs_resop4_u.opsetclientid_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4573
					status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4574
	case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4575
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4576
			(int32_t *)&objp->nfs_resop4_u.opverify.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4577
	case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4578
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4579
		    (int32_t *)&objp->nfs_resop4_u.oprelease_lockowner.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4580
	case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4581
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4582
			(int32_t *)&objp->nfs_resop4_u.opillegal.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4583
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4584
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4585
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4586
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4587
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4588
xdr_COMPOUND4args_clnt(XDR *xdrs, COMPOUND4args_clnt *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4589
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4590
	static int32_t twelve = 12;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4591
	static int32_t minorversion = NFS4_MINORVERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4592
	uint32_t *ctagp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4593
	rpc_inline_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4594
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4595
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4596
	 * XDR_ENCODE only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4597
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4598
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4599
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4600
	if (xdrs->x_op == XDR_DECODE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4601
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4603
	ctagp = (uint32_t *)&nfs4_ctags[objp->ctag].ct_tag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4605
	if ((ptr = XDR_INLINE(xdrs, 5 * BYTES_PER_XDR_UNIT)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4606
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4607
		 * Efficiently encode fixed length tags, could be longlongs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4608
		 * but 8 byte XDR alignment not assured
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4609
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4610
		IXDR_PUT_U_INT32(ptr, 12);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4611
		IXDR_PUT_U_INT32(ptr, ctagp[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4612
		IXDR_PUT_U_INT32(ptr, ctagp[1]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4613
		IXDR_PUT_U_INT32(ptr, ctagp[2]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4614
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4615
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4616
		 * Fixed minor version for now
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4617
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4618
		IXDR_PUT_U_INT32(ptr, NFS4_MINORVERSION);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4619
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4620
		if (!XDR_PUTINT32(xdrs, &twelve))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4621
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4622
		if (!XDR_PUTINT32(xdrs, (int32_t *)&ctagp[0]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4623
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4624
		if (!XDR_PUTINT32(xdrs, (int32_t *)&ctagp[1]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4625
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4626
		if (!XDR_PUTINT32(xdrs, (int32_t *)&ctagp[2]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4627
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4628
		if (!XDR_PUTINT32(xdrs, (int32_t *)&minorversion))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4629
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4630
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4632
	return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4633
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4634
			sizeof (nfs_argop4), (xdrproc_t)xdr_cnfs_argop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4635
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4636
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4637
bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4638
xdr_COMPOUND4args_srv(XDR *xdrs, COMPOUND4args *objp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4639
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4640
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4641
			(uint_t *)&objp->tag.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4642
			NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4643
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4644
	if (!xdr_u_int(xdrs, &objp->minorversion))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4645
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4646
	if (xdrs->x_op != XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4647
		return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4648
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4649
			sizeof (nfs_argop4), (xdrproc_t)xdr_snfs_argop4));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4650
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4651
	return (xdr_snfs_argop4_free(xdrs, &objp->array, objp->array_len));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4652
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4653
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4654
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4655
xdr_COMPOUND4res_clnt(XDR *xdrs, COMPOUND4res_clnt *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4656
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4657
	uint32_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4658
	int32_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4659
	nfs_argop4 *argop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4660
	nfs_resop4 *resop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4662
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4663
	 * No XDR_ENCODE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4664
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4665
	if (xdrs->x_op == XDR_ENCODE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4666
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4668
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4669
		if ((ptr = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4670
			objp->status = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4671
			len = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4672
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4673
			if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4674
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4675
			if (!xdr_u_int(xdrs, (uint32_t *)&len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4676
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4677
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4678
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4679
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4680
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4681
		 * Ignore the tag
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4682
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4683
		if (!XDR_CONTROL(xdrs, XDR_SKIPBYTES, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4684
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4685
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4686
		if (!xdr_int(xdrs, (int32_t *)&objp->array_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4687
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4689
		if (objp->array_len > objp->argsp->array_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4690
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4691
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4692
		if (objp->status == NFS_OK &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4693
		    objp->array_len != objp->argsp->array_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4694
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4695
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4696
		/* Alloc the results array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4697
		argop = objp->argsp->array;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4698
		len = objp->array_len * sizeof (nfs_resop4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4699
		objp->decode_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4700
		objp->array = resop = kmem_zalloc(len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4701
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4702
		for (len = 0; len < objp->array_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4703
			len++, resop++, argop++, objp->decode_len++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4704
			if (!xdr_nfs_resop4_clnt(xdrs, resop, argop)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4705
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4706
				 * Make sure to free anything that may
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4707
				 * have been allocated along the way.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4708
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4709
				xdrs->x_op = XDR_FREE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4710
				(void) xdr_nfs_resop4_free(xdrs, &objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4711
							    objp->array_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4712
							    objp->decode_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4713
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4714
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4715
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4716
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4717
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4718
	return (xdr_nfs_resop4_free(xdrs, &objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4719
				    objp->array_len, objp->decode_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4720
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4721
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4722
bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4723
xdr_COMPOUND4res_srv(XDR *xdrs, COMPOUND4res *objp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4724
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4725
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4726
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4727
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4728
			(uint_t *)&objp->tag.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4729
			NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4730
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4732
	if (xdrs->x_op != XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4733
		return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4734
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4735
			sizeof (nfs_resop4), (xdrproc_t)xdr_snfs_resop4));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4736
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4737
	return (xdr_snfs_resop4_free(xdrs, &objp->array,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4738
				    objp->array_len, objp->array_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4739
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4740
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4741
/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4742
 * NFS server side callback, initiating the callback request so it
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4743
 * is the RPC client. Must convert from server's internal filehandle
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4744
 * format to wire format.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4745
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4746
static bool_t
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4747
xdr_snfs_cb_argop4(XDR *xdrs, nfs_cb_argop4 *objp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4748
{
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4749
	CB_GETATTR4args *gargs;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4750
	CB_RECALL4args *rargs;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4751
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4752
	ASSERT(xdrs->x_op == XDR_ENCODE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4753
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4754
	if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->argop))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4755
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4756
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4757
	switch (objp->argop) {
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4758
	case OP_CB_GETATTR:
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4759
		gargs = &objp->nfs_cb_argop4_u.opcbgetattr;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4760
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4761
		if (!xdr_encode_nfs_fh4(xdrs, &gargs->fh))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4762
			return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4763
		return (xdr_bitmap4(xdrs, &gargs->attr_request));
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4764
	case OP_CB_RECALL:
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4765
		rargs = &objp->nfs_cb_argop4_u.opcbrecall;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4766
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4767
		if (!XDR_PUTINT32(xdrs, (int32_t *)&rargs->stateid.seqid))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4768
			return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4769
		if (!xdr_opaque(xdrs, rargs->stateid.other, 12))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4770
			return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4771
		if (!XDR_PUTINT32(xdrs, (int32_t *)&rargs->truncate))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4772
			return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4773
		return (xdr_encode_nfs_fh4(xdrs, &rargs->fh));
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4774
	case OP_CB_ILLEGAL:
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4775
		return (TRUE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4776
	}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4777
	return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4778
}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4779
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4780
/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4781
 * NFS client side callback, receiving the callback request so it
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4782
 * is the RPC server. Must treat the file handles as opaque.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4783
 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4784
static bool_t
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4785
xdr_cnfs_cb_argop4(XDR *xdrs, nfs_cb_argop4 *objp)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4786
{
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4787
	CB_GETATTR4args *gargs;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4788
	CB_RECALL4args *rargs;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4789
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4790
	ASSERT(xdrs->x_op != XDR_ENCODE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4791
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4792
	if (!xdr_u_int(xdrs, &objp->argop))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4793
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4794
	switch (objp->argop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4795
	case OP_CB_GETATTR:
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4796
		gargs = &objp->nfs_cb_argop4_u.opcbgetattr;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4797
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4798
		if (!xdr_bytes(xdrs, (char **)&gargs->fh.nfs_fh4_val,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4799
		    (uint_t *)&gargs->fh.nfs_fh4_len, NFS4_FHSIZE))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4800
			return (FALSE);
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4801
		return (xdr_bitmap4(xdrs, &gargs->attr_request));
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4802
	case OP_CB_RECALL:
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4803
		rargs = &objp->nfs_cb_argop4_u.opcbrecall;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4804
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4805
		if (!xdr_u_int(xdrs, &rargs->stateid.seqid))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4806
			return (FALSE);
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4807
		if (!xdr_opaque(xdrs, rargs->stateid.other, 12))
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4808
			return (FALSE);
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4809
		if (!xdr_bool(xdrs, &rargs->truncate))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4810
			return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4811
		return (xdr_bytes(xdrs, (char **)&rargs->fh.nfs_fh4_val,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4812
		    (uint_t *)&rargs->fh.nfs_fh4_len, NFS4_FHSIZE));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4813
	case OP_CB_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4814
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4815
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4816
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4817
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4819
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4820
xdr_nfs_cb_resop4(XDR *xdrs, nfs_cb_resop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4821
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4822
	if (!xdr_u_int(xdrs, &objp->resop))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4823
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4824
	switch (objp->resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4825
	case OP_CB_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4826
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4827
				(int32_t *)&objp->nfs_cb_resop4_u.opcbgetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4828
				    status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4829
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4830
		if (objp->nfs_cb_resop4_u.opcbgetattr.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4831
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4832
		return (xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4833
				&objp->nfs_cb_resop4_u.opcbgetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4834
				    obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4835
	case OP_CB_RECALL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4836
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4837
			(int32_t *)&objp->nfs_cb_resop4_u.opcbrecall.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4838
	case OP_CB_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4839
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4840
			(int32_t *)&objp->nfs_cb_resop4_u.opcbillegal.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4841
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4842
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4843
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4844
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4845
/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4846
 * The NFS client side callback, RPC server
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4847
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4848
bool_t
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4849
xdr_CB_COMPOUND4args_clnt(XDR *xdrs, CB_COMPOUND4args *objp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4850
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4851
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4852
			(uint_t *)&objp->tag.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4853
			NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4854
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4855
	if (!xdr_u_int(xdrs, &objp->minorversion))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4856
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4857
	if (!xdr_u_int(xdrs, &objp->callback_ident))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4858
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4859
	return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4860
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4861
			sizeof (nfs_cb_argop4), (xdrproc_t)xdr_cnfs_cb_argop4));
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4862
}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4863
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4864
/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4865
 * The NFS server side callback, RPC client
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4866
 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4867
bool_t
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4868
xdr_CB_COMPOUND4args_srv(XDR *xdrs, CB_COMPOUND4args *objp)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4869
{
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4870
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4871
			(uint_t *)&objp->tag.utf8string_len,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4872
			NFS4_MAX_UTF8STRING))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4873
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4874
	if (!xdr_u_int(xdrs, &objp->minorversion))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4875
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4876
	if (!xdr_u_int(xdrs, &objp->callback_ident))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4877
		return (FALSE);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4878
	return (xdr_array(xdrs, (char **)&objp->array,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4879
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 967
diff changeset
  4880
			sizeof (nfs_cb_argop4), (xdrproc_t)xdr_snfs_cb_argop4));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4881
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4883
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4884
xdr_CB_COMPOUND4res(XDR *xdrs, CB_COMPOUND4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4885
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4886
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4887
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4888
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4889
			(uint_t *)&objp->tag.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4890
			NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4891
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4892
	return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4893
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4894
			sizeof (nfs_cb_resop4), (xdrproc_t)xdr_nfs_cb_resop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4895
}