usr/src/uts/common/fs/nfs/nfs4_xdr.c
author ek110237
Thu, 03 Nov 2005 18:23:48 -0800
changeset 836 dfdf8a665ca9
parent 806 849fb015aa25
child 967 cf6233442405
permissions -rw-r--r--
6345690 nfsv4-test panics: assertion failed: ((((nfs_fh4_fmt_t *)(&cs->fh)->nfs_fh4_val)->fh4_flag) & (2))
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 *	Copyright 2005 Sun Microsystems, Inc.
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
/*
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   152
 * XDR_INLINE encode a filehandle.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   153
 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   154
bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   155
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
   156
	nfs_fh4_fmt_t *fhp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   157
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   158
	uint32_t *ptr = *ptrp;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   159
	uint_t otw_len;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   160
	char *curp;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   161
	uint_t dlen;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   162
	uint32_t padword;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   163
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   164
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   165
	 * First get the variable sized part of the filehandle.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   166
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   167
	otw_len = fhp->fh4_len + fhp->fh4_xlen + sizeof (fhp->fh4_fsid) +
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   168
	    sizeof (fhp->fh4_len) + sizeof (fhp->fh4_xlen);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   169
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   170
	 * Round out to a full word.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   171
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   172
	otw_len = RNDUP(otw_len);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   173
	padword = (otw_len / BYTES_PER_XDR_UNIT) - 1;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   174
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   175
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   176
	 * Add in the fixed sized pieces.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   177
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   178
	otw_len += sizeof (fhp->fh4_flag);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   179
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   180
#ifdef VOLATILE_FH_TEST
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   181
	otw_len += sizeof (fhp->fh4_volatile_id);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   182
#endif
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   183
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   184
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   185
	 * Make sure we don't exceed our buffer.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   186
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   187
	if ((ptr + (otw_len / BYTES_PER_XDR_UNIT) + 1) > ptr_redzone)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   188
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   189
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   190
	IXDR_PUT_U_INT32(ptr, otw_len);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   191
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   192
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   193
	 * Zero out the pading.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   194
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   195
	ptr[padword] = 0;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   196
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   197
	/* 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
   198
	*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
   199
	*ptr++ = (uint32_t)fhp->fh4_fsid.val[1];
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   200
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   201
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   202
	 * Since the next pieces are unaligned, we need to
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   203
	 * do bytewise copies.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   204
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   205
	curp = (char *)ptr;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   206
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   207
	/* fh4_len + fh4_data */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   208
	dlen = sizeof (fhp->fh4_len);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   209
	dlen += fhp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_len;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   210
	bcopy(&fhp->fh4_len, curp, dlen);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   211
	curp += dlen;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   212
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   213
	/* fh4_xlen + fh4_xdata */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   214
	dlen = sizeof (fhp->fh4_xlen);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   215
	dlen += fhp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_xlen;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   216
	bcopy(&fhp->fh4_xlen, curp, dlen);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   217
	curp += dlen;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   218
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   219
	/* do necessary rounding/padding */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   220
	curp = (char *)RNDUP((uintptr_t)curp);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   221
	ptr = (uint32_t *)curp;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   222
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   223
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   224
	 * With the above padding, we're word aligned again.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   225
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   226
	ASSERT(((uintptr_t)ptr % BYTES_PER_XDR_UNIT) == 0);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   227
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   228
	/* 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
   229
	*ptr++ = (uint32_t)fhp->fh4_flag;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   230
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   231
#ifdef VOLATILE_FH_TEST
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   232
	/* 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
   233
	*ptr++ = (uint32_t)fhp->fh4_volatile_id;
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   234
#endif
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   235
	*ptrp = ptr;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   236
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   237
	return (TRUE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   238
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   239
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   240
static char xdr_crud[BYTES_PER_XDR_UNIT];
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   241
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   242
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   243
xdr_decode_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   244
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   245
	uint32_t fhsize;		/* filehandle size */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   246
	uint32_t fsize;			/* fh_len size */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   247
	uint32_t xsize;			/* fh_xlen size */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   248
	uint32_t rsize;			/* bytes to round */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   249
	uint32_t psize;			/* pad size */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   250
	uint32_t dsize;			/* "data" size */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   251
	nfs_fh4_fmt_t *fh_fmtp;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   252
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   253
	ASSERT(xdrs->x_op == XDR_DECODE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   254
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   255
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   256
	 * Retrieve the filehandle length.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   257
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   258
	if (!XDR_GETINT32(xdrs, (int32_t *)&fhsize))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   259
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   260
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   261
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   262
	 * Check to see if what the client sent us is bigger than what
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   263
	 * we can ever possibly send out or smaller than what we could
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   264
	 * possibly send out.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   265
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   266
	if (fhsize > sizeof (nfs_fh4_fmt_t) ||
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   267
	    fhsize < sizeof (fsid_t) + sizeof (ushort_t) + sizeof (ushort_t))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   268
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   269
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   270
	rsize = fhsize % BYTES_PER_XDR_UNIT;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   271
	if (rsize != 0)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   272
		rsize = BYTES_PER_XDR_UNIT - rsize;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   273
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   274
	objp->nfs_fh4_val = kmem_zalloc(sizeof (nfs_fh4_fmt_t), KM_SLEEP);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   275
	objp->nfs_fh4_len = sizeof (nfs_fh4_fmt_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   276
	fh_fmtp = (nfs_fh4_fmt_t *)objp->nfs_fh4_val;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   277
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   278
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   279
	 * Decode what should be fh4_fsid.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   280
	 */
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
   281
	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_fsid, sizeof (fsid_t)))
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   282
		return (FALSE);
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
   283
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   284
	fhsize -= sizeof (fsid_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   285
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   286
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   287
	 * Decode what should be fh4_len.  fh4_len is two bytes, so we're
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   288
	 * unaligned now, have to use XDR_GETBYTES from now on.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   289
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   290
	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_len,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   291
	    sizeof (ushort_t)))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   292
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   293
	fhsize -= sizeof (ushort_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   294
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   295
	fsize = fh_fmtp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA :
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   296
			fh_fmtp->fh4_len;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   297
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   298
	 * Make sure the client isn't sending us a bogus length for fh4_data.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   299
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   300
	if (fhsize < fsize)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   301
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   302
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   303
	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_data, fsize))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   304
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   305
	fhsize -= fsize;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   306
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   307
	/* make sure we have enough left to decode fh_xlen */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   308
	if (fhsize < sizeof (ushort_t))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   309
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   310
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   311
	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_xlen,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   312
	    sizeof (ushort_t)))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   313
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   314
	fhsize -= sizeof (ushort_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   315
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   316
	xsize = fh_fmtp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA :
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   317
			fh_fmtp->fh4_xlen;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   318
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   319
	 * Make sure the client isn't sending us a bogus length for fh4_xdata.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   320
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   321
	if (fhsize < xsize)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   322
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   323
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   324
	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_xdata, xsize))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   325
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   326
	fhsize -= xsize;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   327
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   328
	/* we purposedly align things, so skip padding */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   329
	dsize = fsize + xsize + sizeof (ushort_t) + sizeof (ushort_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   330
	psize = RNDUP(dsize);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   331
	if (psize != dsize)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   332
		if (!XDR_GETBYTES(xdrs, (caddr_t)&xdr_crud, psize - dsize))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   333
			return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   334
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   335
	/* make sure we have enough left to decode fh4_flag */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   336
	if (fhsize < sizeof (uint32_t))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   337
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   338
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   339
	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_flag,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   340
	    sizeof (uint32_t)))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   341
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   342
	fhsize -= sizeof (uint32_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   343
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   344
#ifdef VOLATILE_FH_TEST
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   345
	/* make sure we have enough left to decode fh4_volatile_id */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   346
	if (fhsize < sizeof (uint32_t))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   347
		return (FALSE);
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
	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_volatile_id,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   350
	    sizeof (uint32_t)))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   351
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   352
	fhsize -= sizeof (uint32_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   353
#endif
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
	 * Make sure client didn't send request with too much padding.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   356
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   357
	if (fhsize > sizeof (uint32_t))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   358
		return (FALSE);
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
	if (rsize)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   361
		if (!XDR_GETBYTES(xdrs, (caddr_t)&xdr_crud, rsize))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   362
			return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   363
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   364
	return (TRUE);
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
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   367
static char zero_word[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
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
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   370
xdr_encode_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   371
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   372
	uint_t otwsize, fsize, xsize;	/* otw, file, and export sizes */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   373
	uint_t dsize, rsize;		/* rounding sizes */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   374
	nfs_fh4_fmt_t *fh_fmtp;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   375
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   376
	ASSERT(xdrs->x_op == XDR_ENCODE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   377
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   378
	fh_fmtp = (nfs_fh4_fmt_t *)objp->nfs_fh4_val;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   379
	fsize = fh_fmtp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA :
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   380
			fh_fmtp->fh4_len;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   381
	xsize = fh_fmtp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA :
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   382
			fh_fmtp->fh4_xlen;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   383
	/* fh4_i */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   384
	otwsize = sizeof (fsid_t) + sizeof (ushort_t) + fsize +
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   385
			sizeof (ushort_t) + xsize;
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   386
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   387
	/* round out to a full word */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   388
	otwsize = RNDUP(otwsize);
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_flag */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   391
	otwsize += sizeof (uint32_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   392
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   393
#ifdef VOLATILE_FH_TEST
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   394
	/* fh4_volatile_id */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   395
	otwsize += sizeof (uint32_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   396
#endif
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
	 * XDR in filehandle size.
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
	if (!XDR_PUTINT32(xdrs, (int32_t *)&otwsize))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   402
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   403
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
	if (!XDR_PUTBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_fsid, sizeof (fsid_t)))
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   405
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   406
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   407
	if (!XDR_PUTBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_len, fsize +
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   408
	    sizeof (ushort_t)))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   409
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   410
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   411
	if (!XDR_PUTBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_xlen, xsize +
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   412
	    sizeof (ushort_t)))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   413
		return (FALSE);
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
	dsize = fsize + xsize + sizeof (ushort_t) + sizeof (ushort_t);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   416
	rsize = RNDUP(dsize);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   417
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   418
	/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   419
	 * Pad in the extra space to force alignment.
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   420
	 */
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   421
	if (dsize != rsize)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   422
		if (!XDR_PUTBYTES(xdrs, (caddr_t)&zero_word, rsize - dsize))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   423
			return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   424
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
   425
	if (!XDR_PUTBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_flag, sizeof (uint32_t)))
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   426
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   427
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   428
#ifdef VOLATILE_FH_TEST
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
   429
	if (!XDR_PUTBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_volatile_id,
dfdf8a665ca9 6345690 nfsv4-test panics: assertion failed: ((((nfs_fh4_fmt_t *)(&cs->fh)->nfs_fh4_val)->fh4_flag) & (2))
ek110237
parents: 806
diff changeset
   430
	    sizeof (uint32_t)))
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   431
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   432
#endif
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   433
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   434
	return (TRUE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   435
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   436
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   437
/*
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   438
 * XDR a NFSv4 filehandle.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
xdr_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
{
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   443
	if (xdrs->x_op == XDR_DECODE)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   444
		return (xdr_decode_nfs_fh4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   445
	else if (xdrs->x_op == XDR_ENCODE)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
   446
		return (xdr_encode_nfs_fh4(xdrs, objp));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	if (objp->nfs_fh4_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		kmem_free(objp->nfs_fh4_val, objp->nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		objp->nfs_fh4_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
/* Called by xdr_array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
xdr_fs_location4(XDR *xdrs, fs_location4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	if (!xdr_array(xdrs, (char **)&objp->server_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
			(uint_t *)&objp->server_len, NFS4_FS_LOCATIONS_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
			sizeof (utf8string), (xdrproc_t)xdr_utf8string))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
	return (xdr_array(xdrs, (char **)&objp->rootpath.pathname4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
			(uint_t *)&objp->rootpath.pathname4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
			NFS4_MAX_PATHNAME4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
			sizeof (utf8string), (xdrproc_t)xdr_utf8string));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
/* Called by xdr_array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
xdr_nfsace4(XDR *xdrs, nfsace4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
		if (!xdr_u_int(xdrs, &objp->type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
		if (!xdr_u_int(xdrs, &objp->flag))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
		if (!xdr_u_int(xdrs, &objp->access_mask))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
		if (xdrs->x_op == XDR_DECODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
			objp->who.utf8string_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
			objp->who.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
		return (xdr_bytes(xdrs, (char **)&objp->who.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
			(uint_t *)&objp->who.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
			NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	}
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
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	if (objp->who.utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
		kmem_free(objp->who.utf8string_val, objp->who.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
		objp->who.utf8string_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
 * These functions are called out of nfs4_attr.c
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
xdr_fattr4_fsid(XDR *xdrs, fattr4_fsid *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->major))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
	return (xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->minor));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
xdr_fattr4_acl(XDR *xdrs, fattr4_acl *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	return (xdr_array(xdrs, (char **)&objp->fattr4_acl_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
			(uint_t *)&objp->fattr4_acl_len, NFS4_ACL_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
			sizeof (nfsace4), (xdrproc_t)xdr_nfsace4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
xdr_fattr4_fs_locations(XDR *xdrs, fattr4_fs_locations *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
	if (!xdr_array(xdrs, (char **)&objp->fs_root.pathname4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
			(uint_t *)&objp->fs_root.pathname4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
			NFS4_MAX_PATHNAME4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
			sizeof (utf8string), (xdrproc_t)xdr_utf8string))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	return (xdr_array(xdrs, (char **)&objp->locations_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
			(uint_t *)&objp->locations_len, NFS4_FS_LOCATIONS_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
			sizeof (fs_location4), (xdrproc_t)xdr_fs_location4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
xdr_fattr4_rawdev(XDR *xdrs, fattr4_rawdev *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
	if (!xdr_u_int(xdrs, &objp->specdata1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
	return (xdr_u_int(xdrs, &objp->specdata2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
xdr_nfstime4(XDR *xdrs, nfstime4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
	if (!xdr_longlong_t(xdrs, (longlong_t *)&objp->seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
	return (xdr_u_int(xdrs, &objp->nseconds));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
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
 * structured used for calls into xdr_ga_fattr_res() as a means
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
 * to do an immediate/short-term cache of owner/group strings
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
 * for callers like the readdir processing.  In the case of readdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
 * it is likely that the directory objects will be owned by the same
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
 * owner/group and if so there is no need to call into the uid/gid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
 * mapping code.  While the uid/gid interfaces have their own cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
 * having one here will reduct pathlength further.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
#define	MAX_OG_NAME 100
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
typedef struct ug_cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
	uid_t	uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	gid_t	gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
	utf8string u_curr, u_last;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
	utf8string g_curr, g_last;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
	char	u_buf1[MAX_OG_NAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
	char	u_buf2[MAX_OG_NAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
	char	g_buf1[MAX_OG_NAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
	char	g_buf2[MAX_OG_NAME];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
} ug_cache_t;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
#define	U_SWAP_CURR_LAST(ug) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
	(ug)->u_last.utf8string_len = (ug)->u_curr.utf8string_len;	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
	if ((ug)->u_last.utf8string_val == (ug)->u_buf1) {		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
		(ug)->u_last.utf8string_val = (ug)->u_buf2;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
		(ug)->u_curr.utf8string_val = (ug)->u_buf1;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
	} else {							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		(ug)->u_last.utf8string_val = (ug)->u_buf1;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		(ug)->u_curr.utf8string_val = (ug)->u_buf2;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
#define	G_SWAP_CURR_LAST(ug) \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
	(ug)->g_last.utf8string_len = (ug)->g_curr.utf8string_len;	\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
	if ((ug)->g_last.utf8string_val == (ug)->g_buf1) {		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
		(ug)->g_last.utf8string_val = (ug)->g_buf2;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
		(ug)->g_curr.utf8string_val = (ug)->g_buf1;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
	} else {							\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
		(ug)->g_last.utf8string_val = (ug)->g_buf1;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		(ug)->g_curr.utf8string_val = (ug)->g_buf2;		\
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
static ug_cache_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
alloc_ugcache()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
	ug_cache_t *pug = kmem_alloc(sizeof (ug_cache_t), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	pug->uid = pug->gid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
	pug->u_curr.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
	pug->u_last.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
	pug->g_curr.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
	pug->g_last.utf8string_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
	pug->u_curr.utf8string_val = pug->u_buf1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	pug->u_last.utf8string_val = pug->u_buf2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
	pug->g_curr.utf8string_val = pug->g_buf1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	pug->g_last.utf8string_val = pug->g_buf2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
	return (pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
xdr_ga_prefill_vattr(struct nfs4_ga_res *garp, struct mntinfo4 *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	static vattr_t s_vattr = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
		AT_ALL,		/* va_mask */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
		VNON,		/* va_type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
		0777,		/* va_mode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
		UID_NOBODY,	/* va_uid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
		GID_NOBODY,	/* va_gid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
		0,		/* va_fsid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
		0,		/* va_nodeid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
		1,		/* va_nlink */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
		0,		/* va_size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
		{0, 0},		/* va_atime */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
		{0, 0},		/* va_mtime */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
		{0, 0},		/* va_ctime */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		0,		/* va_rdev */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
		MAXBSIZE,	/* va_blksize */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
		0,		/* va_nblocks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		0		/* va_seq */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
	garp->n4g_va = s_vattr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
	garp->n4g_va.va_fsid = mi->mi_vfsp->vfs_dev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
	hrt2ts(gethrtime(), &garp->n4g_va.va_atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	garp->n4g_va.va_mtime = garp->n4g_va.va_ctime = garp->n4g_va.va_atime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
xdr_ga_prefill_statvfs(struct nfs4_ga_ext_res *gesp, struct mntinfo4 *mi)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	static statvfs64_t s_sb = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
		MAXBSIZE,	/* f_bsize */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
		DEV_BSIZE,	/* f_frsize */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
		(fsfilcnt64_t)-1, /* f_blocks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
		(fsfilcnt64_t)-1, /* f_bfree */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
		(fsfilcnt64_t)-1, /* f_bavail */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
		(fsfilcnt64_t)-1, /* f_files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
		(fsfilcnt64_t)-1, /* f_ffree */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
		(fsfilcnt64_t)-1, /* f_favail */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
		0,		/* f_fsid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
		"\0",		/* f_basetype */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
		0,		/* f_flag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
		MAXNAMELEN,	/* f_namemax */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
		"\0",		/* f_fstr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	gesp->n4g_sb = s_sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	gesp->n4g_sb.f_fsid = mi->mi_vfsp->vfs_fsid.val[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
xdr_ga_fattr_res(XDR *xdrs, struct nfs4_ga_res *garp, bitmap4 resbmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
		bitmap4 argbmap, struct mntinfo4 *mi, ug_cache_t *pug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	int truefalse;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
	struct nfs4_ga_ext_res ges, *gesp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
	vattr_t *vap = &garp->n4g_va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	vsecattr_t *vsap = &garp->n4g_vsa;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	ASSERT(xdrs->x_op == XDR_DECODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	if (garp->n4g_ext_res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
		gesp = garp->n4g_ext_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
		gesp = &ges;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
	vap->va_mask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
	/* Check to see if the vattr should be pre-filled */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	if (argbmap & NFS4_VATTR_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
		xdr_ga_prefill_vattr(garp, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
	if (argbmap & NFS4_STATFS_ATTR_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
		xdr_ga_prefill_statvfs(gesp, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
	    (FATTR4_SUPPORTED_ATTRS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
	    FATTR4_TYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
	    FATTR4_FH_EXPIRE_TYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
	    FATTR4_CHANGE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	    FATTR4_SIZE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	    FATTR4_LINK_SUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
	    FATTR4_SYMLINK_SUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
	    FATTR4_NAMED_ATTR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
		if (resbmap & FATTR4_SUPPORTED_ATTRS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
			if (!xdr_bitmap4(xdrs, &gesp->n4g_suppattrs))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
		if (resbmap & FATTR4_TYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
			if (!XDR_GETINT32(xdrs, (int *)&vap->va_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
			if (vap->va_type < NF4REG ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
			    vap->va_type > NF4NAMEDATTR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
				vap->va_type = VBAD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
				vap->va_type = nf4_to_vt[vap->va_type];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
			if (vap->va_type == VBLK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
				vap->va_blksize = DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
			vap->va_mask |= AT_TYPE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
		if (resbmap & FATTR4_FH_EXPIRE_TYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
			if (!XDR_GETINT32(xdrs, (int *)&gesp->n4g_fet))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
		if (resbmap & FATTR4_CHANGE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
				(u_longlong_t *)&garp->n4g_change))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
			garp->n4g_change_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
		if (resbmap & FATTR4_SIZE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
					(u_longlong_t *)&vap->va_size))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
			if (!NFS4_SIZE_OK(vap->va_size)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
				garp->n4g_attrerr = EFBIG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
				garp->n4g_attrwhy = NFS4_GETATTR_ATSIZE_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
				vap->va_mask |= AT_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
		if (resbmap & FATTR4_LINK_SUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
			gesp->n4g_pc4.pc4_link_support =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
		if (resbmap & FATTR4_SYMLINK_SUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
			gesp->n4g_pc4.pc4_symlink_support =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
		if (resbmap & FATTR4_NAMED_ATTR_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
			gesp->n4g_pc4.pc4_xattr_exists = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
			gesp->n4g_pc4.pc4_xattr_exists =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
	    (FATTR4_FSID_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
	    FATTR4_UNIQUE_HANDLES_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
	    FATTR4_LEASE_TIME_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
	    FATTR4_RDATTR_ERROR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
		if (resbmap & FATTR4_FSID_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 *)&garp->n4g_fsid.major)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
			(!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
				(u_longlong_t *)&garp->n4g_fsid.minor)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
		    garp->n4g_fsid_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
		if (resbmap & FATTR4_UNIQUE_HANDLES_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
			gesp->n4g_pc4.pc4_unique_handles =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
		if (resbmap & FATTR4_LEASE_TIME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
			if (!XDR_GETINT32(xdrs, (int *)&gesp->n4g_leasetime))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
		if (resbmap & FATTR4_RDATTR_ERROR_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
			if (!XDR_GETINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
					(int *)&gesp->n4g_rdattr_error))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
	    (FATTR4_ACL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
	    FATTR4_ACLSUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
	    FATTR4_ARCHIVE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
	    FATTR4_CANSETTIME_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
		if (resbmap & FATTR4_ACL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
			fattr4_acl	acl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
			acl.fattr4_acl_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
			acl.fattr4_acl_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
			if (!xdr_fattr4_acl(xdrs, &acl))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
			vsap->vsa_aclcnt = acl.fattr4_acl_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
			vsap->vsa_aclentp = acl.fattr4_acl_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
			vsap->vsa_mask = VSA_ACE | VSA_ACECNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
		if (resbmap & FATTR4_ACLSUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
			if (!XDR_GETINT32(xdrs, (int *)&gesp->n4g_aclsupport))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
		if (resbmap & FATTR4_ARCHIVE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
		if (resbmap & FATTR4_CANSETTIME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
			gesp->n4g_pc4.pc4_cansettime =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
	    (FATTR4_CASE_INSENSITIVE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
	    FATTR4_CASE_PRESERVING_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
	    FATTR4_CHOWN_RESTRICTED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
	    FATTR4_FILEHANDLE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
	    FATTR4_FILEID_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
	    FATTR4_FILES_AVAIL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
	    FATTR4_FILES_FREE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
	    FATTR4_FILES_TOTAL_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
		if (resbmap & FATTR4_CASE_INSENSITIVE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
			gesp->n4g_pc4.pc4_case_insensitive =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
		if (resbmap & FATTR4_CASE_PRESERVING_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
			gesp->n4g_pc4.pc4_case_preserving =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
		if (resbmap & FATTR4_CHOWN_RESTRICTED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
			gesp->n4g_pc4.pc4_chown_restricted =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
		if (resbmap & FATTR4_FILEHANDLE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
			gesp->n4g_fh_u.nfs_fh4_alt.len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
			gesp->n4g_fh_u.nfs_fh4_alt.val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
				gesp->n4g_fh_u.nfs_fh4_alt.data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
			if (!xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
			    (char **)&gesp->n4g_fh_u.n4g_fh.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
			    (uint_t *)&gesp->n4g_fh_u.n4g_fh.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
			    NFS4_FHSIZE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
		if (resbmap & FATTR4_FILEID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
					(u_longlong_t *)&vap->va_nodeid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
			vap->va_mask |= AT_NODEID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
		if (resbmap & FATTR4_FILES_AVAIL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
				(u_longlong_t *)&gesp->n4g_sb.f_favail))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
		if (resbmap & FATTR4_FILES_FREE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
				(u_longlong_t *)&gesp->n4g_sb.f_ffree))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
		if (resbmap & FATTR4_FILES_TOTAL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
				(u_longlong_t *)&gesp->n4g_sb.f_files))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
	    (FATTR4_FS_LOCATIONS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	    FATTR4_HIDDEN_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	    FATTR4_HOMOGENEOUS_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
		if (resbmap & FATTR4_FS_LOCATIONS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
		if (resbmap & FATTR4_HIDDEN_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
		if (resbmap & FATTR4_HOMOGENEOUS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
			gesp->n4g_pc4.pc4_homogeneous =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
	    (FATTR4_MAXFILESIZE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
	    FATTR4_MAXLINK_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
	    FATTR4_MAXNAME_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
	    FATTR4_MAXREAD_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
	    FATTR4_MAXWRITE_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
		if (resbmap & FATTR4_MAXFILESIZE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
				(u_longlong_t *)&gesp->n4g_maxfilesize))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
		if (resbmap & FATTR4_MAXLINK_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
			if (!XDR_GETINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
					(int *)&gesp->n4g_pc4.pc4_link_max))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
		if (resbmap & FATTR4_MAXNAME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
			if (!XDR_GETINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
					(int *)&gesp->n4g_pc4.pc4_name_max))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
			gesp->n4g_sb.f_namemax = gesp->n4g_pc4.pc4_name_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
		if (resbmap & FATTR4_MAXREAD_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
				(u_longlong_t *)&gesp->n4g_maxread))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
		if (resbmap & FATTR4_MAXWRITE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
				(u_longlong_t *)&gesp->n4g_maxwrite))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
	    (FATTR4_MIMETYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
	    FATTR4_MODE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
	    FATTR4_NO_TRUNC_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
	    FATTR4_NUMLINKS_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
		if (resbmap & FATTR4_MIMETYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
		if (resbmap & FATTR4_MODE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
			if (!XDR_GETINT32(xdrs, (int *)&vap->va_mode))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
			vap->va_mask |= AT_MODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
		if (resbmap & FATTR4_NO_TRUNC_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
			if (!XDR_GETINT32(xdrs, (int *)&truefalse))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
			gesp->n4g_pc4.pc4_no_trunc =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
		if (resbmap & FATTR4_NUMLINKS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
			if (!XDR_GETINT32(xdrs, (int *)&vap->va_nlink))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
			vap->va_mask |= AT_NLINK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
	    (FATTR4_OWNER_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
	    FATTR4_OWNER_GROUP_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
	    FATTR4_QUOTA_AVAIL_HARD_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
	    FATTR4_QUOTA_AVAIL_SOFT_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
		if (resbmap & FATTR4_OWNER_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
			uint_t *owner_length, ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
			char *owner_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
			char *owner_alloc = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
			utf8string ov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
			/* get the OWNER_LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
			if (!xdr_u_int(xdrs, &ol))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
			/* Manage the owner length location */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
			if (pug && ol <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
				owner_length = &pug->u_curr.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
				*owner_length = ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
				owner_length = &ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
			/* find memory to store the decode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
			if (*owner_length > MAX_OG_NAME || pug == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
				owner_val = owner_alloc =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
					kmem_alloc(*owner_length, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
				owner_val = pug->u_curr.utf8string_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
			/* get the OWNER string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
			if (!xdr_opaque(xdrs, owner_val, *owner_length)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
				if (owner_alloc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
					kmem_free(owner_alloc, *owner_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
			/* Optimize for matching if called for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
			if (pug &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
			    *owner_length == pug->u_last.utf8string_len &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
			    bcmp(owner_val, pug->u_last.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
					*owner_length) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
				vap->va_uid = pug->uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
				vap->va_mask |= AT_UID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
				uid_t uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
				ov.utf8string_len = *owner_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
				ov.utf8string_val = owner_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
				error = nfs_idmap_str_uid(&ov, &uid, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
				 * String was mapped, but to nobody because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
				 * we are nfsmapid, indicate it should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
				 * be cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
				if (error == ENOTSUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
					error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
						NFS4_GETATTR_NOCACHE_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
					garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
						NFS4_GETATTR_ATUID_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
					vap->va_uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
					vap->va_mask |= AT_UID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
					if (pug && ol <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
						pug->uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
						U_SWAP_CURR_LAST(pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
				if (owner_alloc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
					kmem_free(owner_alloc, *owner_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
		if (resbmap & FATTR4_OWNER_GROUP_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
			uint_t *group_length, gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
			char *group_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
			char *group_alloc = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
			utf8string gv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
			/* get the OWNER_GROUP_LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
			if (!xdr_u_int(xdrs, &gl))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
			/* Manage the group length location */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
			if (pug && gl <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
				group_length = &pug->g_curr.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
				*group_length = gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
				group_length = &gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
			/* find memory to store the decode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
			if (*group_length > MAX_OG_NAME || pug == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
				group_val = group_alloc =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
					kmem_alloc(*group_length, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
				group_val = pug->g_curr.utf8string_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
			/* get the OWNER_GROUP string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
			if (!xdr_opaque(xdrs, group_val, *group_length)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
				if (group_alloc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
					kmem_free(group_alloc, *group_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
				return (FALSE);
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
			/* Optimize for matching if called for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
			if (pug &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
			    *group_length == pug->g_last.utf8string_len &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
			    bcmp(group_val, pug->g_last.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
					*group_length) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
				vap->va_gid = pug->gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
				vap->va_mask |= AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
				uid_t gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
				gv.utf8string_len = *group_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
				gv.utf8string_val = group_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
				error = nfs_idmap_str_gid(&gv, &gid, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
				 * String was mapped, but to nobody because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
				 * we are nfsmapid, indicate it should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
				 * be cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
				if (error == ENOTSUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
					error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
						NFS4_GETATTR_NOCACHE_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
					garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
						NFS4_GETATTR_ATGID_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
					vap->va_gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
					vap->va_mask |= AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
					if (pug && gl <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
						pug->gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
						G_SWAP_CURR_LAST(pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
				if (group_alloc) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
					kmem_free(group_alloc, *group_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
		if (resbmap & FATTR4_QUOTA_AVAIL_HARD_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
		if (resbmap & FATTR4_QUOTA_AVAIL_SOFT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
	    (FATTR4_QUOTA_USED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
	    FATTR4_SPACE_AVAIL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
	    FATTR4_SPACE_FREE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
	    FATTR4_SPACE_TOTAL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
	    FATTR4_SPACE_USED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	    FATTR4_SYSTEM_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
		if (resbmap & FATTR4_QUOTA_USED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
		if (resbmap & FATTR4_RAWDEV_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
			fattr4_rawdev rawdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
			if (!xdr_fattr4_rawdev(xdrs, &rawdev))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
			if (vap->va_type == VCHR || vap->va_type == VBLK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
				vap->va_rdev = makedevice(rawdev.specdata1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
							rawdev.specdata2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
				vap->va_rdev = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
			vap->va_mask |= AT_RDEV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
		if (resbmap & FATTR4_SPACE_AVAIL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
				(u_longlong_t *)&gesp->n4g_sb.f_bavail))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
			gesp->n4g_sb.f_bavail /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
		if (resbmap & FATTR4_SPACE_FREE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
				(u_longlong_t *)&gesp->n4g_sb.f_bfree))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
			gesp->n4g_sb.f_bfree /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
		if (resbmap & FATTR4_SPACE_TOTAL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
				(u_longlong_t *)&gesp->n4g_sb.f_blocks))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
			gesp->n4g_sb.f_blocks /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
		if (resbmap & FATTR4_SPACE_USED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
			uint64_t space_used;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
						(u_longlong_t *)&space_used))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
			/* Compute space depending on device type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
			ASSERT((vap->va_mask & AT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
			if (vap->va_type == VREG || vap->va_type == VDIR ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
			    vap->va_type == VLNK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
				vap->va_nblocks = (u_longlong_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
					((space_used + (offset4)DEV_BSIZE -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
					(offset4)1) / (offset4)DEV_BSIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
				vap->va_nblocks = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
			vap->va_mask |= AT_NBLOCKS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
		if (resbmap & FATTR4_SYSTEM_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
	    (FATTR4_TIME_ACCESS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
	    FATTR4_TIME_ACCESS_SET_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
	    FATTR4_TIME_BACKUP_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
	    FATTR4_TIME_CREATE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
	    FATTR4_TIME_DELTA_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
	    FATTR4_TIME_METADATA_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
	    FATTR4_TIME_MODIFY_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
	    FATTR4_TIME_MODIFY_SET_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
	    FATTR4_MOUNTED_ON_FILEID_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
		if (resbmap & FATTR4_TIME_ACCESS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
			nfstime4 atime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
			if (!xdr_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
					    (longlong_t *)&atime.seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
			if (!XDR_GETINT32(xdrs, (int *)&atime.nseconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
			error = nfs4_time_ntov(&atime, &vap->va_atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
				garp->n4g_attrwhy = NFS4_GETATTR_ATATIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
			vap->va_mask |= AT_ATIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
		if (resbmap & FATTR4_TIME_ACCESS_SET_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
		if (resbmap & FATTR4_TIME_BACKUP_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
		if (resbmap & FATTR4_TIME_CREATE_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
		if (resbmap & FATTR4_TIME_DELTA_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
			if ((!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
			    (u_longlong_t *)&gesp->n4g_delta.seconds)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
			    (!xdr_u_int(xdrs, &gesp->n4g_delta.nseconds)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
		if (resbmap & FATTR4_TIME_METADATA_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
			nfstime4 mdt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
			if (!xdr_longlong_t(xdrs, (longlong_t *)&mdt.seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
			if (!XDR_GETINT32(xdrs, (int32_t *)&mdt.nseconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
			error = nfs4_time_ntov(&mdt, &vap->va_ctime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
				garp->n4g_attrwhy = NFS4_GETATTR_ATCTIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
			vap->va_mask |= AT_CTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
		if (resbmap & FATTR4_TIME_MODIFY_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
			nfstime4 mtime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
			if (!xdr_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
					    (longlong_t *)&mtime.seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
			if (!XDR_GETINT32(xdrs, (int32_t *)&mtime.nseconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
			error = nfs4_time_ntov(&mtime, &vap->va_mtime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
				garp->n4g_attrwhy = NFS4_GETATTR_ATMTIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
			vap->va_mask |= AT_MTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
		if (resbmap & FATTR4_TIME_MODIFY_SET_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
		if (resbmap & FATTR4_MOUNTED_ON_FILEID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
					(u_longlong_t *)&garp->n4g_mon_fid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
			garp->n4g_mon_fid_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
	if (resbmap & ~(NFS4_VATTR_MASK | FATTR4_ACL_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
		/* copy only if not provided */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
		if (garp->n4g_ext_res == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
			garp->n4g_ext_res = kmem_alloc(sizeof (ges), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
			bcopy(&ges, garp->n4g_ext_res, sizeof (ges));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
 * Inlined version of get_bitmap4 processing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
bitmap4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
xdr_get_bitmap4_inline(uint32_t **iptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
	uint32_t resbmaplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
	bitmap4 bm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
	uint32_t *ptr = *iptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
	/* bitmap LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
	resbmaplen = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
	/* Inline the bitmap and attrlen for common case of two word map */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
	if (resbmaplen == 2) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
		IXDR_GET_HYPER(ptr, bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
#if defined(_LITTLE_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
	bm = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
	if (--resbmaplen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
	*((uint32_t *)&bm) |= IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
	if (--resbmaplen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
	ptr += resbmaplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
	*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
	return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
#elif defined(_BIG_ENDIAN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
	*((uint32_t *)&bm) = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
	if (--resbmaplen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
	bm |= IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
	if (--resbmaplen == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
		*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
		return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
	ptr += resbmaplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
	*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
	return (bm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
	ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
	ptr += resbmaplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
	*iptr = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
xdr_ga_fattr_res_inline(uint32_t *ptr, struct nfs4_ga_res *garp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
			bitmap4 resbmap, bitmap4 argbmap, struct mntinfo4 *mi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
			ug_cache_t *pug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
	int truefalse;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
	struct nfs4_ga_ext_res ges, *gesp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
	vattr_t *vap = &garp->n4g_va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
	if (garp->n4g_ext_res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
		gesp = garp->n4g_ext_res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
		gesp = &ges;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
	vap->va_mask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
	/* Check to see if the vattr should be pre-filled */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
	if (argbmap & NFS4_VATTR_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
		xdr_ga_prefill_vattr(garp, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	if (argbmap & NFS4_STATFS_ATTR_MASK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
		xdr_ga_prefill_statvfs(gesp, mi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
	    (FATTR4_SUPPORTED_ATTRS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
	    FATTR4_TYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
	    FATTR4_FH_EXPIRE_TYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
	    FATTR4_CHANGE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
	    FATTR4_SIZE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
	    FATTR4_LINK_SUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
	    FATTR4_SYMLINK_SUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
	    FATTR4_NAMED_ATTR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
		if (resbmap & FATTR4_SUPPORTED_ATTRS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
			gesp->n4g_suppattrs = xdr_get_bitmap4_inline(&ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
		if (resbmap & FATTR4_TYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
			vap->va_type = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
			if (vap->va_type < NF4REG ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
			    vap->va_type > NF4NAMEDATTR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
				vap->va_type = VBAD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
				vap->va_type = nf4_to_vt[vap->va_type];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
			if (vap->va_type == VBLK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
				vap->va_blksize = DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
			vap->va_mask |= AT_TYPE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
		if (resbmap & FATTR4_FH_EXPIRE_TYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
			gesp->n4g_fet = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
		if (resbmap & FATTR4_CHANGE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
			IXDR_GET_U_HYPER(ptr, garp->n4g_change);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
			garp->n4g_change_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
		if (resbmap & FATTR4_SIZE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
			IXDR_GET_U_HYPER(ptr, vap->va_size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
			if (!NFS4_SIZE_OK(vap->va_size)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
				garp->n4g_attrerr = EFBIG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
				garp->n4g_attrwhy = NFS4_GETATTR_ATSIZE_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
				vap->va_mask |= AT_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
		if (resbmap & FATTR4_LINK_SUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
			gesp->n4g_pc4.pc4_link_support =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
		if (resbmap & FATTR4_SYMLINK_SUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
			gesp->n4g_pc4.pc4_symlink_support =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
		if (resbmap & FATTR4_NAMED_ATTR_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
			gesp->n4g_pc4.pc4_xattr_exists = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
			gesp->n4g_pc4.pc4_xattr_exists =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	    (FATTR4_FSID_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	    FATTR4_UNIQUE_HANDLES_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	    FATTR4_LEASE_TIME_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
	    FATTR4_RDATTR_ERROR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
		if (resbmap & FATTR4_FSID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
			IXDR_GET_U_HYPER(ptr, garp->n4g_fsid.major);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
			IXDR_GET_U_HYPER(ptr, garp->n4g_fsid.minor);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
			garp->n4g_fsid_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
		if (resbmap & FATTR4_UNIQUE_HANDLES_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
			gesp->n4g_pc4.pc4_unique_handles =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
		if (resbmap & FATTR4_LEASE_TIME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
			gesp->n4g_leasetime = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
		if (resbmap & FATTR4_RDATTR_ERROR_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
			gesp->n4g_rdattr_error = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
	    (FATTR4_ACL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
	    FATTR4_ACLSUPPORT_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
	    FATTR4_ARCHIVE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
	    FATTR4_CANSETTIME_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
		if (resbmap & FATTR4_ACL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
		if (resbmap & FATTR4_ACLSUPPORT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
			gesp->n4g_aclsupport = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
		if (resbmap & FATTR4_ARCHIVE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
		if (resbmap & FATTR4_CANSETTIME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
			gesp->n4g_pc4.pc4_cansettime =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
	    (FATTR4_CASE_INSENSITIVE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
	    FATTR4_CASE_PRESERVING_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
	    FATTR4_CHOWN_RESTRICTED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
	    FATTR4_FILEHANDLE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
	    FATTR4_FILEID_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
	    FATTR4_FILES_AVAIL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
	    FATTR4_FILES_FREE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
	    FATTR4_FILES_TOTAL_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
		if (resbmap & FATTR4_CASE_INSENSITIVE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
			gesp->n4g_pc4.pc4_case_insensitive =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
		if (resbmap & FATTR4_CASE_PRESERVING_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
			gesp->n4g_pc4.pc4_case_preserving =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
		if (resbmap & FATTR4_CHOWN_RESTRICTED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
			gesp->n4g_pc4.pc4_chown_restricted =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
		if (resbmap & FATTR4_FILEHANDLE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
			int len = 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
			gesp->n4g_fh_u.nfs_fh4_alt.len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
			gesp->n4g_fh_u.nfs_fh4_alt.val =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
				gesp->n4g_fh_u.nfs_fh4_alt.data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
			gesp->n4g_fh_u.n4g_fh.nfs_fh4_len = len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
			bcopy(ptr, gesp->n4g_fh_u.n4g_fh.nfs_fh4_val, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
			ptr += RNDUP(len) / BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
		if (resbmap & FATTR4_FILEID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
			IXDR_GET_U_HYPER(ptr, vap->va_nodeid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
			vap->va_mask |= AT_NODEID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
		if (resbmap & FATTR4_FILES_AVAIL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_favail);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
		if (resbmap & FATTR4_FILES_FREE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_ffree);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
		if (resbmap & FATTR4_FILES_TOTAL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_files);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
	    (FATTR4_FS_LOCATIONS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	    FATTR4_HIDDEN_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
	    FATTR4_HOMOGENEOUS_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
		if (resbmap & FATTR4_FS_LOCATIONS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
		if (resbmap & FATTR4_HIDDEN_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
		if (resbmap & FATTR4_HOMOGENEOUS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
			gesp->n4g_pc4.pc4_homogeneous =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
	    (FATTR4_MAXFILESIZE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
	    FATTR4_MAXLINK_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
	    FATTR4_MAXNAME_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
	    FATTR4_MAXREAD_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
	    FATTR4_MAXWRITE_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
		if (resbmap & FATTR4_MAXFILESIZE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
			IXDR_GET_U_HYPER(ptr, gesp->n4g_maxfilesize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
		if (resbmap & FATTR4_MAXLINK_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
			gesp->n4g_pc4.pc4_link_max = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
		if (resbmap & FATTR4_MAXNAME_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
			gesp->n4g_pc4.pc4_name_max = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
			gesp->n4g_sb.f_namemax = gesp->n4g_pc4.pc4_name_max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
		if (resbmap & FATTR4_MAXREAD_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
			IXDR_GET_U_HYPER(ptr, gesp->n4g_maxread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
		if (resbmap & FATTR4_MAXWRITE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
			IXDR_GET_U_HYPER(ptr, gesp->n4g_maxwrite);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
	    (FATTR4_MIMETYPE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
	    FATTR4_MODE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
	    FATTR4_NO_TRUNC_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
	    FATTR4_NUMLINKS_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
		if (resbmap & FATTR4_MIMETYPE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
		if (resbmap & FATTR4_MODE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
			vap->va_mode = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
			vap->va_mask |= AT_MODE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
		if (resbmap & FATTR4_NO_TRUNC_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
			truefalse = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
			gesp->n4g_pc4.pc4_no_trunc =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
				(truefalse ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
		if (resbmap & FATTR4_NUMLINKS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
			vap->va_nlink = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
			vap->va_mask |= AT_NLINK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
	    (FATTR4_OWNER_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
	    FATTR4_OWNER_GROUP_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
	    FATTR4_QUOTA_AVAIL_HARD_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
	    FATTR4_QUOTA_AVAIL_SOFT_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
		if (resbmap & FATTR4_OWNER_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
			uint_t *owner_length, ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
			char *owner_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
			utf8string ov;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
			/* get the OWNER_LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
			ol = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
			/* Manage the owner length location */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
			if (pug && ol <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
				owner_length = &pug->u_curr.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
				*owner_length = ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
				owner_length = &ol;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
			/* find memory to store the decode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
			if (*owner_length > MAX_OG_NAME || pug == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
				owner_val = (char *)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
				owner_val = (char *)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
			/* Optimize for matching if called for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
			if (pug &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
			    *owner_length == pug->u_last.utf8string_len &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
			    bcmp(owner_val, pug->u_last.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
					*owner_length) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
				vap->va_uid = pug->uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
				vap->va_mask |= AT_UID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
				uid_t uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
				ov.utf8string_len = *owner_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
				ov.utf8string_val = owner_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
				error = nfs_idmap_str_uid(&ov, &uid, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
				 * String was mapped, but to nobody because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
				 * we are nfsmapid, indicate it should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
				 * be cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
				if (error == ENOTSUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
					error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
						NFS4_GETATTR_NOCACHE_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
					garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
						NFS4_GETATTR_ATUID_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
					vap->va_uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
					vap->va_mask |= AT_UID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
					/* save the results for next time */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
					if (pug && ol <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
						pug->uid = uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
						pug->u_curr.utf8string_len =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
							ov.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
						bcopy(owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
						pug->u_curr.utf8string_val, ol);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
						U_SWAP_CURR_LAST(pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
			ptr += RNDUP(ol) / BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
		if (resbmap & FATTR4_OWNER_GROUP_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
			uint_t *group_length, gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
			char *group_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
			utf8string gv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
			/* get the OWNER_GROUP_LENGTH */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
			gl = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
			/* Manage the group length location */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
			if (pug && gl <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
				group_length = &pug->g_curr.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
				*group_length = gl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
				group_length = &gl;
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
			/* find memory to store the decode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
			if (*group_length > MAX_OG_NAME || pug == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
				group_val = (char *)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
				group_val = (char *)ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
			/* Optimize for matching if called for */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
			if (pug &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
			    *group_length == pug->g_last.utf8string_len &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
			    bcmp(group_val, pug->g_last.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
					*group_length) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
				vap->va_gid = pug->gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
				vap->va_mask |= AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
				uid_t gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
				gv.utf8string_len = *group_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
				gv.utf8string_val = group_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
				error = nfs_idmap_str_gid(&gv, &gid, FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
				 * String was mapped, but to nobody because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
				 * we are nfsmapid, indicate it should not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
				 * be cached.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
				if (error == ENOTSUP) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
					error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
						NFS4_GETATTR_NOCACHE_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
				if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
					garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
					garp->n4g_attrwhy =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
						NFS4_GETATTR_ATGID_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
				} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
					vap->va_gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
					vap->va_mask |= AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
					if (pug && gl <= MAX_OG_NAME) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
						pug->gid = gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
						pug->g_curr.utf8string_len =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
							gv.utf8string_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
						bcopy(group_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
						    pug->g_curr.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
						    gl);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
						G_SWAP_CURR_LAST(pug);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
					}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
			ptr += RNDUP(gl) / BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
		if (resbmap & FATTR4_QUOTA_AVAIL_HARD_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
		if (resbmap & FATTR4_QUOTA_AVAIL_SOFT_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
	    (FATTR4_QUOTA_USED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
	    FATTR4_SPACE_AVAIL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
	    FATTR4_SPACE_FREE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
	    FATTR4_SPACE_TOTAL_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
	    FATTR4_SPACE_USED_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
	    FATTR4_SYSTEM_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
		if (resbmap & FATTR4_QUOTA_USED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
		if (resbmap & FATTR4_RAWDEV_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
			fattr4_rawdev rawdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
			rawdev.specdata1 = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
			rawdev.specdata2 = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
			if (vap->va_type == VCHR || vap->va_type == VBLK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
				vap->va_rdev = makedevice(rawdev.specdata1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
							rawdev.specdata2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
				vap->va_rdev = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
			vap->va_mask |= AT_RDEV;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
		if (resbmap & FATTR4_SPACE_AVAIL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_bavail);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
			gesp->n4g_sb.f_bavail /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
		if (resbmap & FATTR4_SPACE_FREE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_bfree);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
			gesp->n4g_sb.f_bfree /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
		if (resbmap & FATTR4_SPACE_TOTAL_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
			IXDR_GET_U_HYPER(ptr, gesp->n4g_sb.f_blocks);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
			gesp->n4g_sb.f_blocks /= DEV_BSIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
		if (resbmap & FATTR4_SPACE_USED_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
			uint64_t space_used;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
			IXDR_GET_U_HYPER(ptr, space_used);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
			/* Compute space depending on device type */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
			ASSERT((vap->va_mask & AT_TYPE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
			if (vap->va_type == VREG || vap->va_type == VDIR ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
			    vap->va_type == VLNK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
				vap->va_nblocks = (u_longlong_t)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
					((space_used + (offset4)DEV_BSIZE -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
					(offset4)1) / (offset4)DEV_BSIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
				vap->va_nblocks = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
			vap->va_mask |= AT_NBLOCKS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
		if (resbmap & FATTR4_SYSTEM_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
	if (resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
	    (FATTR4_TIME_ACCESS_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
	    FATTR4_TIME_ACCESS_SET_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
	    FATTR4_TIME_BACKUP_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
	    FATTR4_TIME_CREATE_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
	    FATTR4_TIME_DELTA_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
	    FATTR4_TIME_METADATA_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
	    FATTR4_TIME_MODIFY_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
	    FATTR4_TIME_MODIFY_SET_MASK |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
	    FATTR4_MOUNTED_ON_FILEID_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
		if (resbmap & FATTR4_TIME_ACCESS_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
			nfstime4 atime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
			IXDR_GET_U_HYPER(ptr, atime.seconds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
			atime.nseconds = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
			error = nfs4_time_ntov(&atime, &vap->va_atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
				garp->n4g_attrwhy = NFS4_GETATTR_ATATIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
			vap->va_mask |= AT_ATIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
		if (resbmap & FATTR4_TIME_ACCESS_SET_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
		if (resbmap & FATTR4_TIME_BACKUP_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
		if (resbmap & FATTR4_TIME_CREATE_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
		if (resbmap & FATTR4_TIME_DELTA_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
			IXDR_GET_U_HYPER(ptr, gesp->n4g_delta.seconds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
			gesp->n4g_delta.nseconds = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
		if (resbmap & FATTR4_TIME_METADATA_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
			nfstime4 mdt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
			IXDR_GET_U_HYPER(ptr, mdt.seconds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
			mdt.nseconds = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
			error = nfs4_time_ntov(&mdt, &vap->va_ctime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
				garp->n4g_attrwhy = NFS4_GETATTR_ATCTIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
			vap->va_mask |= AT_CTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
		if (resbmap & FATTR4_TIME_MODIFY_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
			nfstime4 mtime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
			int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
			IXDR_GET_U_HYPER(ptr, mtime.seconds);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
			mtime.nseconds = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
			error = nfs4_time_ntov(&mtime, &vap->va_mtime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
			if (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
				garp->n4g_attrerr = error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
				garp->n4g_attrwhy = NFS4_GETATTR_ATMTIME_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
			vap->va_mask |= AT_MTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
		if (resbmap & FATTR4_TIME_MODIFY_SET_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
			ASSERT(0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
		if (resbmap & FATTR4_MOUNTED_ON_FILEID_MASK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
			IXDR_GET_U_HYPER(ptr, garp->n4g_mon_fid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
			garp->n4g_mon_fid_valid = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
	 * FATTR4_ACL_MASK is not yet supported by this function, but
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
	 * we check against it anyway, in case it ever is.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
	if (resbmap & ~(NFS4_VATTR_MASK | FATTR4_ACL_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
		/* copy only if not provided */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
		if (garp->n4g_ext_res == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
			garp->n4g_ext_res = kmem_alloc(sizeof (ges), KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
			bcopy(&ges, garp->n4g_ext_res, sizeof (ges));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
 * "." and ".." buffers for filling in on read and readdir
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
 * calls. Intialize the first time and fill in on every
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
 * call to to readdir.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
char	*nfs4_dot_entries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
char	*nfs4_dot_dot_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
 * Create the "." or ".." and pad the buffer once so they are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
 * copied out as required into the user supplied buffer everytime.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
 * DIRENT64_RECLEN(sizeof (".") - 1) = DIRENT64_RECLEN(1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
 * DIRENT64_RECLEN(sizeof ("..") - 1) = DIRENT64_RECLEN(2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
nfs4_init_dot_entries()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
	struct dirent64 *odp;
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
	 * zalloc it so it zeros the buffer out. Need
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
	 * to just do it once.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
	nfs4_dot_entries = kmem_zalloc(DIRENT64_RECLEN(1) + DIRENT64_RECLEN(2),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
	    KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
	odp = (struct dirent64 *)nfs4_dot_entries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
	odp->d_off = 1; /* magic cookie for "." entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
	odp->d_reclen = DIRENT64_RECLEN(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
	odp->d_name[0] = '.';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
	odp->d_name[1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
	nfs4_dot_dot_entry = nfs4_dot_entries + DIRENT64_RECLEN(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
	odp = (struct dirent64 *)nfs4_dot_dot_entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
	odp->d_off = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
	odp->d_reclen = DIRENT64_RECLEN(2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
	odp->d_name[0] = '.';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
	odp->d_name[1] = '.';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
	odp->d_name[2] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
nfs4_destroy_dot_entries()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
	if (nfs4_dot_entries)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
		kmem_free(nfs4_dot_entries, DIRENT64_RECLEN(1) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
		    DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
	nfs4_dot_entries = nfs4_dot_dot_entry = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
xdr_READDIR4res_clnt(XDR *xdrs, READDIR4res_clnt *objp, READDIR4args *aobjp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
	bool_t more_data;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
	rddir4_cache *rdc = aobjp->rdc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
	dirent64_t *dp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
	int entry_length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
	int space_left = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
	bitmap4 resbmap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
	uint32_t attrlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
	nfs4_ga_res_t gar;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
	struct nfs4_ga_ext_res ges;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
	uint64_t last_cookie = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
	int skip_to_end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
	ug_cache_t *pug = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
	ASSERT(xdrs->x_op == XDR_DECODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
	ASSERT(rdc->entries == NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
	ASSERT(aobjp->dircount > 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
	gar.n4g_va.va_mask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
	gar.n4g_change_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
	gar.n4g_mon_fid_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
	gar.n4g_fsid_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
	gar.n4g_vsa.vsa_mask = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
	gar.n4g_attrwhy = NFS4_GETATTR_OP_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
	ges.n4g_pc4.pc4_cache_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
	ges.n4g_pc4.pc4_xattr_valid = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
	gar.n4g_ext_res = &ges;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
	/* READDIR4res_clnt_free needs to kmem_free this buffer */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
	rdc->entries = kmem_alloc(aobjp->dircount, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
	dp = (dirent64_t *)rdc->entries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
	rdc->entlen = rdc->buflen = space_left = aobjp->dircount;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
	/* Fill in dot and dot-dot if needed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
	if (rdc->nfs4_cookie == (nfs_cookie4) 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
		    rdc->nfs4_cookie == (nfs_cookie4) 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
		if (rdc->nfs4_cookie == (nfs_cookie4)0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
			bcopy(nfs4_dot_entries, rdc->entries,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
				    DIRENT64_RECLEN(1) + DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
			objp->dotp = dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
			dp = (struct dirent64 *)(((char *)dp) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
							DIRENT64_RECLEN(1));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
			objp->dotdotp = dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
			dp = (struct dirent64 *)(((char *)dp) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
							DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
			space_left -= DIRENT64_RECLEN(1) + DIRENT64_RECLEN(2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
		} else	{	/* for ".." entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
			bcopy(nfs4_dot_dot_entry, rdc->entries,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
						DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
			objp->dotp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
			objp->dotdotp = dp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
			dp = (struct dirent64 *)(((char *)dp) +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
							DIRENT64_RECLEN(2));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
			space_left -= DIRENT64_RECLEN(2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
		/* Magic NFSv4 number for entry after start */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
		last_cookie = 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
	/* Get the cookie VERIFIER */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cookieverf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
		goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
	/* Get the do-we-have-a-next-entry BOOL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
	if (!xdr_bool(xdrs, &more_data))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
		goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
	if (aobjp->attr_request & (FATTR4_OWNER_MASK | FATTR4_OWNER_GROUP_MASK))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
		pug = alloc_ugcache();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
	skip_to_end = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
	while (more_data) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
		uint_t namelen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
		uint64_t cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
		/* Get the COOKIE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&cookie))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
		/* Get the LENGTH of the entry name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
		if (!xdr_u_int(xdrs, &namelen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
		if (!skip_to_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
			 * With the length of the directory entry name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
			 * in hand, figure out if there is room left
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
			 * to encode it for the requestor.  If not,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
			 * that is okay, but the rest of the readdir
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
			 * operation result must be decoded in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
			 * case there are following operations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
			 * in the compound request.  Therefore, mark
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
			 * the rest of the response as "skip" and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
			 * decode or skip the remaining data
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
			entry_length = DIRENT64_RECLEN(namelen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
			if (space_left < entry_length)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
				skip_to_end = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
		/* Get the NAME of the entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
		if (!skip_to_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
			if (!xdr_opaque(xdrs, dp->d_name, namelen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
				goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
			bzero(&dp->d_name[namelen],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
				DIRENT64_NAMELEN(entry_length) - namelen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
			dp->d_off = last_cookie = cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
			dp->d_reclen = entry_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
			if (!XDR_CONTROL(xdrs, XDR_SKIPBYTES, &namelen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
				goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
		/* Get the attribute BITMAP */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
		if (!xdr_bitmap4(xdrs, &resbmap))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
		/* Get the LENGTH of the attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
		if (!xdr_u_int(xdrs, (uint_t *)&attrlen))
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
		/* Get the ATTRIBUTES */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
		if (!skip_to_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
			uint32_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
			if (!(resbmap & FATTR4_ACL_MASK) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
			    (ptr = (uint32_t *)XDR_INLINE(xdrs, attrlen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
			    != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
				if (!xdr_ga_fattr_res_inline(ptr, &gar, resbmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
							aobjp->attr_request,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
							aobjp->mi, pug))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
					goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
			} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
				if (!xdr_ga_fattr_res(xdrs, &gar, resbmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
							aobjp->attr_request,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
							aobjp->mi, pug))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
					goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
			/* Fill in the d_ino per the server's fid values */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
			 * Important to note that the mounted on fileid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
			 * is returned in d_ino if supported.  This is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
			 * expected, readdir returns the mounted on fileid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
			 * while stat() returns the fileid of the object
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
			 * on "top" of the mount.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
			if (gar.n4g_mon_fid_valid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
				dp->d_ino = gar.n4g_mon_fid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
			else if (gar.n4g_va.va_mask & AT_NODEID)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
				dp->d_ino = gar.n4g_va.va_nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
				dp->d_ino = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
			/* See about creating an rnode for this entry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
			if ((resbmap &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
			    (NFS4_VATTR_MASK | FATTR4_FILEHANDLE_MASK)) ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
			    (NFS4_VATTR_MASK | FATTR4_FILEHANDLE_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
				nfs4_sharedfh_t *sfhp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
				vnode_t *vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
				sfhp = sfh4_put(&ges.n4g_fh_u.n4g_fh,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
							aobjp->mi, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
				vp = makenfs4node(sfhp, &gar,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
					aobjp->dvp->v_vfsp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
					aobjp->t,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
					aobjp->cr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
					aobjp->dvp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
					fn_get(VTOSV(aobjp->dvp)->sv_name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
						dp->d_name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
				sfh4_rele(&sfhp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
				dnlc_update(aobjp->dvp, dp->d_name, vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
				VN_RELE(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
			dp = (struct dirent64 *)(((caddr_t)dp) + dp->d_reclen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
			space_left -= entry_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
			if (!XDR_CONTROL(xdrs, XDR_SKIPBYTES, &attrlen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
				goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
		/* Get the do-we-have-a-next-entry BOOL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
		if (!xdr_bool(xdrs, &more_data))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
			goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
	if (pug) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
		kmem_free(pug, sizeof (ug_cache_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
		pug = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
	 * Finish up the rddir cache
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
	 * If no entries were returned, free up buffer &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
	 * set ncookie to the starting cookie for this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
	 * readdir request so that the direof caching
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
	 * will work properly.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
	ASSERT(rdc->entries);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
	if (last_cookie == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
		kmem_free(rdc->entries, rdc->entlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
		rdc->entries = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
		last_cookie = rdc->nfs4_cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
	rdc->actlen = rdc->entlen - space_left;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
	rdc->nfs4_ncookie = last_cookie;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
	/* Get the EOF marker */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
	if (!xdr_bool(xdrs, &objp->eof))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
		goto noentries;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
	 * If the server returns eof and there were no
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
	 * skipped entries, set eof
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
	rdc->eof = (objp->eof && !skip_to_end) ? TRUE : FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
	 * If we encoded entries we are done
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
	if (rdc->entries) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
		rdc->error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
	 * If there were no entries and we skipped because
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
	 * there was not enough space, return EINVAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
	if (skip_to_end) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
		rdc->error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
	 * No entries, nothing skipped, and EOF, return OK.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
	if (objp->eof == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
		rdc->error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
	 * No entries, nothing skipped, and not EOF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
	 * probably a bad cookie, return ENOENT.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
	rdc->error = ENOENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
noentries:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
	if (rdc->entries) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
		kmem_free(rdc->entries, rdc->entlen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
		rdc->entries = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
	if (pug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
		kmem_free(pug, sizeof (ug_cache_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
	rdc->error = EIO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
 * xdr_ga_res
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
 * Returns: FALSE on raw data processing errors, TRUE otherwise.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
 * This function pre-processes the OP_GETATTR response, and then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
 * calls common routines to process the GETATTR fattr4 results into
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
 * vnode attributes and other components that the client is interested
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
 * in. If an error other than an RPC error is encountered, the details
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
 * of the error are filled into objp, although the result of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
 * processing is set to TRUE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
xdr_ga_res(XDR *xdrs, GETATTR4res *objp, GETATTR4args *aobjp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
	uint32_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
	bitmap4 resbmap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
	uint32_t attrlen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
	ASSERT(xdrs->x_op == XDR_DECODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
	/* Initialize objp attribute error values */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
	objp->ga_res.n4g_attrerr =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
		objp->ga_res.n4g_attrwhy = NFS4_GETATTR_OP_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
	if (!xdr_bitmap4(xdrs, &resbmap))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
	/* save the response bitmap for the caller */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
	objp->ga_res.n4g_resbmap = resbmap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
	/* attrlen */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
	if (!XDR_GETINT32(xdrs, (int32_t *)&attrlen))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
	 * Handle case where request and response bitmaps don't match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
	if (aobjp->attr_request && aobjp->attr_request != resbmap) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
		bitmap4 deltabmap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
		 * Return error for case where server sent extra attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
		 * because the "unknown" attributes may be anywhere in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
		 * xdr stream and can't be properly processed.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
		deltabmap = ((aobjp->attr_request ^ resbmap) & resbmap);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
		if (deltabmap) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
			objp->ga_res.n4g_attrerr = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
			objp->ga_res.n4g_attrwhy = NFS4_GETATTR_BITMAP_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
		 * Return error for case where there is a mandatory
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
		 * attribute missing in the server response. Note that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
		 * missing recommended attributes are evaluated in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
		 * specific routines that decode the server response.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
		deltabmap = ((aobjp->attr_request ^ resbmap)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
				& aobjp->attr_request);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
		if ((deltabmap & FATTR4_MANDATTR_MASK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
			objp->ga_res.n4g_attrerr = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
			objp->ga_res.n4g_attrwhy = NFS4_GETATTR_MANDATTR_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
	/* Check to see if the attrs can be inlined and go for it if so */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
	if (!(resbmap & FATTR4_ACL_MASK) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
	    (ptr = (uint32_t *)XDR_INLINE(xdrs, attrlen)) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
		return (xdr_ga_fattr_res_inline(ptr, &objp->ga_res,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
					resbmap, aobjp->attr_request,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
					aobjp->mi, NULL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
	else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
		return (xdr_ga_fattr_res(xdrs, &objp->ga_res,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
					resbmap, aobjp->attr_request,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
					aobjp->mi, NULL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
#if defined(DEBUG) && !defined(lint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
 * We assume that an enum is a 32-bit value, check it once
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
static enum szchk { SZVAL } szchkvar;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
xdr_settime4(XDR *xdrs, settime4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
#if defined(DEBUG) && !defined(lint)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
	ASSERT(sizeof (szchkvar) == sizeof (int32_t));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
	if (!xdr_int(xdrs, (int *)&objp->set_it))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
	if (objp->set_it != SET_TO_CLIENT_TIME4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
	/* xdr_nfstime4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
	if (!xdr_longlong_t(xdrs, (longlong_t *)&objp->time.seconds))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
	return (xdr_u_int(xdrs, &objp->time.nseconds));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
xdr_fattr4(XDR *xdrs, fattr4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
		if (!xdr_bitmap4(xdrs, &objp->attrmask))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
		return (xdr_bytes(xdrs, (char **)&objp->attrlist4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
			(uint_t *)&objp->attrlist4_len, NFS4_FATTR4_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
	}
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
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
	if (objp->attrlist4 != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
		kmem_free(objp->attrlist4, objp->attrlist4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
xdr_ACCESS4res(XDR *xdrs, ACCESS4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
	if (!xdr_u_int(xdrs, &objp->supported))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
	return (xdr_u_int(xdrs, &objp->access));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
xdr_CLOSE4args(XDR *xdrs, CLOSE4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
	if (!xdr_u_int(xdrs, &objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
	return (xdr_opaque(xdrs, objp->open_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
xdr_CLOSE4res(XDR *xdrs, CLOSE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
	return (xdr_opaque(xdrs, objp->open_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
xdr_CREATE4args(XDR *xdrs, CREATE4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
		if (!xdr_int(xdrs, (int32_t *)&objp->type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
		switch (objp->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
		case NF4LNK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
			if (!xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
			    (char **)&objp->ftype4_u.linkdata.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
			    (uint_t *)&objp->ftype4_u.linkdata.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
			    NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
		case NF4BLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
		case NF4CHR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
			if (!xdr_u_int(xdrs, &objp->ftype4_u.devdata.specdata1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
			if (!xdr_u_int(xdrs, &objp->ftype4_u.devdata.specdata2))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
		case NF4SOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
		case NF4FIFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
		case NF4DIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
			break;	/* server should return NFS4ERR_BADTYPE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
		if (!xdr_bytes(xdrs, (char **)&objp->objname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
				(uint_t *)&objp->objname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
				NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
		return (xdr_fattr4(xdrs, &objp->createattrs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
	if (objp->type == NF4LNK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
		if (objp->ftype4_u.linkdata.utf8string_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
			kmem_free(objp->ftype4_u.linkdata.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
				objp->ftype4_u.linkdata.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
	if (objp->objname.utf8string_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
		kmem_free(objp->objname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
			objp->objname.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
	return (xdr_fattr4(xdrs, &objp->createattrs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
xdr_CREATE4cargs(XDR *xdrs, CREATE4cargs *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
	ASSERT(xdrs->x_op == XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
	if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
	switch (objp->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
	case NF4LNK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
		len = strlen(objp->ftype4_u.clinkdata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
		if (!XDR_PUTINT32(xdrs, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
		if (!xdr_opaque(xdrs, objp->ftype4_u.clinkdata, len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
	case NF4BLK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
	case NF4CHR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
		if (!XDR_PUTINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
				(int32_t *)&objp->ftype4_u.devdata.specdata1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
		if (!XDR_PUTINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
				(int32_t *)&objp->ftype4_u.devdata.specdata2))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
	case NF4SOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
	case NF4FIFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
	case NF4DIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
		break;	/* server should return NFS4ERR_BADTYPE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
	len = strlen(objp->cname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
	if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
	if (!XDR_PUTINT32(xdrs, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
	if (!xdr_opaque(xdrs, objp->cname, len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
	return (xdr_fattr4(xdrs, &objp->createattrs));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
xdr_CREATE4res(XDR *xdrs, CREATE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
	if (!xdr_bool(xdrs, &objp->cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.after))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
	return (xdr_bitmap4(xdrs, &objp->attrset));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
xdr_LINK4res(XDR *xdrs, LINK4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
	if (!xdr_bool(xdrs, &objp->cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
	return (xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.after));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
xdr_LOCK4args(XDR *xdrs, LOCK4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
		if (!xdr_int(xdrs, (int *)&objp->locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
		if (!xdr_bool(xdrs, &objp->reclaim))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->length))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
		if (!xdr_bool(xdrs, &objp->locker.new_lock_owner))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
		if (objp->locker.new_lock_owner == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
			if (!xdr_u_int(xdrs, &objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
							open_seqid))
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_int(xdrs, &objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
							open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
			if (!xdr_opaque(xdrs, objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
							open_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
				    12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
			if (!xdr_u_int(xdrs, &objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
							lock_seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
				    (u_longlong_t *)&objp->locker.locker4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
					open_owner.lock_owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
			return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
				(char **)&objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
				    lock_owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
				(uint_t *)&objp->locker.locker4_u.open_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
				    lock_owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
				NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
		if (objp->locker.new_lock_owner != FALSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
		if (!xdr_u_int(xdrs, &objp->locker.locker4_u.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
							lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
		if (!xdr_opaque(xdrs, objp->locker.locker4_u.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
							lock_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
			    12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
		return (xdr_u_int(xdrs, &objp->locker.locker4_u.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
							lock_seqid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
	if (objp->locker.new_lock_owner == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
		if (objp->locker.locker4_u.open_owner.lock_owner.owner_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
								NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
			kmem_free(objp->locker.locker4_u.open_owner.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
							owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
				objp->locker.locker4_u.open_owner.lock_owner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
							owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
xdr_LOCK4res(XDR *xdrs, LOCK4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
		if (objp->status == NFS4_OK) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
			if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
					&objp->LOCK4res_u.lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
				objp->LOCK4res_u.lock_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
		if (objp->status != NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->LOCK4res_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
				denied.offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->LOCK4res_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
				denied.length))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
		if (!xdr_int(xdrs, (int *)&objp->LOCK4res_u.denied.locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->LOCK4res_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
				denied.owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
			    (char **)&objp->LOCK4res_u.denied.owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
			    (uint_t *)&objp->LOCK4res_u.denied.owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
			    NFS4_OPAQUE_LIMIT));
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
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
	if (objp->status == NFS4_OK || objp->status != NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
	if (objp->LOCK4res_u.denied.owner.owner_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
		kmem_free(objp->LOCK4res_u.denied.owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
			objp->LOCK4res_u.denied.owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
xdr_LOCKT4args(XDR *xdrs, LOCKT4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
		if (!xdr_int(xdrs, (int *)&objp->locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->length))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
					(u_longlong_t *)&objp->owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
		return (xdr_bytes(xdrs, (char **)&objp->owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
			(uint_t *)&objp->owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
			NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
	if (objp->owner.owner_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
		kmem_free(objp->owner.owner_val, objp->owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
	return (TRUE);
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
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
xdr_LOCKT4res(XDR *xdrs, LOCKT4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
		if (objp->status == NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
		if (objp->status != NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
		/* xdr_LOCK4denied */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
					(u_longlong_t *)&objp->denied.offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
					(u_longlong_t *)&objp->denied.length))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
		if (!xdr_int(xdrs, (int *)&objp->denied.locktype))
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,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
				(u_longlong_t *)&objp->denied.owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
		    (char **)&objp->denied.owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
		    (uint_t *)&objp->denied.owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
		    NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
	}
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
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
	if (objp->status == NFS4_OK || objp->status != NFS4ERR_DENIED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
	if (objp->denied.owner.owner_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
		kmem_free(objp->denied.owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
				objp->denied.owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
xdr_LOCKU4args(XDR *xdrs, LOCKU4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
	if (!xdr_int(xdrs, (int *)&objp->locktype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
	if (!xdr_u_int(xdrs, &objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
	if (!xdr_u_int(xdrs, &objp->lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
	if (!xdr_opaque(xdrs, objp->lock_stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
	return (xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->length));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
xdr_OPEN4args(XDR *xdrs, OPEN4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
		if (!xdr_u_int(xdrs, &objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
		if (!xdr_u_int(xdrs, &objp->share_access))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
		if (!xdr_u_int(xdrs, &objp->share_deny))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
		/* xdr_open_owner4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
					(u_longlong_t *)&objp->owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
		if (!xdr_bytes(xdrs, (char **)&objp->owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
				(uint_t *)&objp->owner.owner_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
				NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
		/* xdr_openflag4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
		if (!xdr_int(xdrs, (int *)&objp->opentype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
		if (objp->opentype == OPEN4_CREATE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
			/* xdr_createhow4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
			if (!xdr_int(xdrs, (int *)&objp->mode))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
			switch (objp->mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
			case UNCHECKED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
			case GUARDED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
				if (!xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
					    &objp->createhow4_u.createattrs))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
			case EXCLUSIVE4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
				if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
				    (u_longlong_t *)&objp->createhow4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
				    createverf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
		/* xdr_open_claim4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
		if (!xdr_int(xdrs, (int *)&objp->claim))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
		switch (objp->claim) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
		case CLAIM_NULL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
			return (xdr_bytes(xdrs, (char **)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
					file.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
				(uint_t *)&objp->open_claim4_u.file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
					utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
				NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
		case CLAIM_PREVIOUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
			return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
				(int *)&objp->open_claim4_u.delegate_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
		case CLAIM_DELEGATE_CUR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
			if (!xdr_u_int(xdrs, (uint_t *)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
				    delegate_cur_info.delegate_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
			if (!xdr_opaque(xdrs, objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
				    delegate_cur_info.delegate_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
				    12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
			return (xdr_bytes(xdrs, (char **)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
				delegate_cur_info.file.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753
			    (uint_t *)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2754
				delegate_cur_info.file.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2755
			    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2756
		case CLAIM_DELEGATE_PREV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2757
			return (xdr_bytes(xdrs, (char **)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2758
				file_delegate_prev.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2759
			    (uint_t *)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2760
				file_delegate_prev.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2761
			    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2762
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2763
			return (FALSE);
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2767
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2768
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2769
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2770
	if (objp->owner.owner_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2771
		kmem_free(objp->owner.owner_val, objp->owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2773
	if (objp->opentype == OPEN4_CREATE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2774
		switch (objp->mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2775
		case UNCHECKED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2776
		case GUARDED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2777
			(void) xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2778
					&objp->createhow4_u.createattrs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2779
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2780
		case EXCLUSIVE4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2781
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2782
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2783
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2784
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2785
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2786
	switch (objp->claim) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2787
	case CLAIM_NULL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2788
		if (objp->open_claim4_u.file.utf8string_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2789
			kmem_free(objp->open_claim4_u.file.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2790
				objp->open_claim4_u.file.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2791
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2792
	case CLAIM_PREVIOUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2793
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2794
	case CLAIM_DELEGATE_CUR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2795
		if (objp->open_claim4_u.delegate_cur_info.file.utf8string_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2796
								NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2797
			kmem_free(objp->open_claim4_u.delegate_cur_info.file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2798
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2799
				objp->open_claim4_u.delegate_cur_info.file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2800
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2801
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2802
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2803
	case CLAIM_DELEGATE_PREV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2804
		if (objp->open_claim4_u.file_delegate_prev.utf8string_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2805
								NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2806
			kmem_free(objp->open_claim4_u.file_delegate_prev.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2807
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2808
				objp->open_claim4_u.file_delegate_prev.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2809
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2810
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2811
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2812
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2813
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2814
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2815
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2816
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2817
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2818
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2819
xdr_OPEN4cargs(XDR *xdrs, OPEN4cargs *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2820
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2821
	int op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2822
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2823
	rpc_inline_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2824
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2825
	ASSERT(xdrs->x_op == XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2826
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2827
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2828
	 * We must always define the client's open_owner to be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2829
	 * 4 byte aligned and sized.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2830
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2831
	ASSERT(objp->owner.owner_len <= NFS4_OPAQUE_LIMIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2832
	ASSERT(!(objp->owner.owner_len % BYTES_PER_XDR_UNIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2834
	len = objp->owner.owner_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2835
	if ((ptr = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT + len)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2836
		int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2837
		int32_t *ip;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2839
		IXDR_PUT_U_INT32(ptr, OP_OPEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2840
		IXDR_PUT_U_INT32(ptr, objp->seqid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2841
		IXDR_PUT_U_INT32(ptr, objp->share_access);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2842
		IXDR_PUT_U_INT32(ptr, objp->share_deny);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
		/* xdr_open_owner4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
		IXDR_PUT_HYPER(ptr, objp->owner.clientid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
		IXDR_PUT_U_INT32(ptr, objp->owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
		/* We know this is very short so don't bcopy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
		ip = (int32_t *)objp->owner.owner_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
		len /= BYTES_PER_XDR_UNIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
		for (i = 0; i < len; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
			*ptr++ = *ip++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
		/* xdr_openflag4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
		IXDR_PUT_U_INT32(ptr, objp->opentype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
		op = OP_OPEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
		if (!XDR_PUTINT32(xdrs, (int32_t *)&op))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->share_access))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->share_deny))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
		/* xdr_open_owner4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2868
				(u_longlong_t *)&objp->owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->owner.owner_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
		if (!xdr_opaque(xdrs, objp->owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
				objp->owner.owner_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
		/* xdr_openflag4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->opentype))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
	if (objp->opentype == OPEN4_CREATE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
		/* xdr_createhow4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->mode))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
		switch (objp->mode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
		case UNCHECKED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
		case GUARDED4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
			if (!xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
				    &objp->createhow4_u.createattrs))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
		case EXCLUSIVE4:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
			    (u_longlong_t *)&objp->createhow4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
			    createverf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2899
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2901
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2903
	/* xdr_open_claim4 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
	if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->claim))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
	switch (objp->claim) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
	case CLAIM_NULL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
		len = strlen(objp->open_claim4_u.cfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2912
		if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
				objp->open_claim4_u.cfile, len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
	case CLAIM_PREVIOUS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
		return (XDR_PUTINT32(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
			(int32_t *)&objp->open_claim4_u.delegate_type));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
	case CLAIM_DELEGATE_CUR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
		if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
				delegate_cur_info.delegate_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
		if (!xdr_opaque(xdrs, objp->open_claim4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
				delegate_cur_info.delegate_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
				12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
		len = strlen(objp->open_claim4_u.delegate_cur_info.cfile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2931
		if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2932
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2933
				objp->open_claim4_u.delegate_cur_info.cfile,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2934
				len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2935
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2936
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2937
	case CLAIM_DELEGATE_PREV:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2938
		len = strlen(objp->open_claim4_u.cfile_delegate_prev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2939
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2940
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2941
		if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2942
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2943
				objp->open_claim4_u.cfile_delegate_prev, len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2944
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2945
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2946
	default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2947
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2948
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2949
	/* NOTREACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2950
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2951
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2952
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2953
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2954
xdr_OPEN4res(XDR *xdrs, OPEN4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2955
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2956
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2957
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2958
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2959
		if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2960
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2961
		if (!xdr_u_int(xdrs, &objp->stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2962
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2963
		if (!xdr_opaque(xdrs, objp->stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2964
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2965
		if (!xdr_bool(xdrs, &objp->cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2966
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2967
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2968
				(u_longlong_t *)&objp->cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2969
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2970
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.after))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2971
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2972
		if (!xdr_u_int(xdrs, &objp->rflags))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2973
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2974
		if (!xdr_bitmap4(xdrs, &objp->attrset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2975
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2976
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2977
			    (int *)&objp->delegation.delegation_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2978
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2979
		switch (objp->delegation.delegation_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2980
		case OPEN_DELEGATE_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2981
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2982
		case OPEN_DELEGATE_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2983
			if (!xdr_u_int(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2984
					open_delegation4_u.read.stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2985
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2986
			if (!xdr_opaque(xdrs, objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2987
					open_delegation4_u.read.stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2988
					12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2989
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2990
			if (!xdr_bool(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2991
					open_delegation4_u.read.recall))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2992
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2993
			return (xdr_nfsace4(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2994
					open_delegation4_u.read.permissions));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2995
		case OPEN_DELEGATE_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2996
			if (!xdr_u_int(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2997
					open_delegation4_u.write.stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2998
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2999
			if (!xdr_opaque(xdrs, objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3000
					open_delegation4_u.write.stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3001
					12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3002
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3003
			if (!xdr_bool(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3004
					open_delegation4_u.write.recall))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3005
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3006
			if (!xdr_int(xdrs, (int *)&objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3007
					open_delegation4_u.write.space_limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3008
					limitby))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3009
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3010
			switch (objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3011
					open_delegation4_u.write.space_limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3012
					limitby) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3013
			case NFS_LIMIT_SIZE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3014
				if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3015
				    (u_longlong_t *)&objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3016
				    open_delegation4_u.write.space_limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3017
				    nfs_space_limit4_u.filesize))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3018
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3019
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3020
			case NFS_LIMIT_BLOCKS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3021
				if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3022
				    &objp->delegation.open_delegation4_u.write.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3023
				    space_limit.nfs_space_limit4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3024
				    mod_blocks.num_blocks))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3025
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3026
				if (!xdr_u_int(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3027
				    open_delegation4_u.write.space_limit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3028
				    nfs_space_limit4_u.mod_blocks.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3029
				    bytes_per_block))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3030
					return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3031
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3032
			default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3033
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3034
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3035
			return (xdr_nfsace4(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3036
			    open_delegation4_u.write.permissions));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3037
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3038
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3039
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3040
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3041
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3042
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3043
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3044
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3045
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3046
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3047
	switch (objp->delegation.delegation_type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3048
	case OPEN_DELEGATE_NONE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3049
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3050
	case OPEN_DELEGATE_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3051
		return (xdr_nfsace4(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3052
					open_delegation4_u.read.permissions));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3053
	case OPEN_DELEGATE_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3054
		switch (objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3055
				open_delegation4_u.write.space_limit.limitby) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3056
		case NFS_LIMIT_SIZE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3057
		case NFS_LIMIT_BLOCKS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3058
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3059
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3060
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3061
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3062
		return (xdr_nfsace4(xdrs, &objp->delegation.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3063
				open_delegation4_u.write.permissions));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3064
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3065
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3066
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3067
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3068
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3069
xdr_OPEN_CONFIRM4res(XDR *xdrs, OPEN_CONFIRM4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3070
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3071
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3072
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3073
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3074
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3075
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3076
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3077
	return (xdr_opaque(xdrs, objp->open_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3078
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3079
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3080
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3081
xdr_OPEN_DOWNGRADE4args(XDR *xdrs, OPEN_DOWNGRADE4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3082
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3083
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3084
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3085
	if (!xdr_opaque(xdrs, objp->open_stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3086
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3087
	if (!xdr_u_int(xdrs, &objp->seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3088
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3089
	if (!xdr_u_int(xdrs, &objp->share_access))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3090
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3091
	return (xdr_u_int(xdrs, &objp->share_deny));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3092
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3093
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3094
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3095
xdr_OPEN_DOWNGRADE4res(XDR *xdrs, OPEN_DOWNGRADE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3096
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3097
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3098
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3099
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3100
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3101
	if (!xdr_u_int(xdrs, &objp->open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3102
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3103
	return (xdr_opaque(xdrs, objp->open_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3104
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3105
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3106
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3107
xdr_READ4args(XDR *xdrs, READ4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3108
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3109
	if (!xdr_u_int(xdrs, &objp->stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3110
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3111
	if (!xdr_opaque(xdrs, objp->stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3112
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3113
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3114
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3115
	return (xdr_u_int(xdrs, &objp->count));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3116
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3117
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3118
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3119
xdr_READ4res(XDR *xdrs, READ4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3120
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3121
	int i, rndup;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3122
	mblk_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3123
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3124
	if (xdrs->x_op == XDR_DECODE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3125
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3127
	if (xdrs->x_op == XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3128
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3129
		 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3130
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3131
		if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3132
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3133
		if (objp->data_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3134
			kmem_free(objp->data_val, objp->data_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3135
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3136
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3137
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3138
	/* on with ENCODE paths */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3139
	if (!XDR_PUTINT32(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3140
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3141
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3142
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3144
	if (!XDR_PUTINT32(xdrs, &objp->eof))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3145
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3147
	mp = objp->mblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3148
	if (mp != NULL && xdrs->x_ops == &xdrmblk_ops) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3149
		mp->b_wptr += objp->data_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3150
		rndup = BYTES_PER_XDR_UNIT -
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3151
			(objp->data_len % BYTES_PER_XDR_UNIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3152
		if (rndup != BYTES_PER_XDR_UNIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3153
			for (i = 0; i < rndup; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3154
				*mp->b_wptr++ = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3155
		if (xdrmblk_putmblk(xdrs, mp, objp->data_len) == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3156
			objp->mblk = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3157
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3158
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3159
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3160
	return (xdr_bytes(xdrs, (char **)&objp->data_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3161
			(uint_t *)&objp->data_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3162
			objp->data_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3163
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3164
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3165
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3166
xdr_READ4res_clnt(XDR *xdrs, READ4res *objp, READ4args *aobjp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3167
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3168
	mblk_t *mp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3169
	size_t n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3170
	int error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3171
	uint_t size = aobjp->res_maxsize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3173
	if (xdrs->x_op == XDR_ENCODE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3174
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3175
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3176
	if (xdrs->x_op == XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3177
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3178
		 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3179
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3180
		if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3181
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3182
		if (objp->data_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3183
			kmem_free(objp->data_val, objp->data_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3184
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3185
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3186
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3187
	if (!XDR_GETINT32(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3188
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3189
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3190
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3191
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3192
	if (!XDR_GETINT32(xdrs, &objp->eof))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3193
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3194
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3195
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3196
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3197
	 * This is a special case such that the caller is providing a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3198
	 * uio as a guide to eventual data location; this is used for
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3199
	 * handling DIRECTIO reads.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3200
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3201
	if (aobjp->res_uiop != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3202
		struct uio *uiop = aobjp->res_uiop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3203
		int32_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3205
		if (xdrs->x_ops == &xdrmblk_ops) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3206
			if (!xdrmblk_getmblk(xdrs, &mp, &objp->data_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3207
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3208
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3209
			if (objp->data_len == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3210
				return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3212
			if (objp->data_len > size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3213
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3215
			size = objp->data_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3216
			do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3217
				n = MIN(size, mp->b_wptr - mp->b_rptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3218
				if ((n = MIN(uiop->uio_resid, n)) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3219
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3220
					error =	uiomove((char *)mp->b_rptr, n,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3221
							UIO_READ, uiop);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3222
					if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3223
						return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3224
					mp->b_rptr += n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3225
					size -= n;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3226
				}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3227
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3228
				while (mp && (mp->b_rptr >= mp->b_wptr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3229
					mp = mp->b_cont;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3230
			} while (mp && size > 0 && uiop->uio_resid > 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3232
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3233
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3235
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3236
		 * This isn't an xdrmblk stream.   Handle the likely
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3237
		 * case that it can be inlined (ex. xdrmem).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3238
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3239
		if (!XDR_GETINT32(xdrs, (int32_t *)&objp->data_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3240
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3242
		if (objp->data_len == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3243
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3245
		if (objp->data_len > size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3246
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3248
		size = (int)objp->data_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3249
		if ((ptr = XDR_INLINE(xdrs, size)) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3250
			return (uiomove(ptr, size, UIO_READ, uiop) ?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3251
				FALSE : TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3253
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3254
		 * Handle some other (unlikely) stream type that will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3255
		 * need a copy.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3256
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3257
		if ((ptr = kmem_alloc(size, KM_NOSLEEP)) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3258
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3260
		if (!XDR_GETBYTES(xdrs, (caddr_t)ptr, size)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3261
			kmem_free(ptr, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3262
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3263
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3264
		error = uiomove(ptr, size, UIO_READ, uiop);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3265
		kmem_free(ptr, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3267
		return (error ? FALSE : TRUE);
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
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3271
	 * Check for the other special case of the caller providing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3272
	 * the target area for the data.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3273
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3274
	if (aobjp->res_data_val_alt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3275
		return (xdr_bytes(xdrs, (char **)&aobjp->res_data_val_alt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3276
				(uint_t *)&objp->data_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3277
				aobjp->res_maxsize));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3279
	/* caller didn't set things up right if we got this far */
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3283
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3284
xdr_READDIR4args(XDR *xdrs, READDIR4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3285
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3286
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cookie))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3287
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3288
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cookieverf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3289
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3290
	if (!xdr_u_int(xdrs, &objp->dircount))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3291
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3292
	if (!xdr_u_int(xdrs, &objp->maxcount))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3293
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3294
	return (xdr_bitmap4(xdrs, &objp->attr_request));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3295
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3297
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3298
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3299
xdrmblk_putmblk_rd(XDR *xdrs, mblk_t *m)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3300
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3301
	if (((m->b_wptr - m->b_rptr) % BYTES_PER_XDR_UNIT) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3302
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3304
	/* LINTED pointer alignment */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3305
	((mblk_t *)xdrs->x_base)->b_cont = m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3306
	xdrs->x_base = (caddr_t)m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3307
	xdrs->x_handy = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3308
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3309
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3311
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3312
xdr_READDIR4res(XDR *xdrs, READDIR4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3313
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3314
	mblk_t *mp = objp->mblk;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3315
	bool_t ret_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3316
	uint_t flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3317
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3318
	ASSERT(xdrs->x_op == XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3320
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3321
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3322
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3323
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3324
	if (mp == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3325
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3327
	if (xdrs->x_ops == &xdrmblk_ops) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3328
		if (xdrmblk_putmblk_rd(xdrs, mp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3329
				    == TRUE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3330
			/* mblk successfully inserted into outgoing chain */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3331
			objp->mblk = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3332
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3333
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3334
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3336
	ASSERT(mp->b_cont == NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3337
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3338
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3339
	 * If running over RDMA, the pre-encoded m_blk needs to be moved
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3340
	 * without being chunked.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3341
	 * Check if chunking is disabled for this xdr stream. If not disable
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3342
	 * it for this op and then enable it back on.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3343
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3344
	XDR_CONTROL(xdrs, XDR_RDMAGET, &flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3345
	if (flags & RDMA_NOCHUNK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3346
		return (xdr_opaque(xdrs, (char *)mp->b_rptr, objp->data_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3348
	flags |= RDMA_NOCHUNK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3349
	(void) XDR_CONTROL(xdrs, XDR_RDMASET, &flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3350
	ret_val = xdr_opaque(xdrs, (char *)mp->b_rptr, objp->data_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3351
	flags &= ~RDMA_NOCHUNK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3352
	(void) XDR_CONTROL(xdrs, XDR_RDMASET, &flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3353
	return (ret_val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3354
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3356
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3357
xdr_READLINK4res(XDR *xdrs, READLINK4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3358
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3359
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3360
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3361
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3362
		if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3363
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3364
		return (xdr_bytes(xdrs, (char **)&objp->link.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3365
			(uint_t *)&objp->link.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3366
			NFS4_MAX_UTF8STRING));
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
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3371
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3372
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3373
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3374
	if (objp->link.utf8string_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3375
		kmem_free(objp->link.utf8string_val, objp->link.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3376
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3377
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3379
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3380
xdr_REMOVE4res(XDR *xdrs, REMOVE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3381
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3382
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3383
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3384
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3385
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3386
	if (!xdr_bool(xdrs, &objp->cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3387
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3388
	if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3389
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3390
	return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3391
		(u_longlong_t *)&objp->cinfo.after));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3392
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3394
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3395
xdr_RENAME4res(XDR *xdrs, RENAME4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3396
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3397
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3398
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3399
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3400
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3401
	if (!xdr_bool(xdrs, &objp->source_cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3402
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3403
	if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3404
	    (u_longlong_t *)&objp->source_cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3405
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3406
	if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3407
	    (u_longlong_t *)&objp->source_cinfo.after))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3408
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3409
	if (!xdr_bool(xdrs, &objp->target_cinfo.atomic))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3410
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3411
	if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3412
	    (u_longlong_t *)&objp->target_cinfo.before))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3413
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3414
	return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3415
		(u_longlong_t *)&objp->target_cinfo.after));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3416
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3418
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3419
xdr_secinfo4(XDR *xdrs, secinfo4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3420
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3421
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3422
		if (!xdr_u_int(xdrs, &objp->flavor))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3423
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3424
		if (objp->flavor != RPCSEC_GSS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3425
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3426
		if (!xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3427
			    (char **)&objp->flavor_info.oid.sec_oid4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3428
			    (uint_t *)&objp->flavor_info.oid.sec_oid4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3429
			    NFS4_MAX_SECOID4))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3430
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3431
		if (!xdr_u_int(xdrs, &objp->flavor_info.qop))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3432
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3433
		return (xdr_int(xdrs, (int *)&objp->flavor_info.service));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3434
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3436
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3437
	 * Optimized free path
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3438
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3439
	if (objp->flavor != RPCSEC_GSS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3440
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3442
	if (objp->flavor_info.oid.sec_oid4_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3443
		kmem_free(objp->flavor_info.oid.sec_oid4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3444
			objp->flavor_info.oid.sec_oid4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3445
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3446
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3447
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3448
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3449
xdr_SETCLIENTID4args(XDR *xdrs, SETCLIENTID4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3450
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3451
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3452
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3453
					(u_longlong_t *)&objp->client.verifier))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3454
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3455
		if (!xdr_bytes(xdrs, (char **)&objp->client.id_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3456
			    (uint_t *)&objp->client.id_len, NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3457
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3458
		if (!xdr_u_int(xdrs, &objp->callback.cb_program))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3459
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3460
		if (!xdr_string(xdrs, &objp->callback.cb_location.r_netid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3461
						NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3462
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3463
		if (!xdr_string(xdrs, &objp->callback.cb_location.r_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3464
						NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3465
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3466
		return (xdr_u_int(xdrs, &objp->callback_ident));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3467
	}
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
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3471
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3472
	if (objp->client.id_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3473
		kmem_free(objp->client.id_val, objp->client.id_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3474
	(void) xdr_string(xdrs, &objp->callback.cb_location.r_netid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3475
							NFS4_OPAQUE_LIMIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3476
	return (xdr_string(xdrs, &objp->callback.cb_location.r_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3477
							NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3478
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3480
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3481
xdr_SETCLIENTID4res(XDR *xdrs, SETCLIENTID4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3482
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3483
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3484
		if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3485
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3486
		switch (objp->status) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3487
		case NFS4_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3488
			if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3489
			    (u_longlong_t *)&objp->SETCLIENTID4res_u.resok4.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3490
			    clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3491
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3492
			return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3493
			    (u_longlong_t *)&objp->SETCLIENTID4res_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3494
						resok4.setclientid_confirm));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3495
		case NFS4ERR_CLID_INUSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3496
			if (!xdr_string(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3497
				    &objp->SETCLIENTID4res_u.client_using.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3498
				    r_netid, 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_string(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3501
				    &objp->SETCLIENTID4res_u.client_using.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3502
				    r_addr, NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3503
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3504
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3505
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3507
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3508
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3509
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3510
	if (objp->status != NFS4ERR_CLID_INUSE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3511
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3513
	if (!xdr_string(xdrs, &objp->SETCLIENTID4res_u.client_using.r_netid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3514
							NFS4_OPAQUE_LIMIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3515
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3516
	return (xdr_string(xdrs, &objp->SETCLIENTID4res_u.client_using.r_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3517
							NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3518
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3520
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3521
xdr_WRITE4args(XDR *xdrs, WRITE4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3522
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3523
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3524
		if (!xdr_u_int(xdrs, &objp->stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3525
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3526
		if (!xdr_opaque(xdrs, objp->stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3527
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3528
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3529
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3530
		if (!xdr_int(xdrs, (int *)&objp->stable))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3531
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3532
		if (xdrs->x_op == XDR_DECODE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3533
			if (xdrs->x_ops == &xdrmblk_ops) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3534
				objp->data_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3535
				return (xdrmblk_getmblk(xdrs, &objp->mblk,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3536
							&objp->data_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3537
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3538
			/* Else fall thru for the xdr_bytes(). */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3539
			objp->mblk = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3540
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3541
		return (xdr_bytes(xdrs, (char **)&objp->data_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3542
				(uint_t *)&objp->data_len, NFS4_DATA_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3543
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3544
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3545
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3546
	 * Optimized free case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3547
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3548
	if (objp->data_val != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3549
		kmem_free(objp->data_val, objp->data_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3550
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3551
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3553
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3554
xdr_WRITE4res(XDR *xdrs, WRITE4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3555
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3556
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3557
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3558
	if (objp->status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3559
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3560
	if (!xdr_u_int(xdrs, &objp->count))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3561
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3562
	if (!xdr_int(xdrs, (int *)&objp->committed))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3563
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3564
	return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3565
			(u_longlong_t *)&objp->writeverf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3566
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3568
static bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3569
xdr_snfs_argop4_free(XDR *xdrs, nfs_argop4 **arrayp, int len)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3570
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3571
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3572
	nfs_argop4 *array = *arrayp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3573
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3574
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3575
	 * Optimized XDR_FREE only args array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3576
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3577
	ASSERT(xdrs->x_op == XDR_FREE);
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
	 * Nothing to do?
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3581
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3582
	if (array == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3583
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3584
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3585
	for (i = 0; i < len; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3586
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3587
		 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3588
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3589
		switch (array[i].argop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3590
		case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3591
			if (array[i].nfs_argop4_u.opputfh.object.nfs_fh4_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3592
								NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3593
				kmem_free(array[i].nfs_argop4_u.opputfh.object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3594
								nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3595
					array[i].nfs_argop4_u.opputfh.object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3596
								nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3597
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3598
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3599
		case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3600
		case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3601
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3602
		case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3603
			if (array[i].nfs_argop4_u.oplookup.objname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3604
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3605
				kmem_free(array[i].nfs_argop4_u.oplookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3606
						objname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3607
					array[i].nfs_argop4_u.oplookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3608
						objname.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3609
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3610
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3611
		case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3612
			(void) xdr_OPEN4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3613
						&array[i].nfs_argop4_u.opopen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3614
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3615
		case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3616
		case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3617
		case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3618
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3619
		case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3620
			(void) xdr_WRITE4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3621
						&array[i].nfs_argop4_u.opwrite);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3622
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3623
		case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3624
		case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3625
		case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3626
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3627
		case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3628
			if (array[i].nfs_argop4_u.opremove.target.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3629
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3630
				kmem_free(array[i].nfs_argop4_u.opremove.target.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3631
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3632
					array[i].nfs_argop4_u.opremove.target.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3633
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3634
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3635
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3636
		case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3637
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3638
		case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3639
			(void) xdr_CREATE4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3640
					&array[i].nfs_argop4_u.opcreate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3641
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3642
		case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3643
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3644
		case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3645
			if (array[i].nfs_argop4_u.oplink.newname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3646
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3647
				kmem_free(array[i].nfs_argop4_u.oplink.newname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3648
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3649
					array[i].nfs_argop4_u.oplink.newname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3650
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3651
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3652
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3653
		case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3654
			(void) xdr_LOCK4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3655
						&array[i].nfs_argop4_u.oplock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3656
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3657
		case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3658
			(void) xdr_LOCKT4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3659
						&array[i].nfs_argop4_u.oplockt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3660
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3661
		case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3662
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3663
		case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3664
			(void) xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3665
			    &array[i].nfs_argop4_u.opnverify.obj_attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3666
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3667
		case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3668
		case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3669
		case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3670
		case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3671
		case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3672
		case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3673
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3674
		case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3675
			if (array[i].nfs_argop4_u.oprename.oldname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3676
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3677
				kmem_free(array[i].nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3678
						oldname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3679
					array[i].nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3680
						oldname.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3681
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3682
			if (array[i].nfs_argop4_u.oprename.newname.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3683
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3684
				kmem_free(array[i].nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3685
						newname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3686
					array[i].nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3687
						newname.utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3688
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3689
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3690
		case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3691
		case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3692
		case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3693
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3694
		case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3695
			if (array[i].nfs_argop4_u.opsecinfo.name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3696
						utf8string_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3697
				kmem_free(array[i].nfs_argop4_u.opsecinfo.name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3698
							utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3699
					array[i].nfs_argop4_u.opsecinfo.name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3700
							utf8string_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3701
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3702
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3703
		case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3704
			(void) xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3705
			    &array[i].nfs_argop4_u.opsetattr.obj_attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3706
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3707
		case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3708
			(void) xdr_SETCLIENTID4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3709
					&array[i].nfs_argop4_u.opsetclientid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3710
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3711
		case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3712
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3713
		case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3714
			(void) xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3715
				&array[i].nfs_argop4_u.opverify.obj_attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3716
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3717
		case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3718
			if (array[i].nfs_argop4_u.oprelease_lockowner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3719
						lock_owner.owner_val != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3720
				kmem_free(array[i].nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3721
				    oprelease_lockowner.lock_owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3722
					array[i].nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3723
				    oprelease_lockowner.lock_owner.owner_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3724
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3725
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3726
		case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3727
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3728
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3729
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3730
			 * An invalid op is a coding error, it should never
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3731
			 * have been decoded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3732
			 * Don't error because the caller cannot finish
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3733
			 * freeing the residual memory of the array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3734
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3735
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3736
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3737
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3739
	kmem_free(*arrayp, len * sizeof (nfs_argop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3740
	*arrayp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3741
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3742
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3744
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3745
xdr_nfs_argop4(XDR *xdrs, nfs_argop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3746
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3747
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3748
	 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3749
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3750
	switch (objp->argop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3751
	case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3752
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3753
		    (char **)&objp->nfs_argop4_u.opputfh.object.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3754
		    (uint_t *)&objp->nfs_argop4_u.opputfh.object.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3755
		    NFS4_FHSIZE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3756
	case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3757
		return (xdr_bitmap4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3758
				&objp->nfs_argop4_u.opgetattr.attr_request));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3759
	case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3760
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3761
	case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3762
		return (xdr_bytes(xdrs, (char **)&objp->nfs_argop4_u.oplookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3763
				objname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3764
			(uint_t *)&objp->nfs_argop4_u.oplookup.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3765
				objname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3766
			NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3767
	case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3768
		return (xdr_OPEN4args(xdrs, &objp->nfs_argop4_u.opopen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3769
	case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3770
		return (xdr_CLOSE4args(xdrs, &objp->nfs_argop4_u.opclose));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3771
	case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3772
		return (xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3773
				&objp->nfs_argop4_u.opaccess.access));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3774
	case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3775
		return (xdr_READ4args(xdrs, &objp->nfs_argop4_u.opread));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3776
	case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3777
		return (xdr_WRITE4args(xdrs, &objp->nfs_argop4_u.opwrite));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3778
	case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3779
		if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3780
		    &objp->nfs_argop4_u.opdelegreturn.deleg_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3781
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3782
		return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3783
		    objp->nfs_argop4_u.opdelegreturn.deleg_stateid.other, 12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3784
	case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3785
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3786
	case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3787
		return (xdr_READDIR4args(xdrs, &objp->nfs_argop4_u.opreaddir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3788
	case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3789
		return (xdr_bytes(xdrs, (char **)&objp->nfs_argop4_u.opremove.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3790
				target.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3791
			(uint_t *)&objp->nfs_argop4_u.opremove.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3792
				target.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3793
			NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3794
	case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3795
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3796
		    (u_longlong_t *)&objp->nfs_argop4_u.opcommit.offset))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3797
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3798
		return (xdr_u_int(xdrs, &objp->nfs_argop4_u.opcommit.count));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3799
	case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3800
		return (xdr_CREATE4args(xdrs, &objp->nfs_argop4_u.opcreate));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3801
	case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3802
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3803
		    (u_longlong_t *)&objp->nfs_argop4_u.opdelegpurge.clientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3804
	case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3805
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3806
		    (char **)&objp->nfs_argop4_u.oplink.newname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3807
		    (uint_t *)&objp->nfs_argop4_u.oplink.newname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3808
		    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3809
	case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3810
		return (xdr_LOCK4args(xdrs, &objp->nfs_argop4_u.oplock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3811
	case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3812
		return (xdr_LOCKT4args(xdrs, &objp->nfs_argop4_u.oplockt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3813
	case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3814
		return (xdr_LOCKU4args(xdrs, &objp->nfs_argop4_u.oplocku));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3815
	case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3816
		return (xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3817
				&objp->nfs_argop4_u.opnverify.obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3818
	case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3819
		return (xdr_bool(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3820
				&objp->nfs_argop4_u.opopenattr.createdir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3821
	case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3822
		if (!xdr_u_int(xdrs, &objp->nfs_argop4_u.opopen_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3823
						open_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3824
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3825
		if (!xdr_opaque(xdrs, objp->nfs_argop4_u.opopen_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3826
						open_stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3827
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3828
		return (xdr_u_int(xdrs, &objp->nfs_argop4_u.opopen_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3829
						seqid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3830
	case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3831
		return (xdr_OPEN_DOWNGRADE4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3832
				&objp->nfs_argop4_u.opopen_downgrade));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3833
	case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3834
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3835
	case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3836
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3837
	case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3838
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3839
	case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3840
		if (!xdr_bytes(xdrs, (char **)&objp->nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3841
						oldname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3842
			    (uint_t *)&objp->nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3843
						oldname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3844
			    NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3845
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3846
		return (xdr_bytes(xdrs, (char **)&objp->nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3847
						newname.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3848
			    (uint_t *)&objp->nfs_argop4_u.oprename.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3849
						newname.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3850
			    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3851
	case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3852
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3853
			(u_longlong_t *)&objp->nfs_argop4_u.oprenew.clientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3854
	case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3855
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3856
	case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3857
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3858
	case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3859
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3860
		    (char **)&objp->nfs_argop4_u.opsecinfo.name.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3861
		    (uint_t *)&objp->nfs_argop4_u.opsecinfo.name.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3862
		    NFS4_MAX_UTF8STRING));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3863
	case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3864
		if (!xdr_u_int(xdrs, &objp->nfs_argop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3865
						stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3866
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3867
		if (!xdr_opaque(xdrs, objp->nfs_argop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3868
						stateid.other, 12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3869
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3870
		return (xdr_fattr4(xdrs, &objp->nfs_argop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3871
						obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3872
	case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3873
		return (xdr_SETCLIENTID4args(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3874
				&objp->nfs_argop4_u.opsetclientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3875
	case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3876
		if (!xdr_u_longlong_t(xdrs, (u_longlong_t *)&objp->nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3877
				opsetclientid_confirm.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3878
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3879
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3880
				(u_longlong_t *)&objp->nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3881
				opsetclientid_confirm.setclientid_confirm));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3882
	case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3883
		return (xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3884
				&objp->nfs_argop4_u.opverify.obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3885
	case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3886
		if (!xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3887
			    (u_longlong_t *)&objp->nfs_argop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3888
				oprelease_lockowner.lock_owner.clientid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3889
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3890
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3891
			(char **)&objp->nfs_argop4_u.oprelease_lockowner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3892
				lock_owner.owner_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3893
			(uint_t *)&objp->nfs_argop4_u.oprelease_lockowner.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3894
				lock_owner.owner_len, NFS4_OPAQUE_LIMIT));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3895
	case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3896
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3897
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3898
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3899
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3900
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3901
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3902
xdr_cnfs_argop4_wrap(XDR *xdrs, nfs_argop4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3903
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3904
	if (!xdr_int(xdrs, (int *)&objp->argop))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3905
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3906
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3907
	return (xdr_nfs_argop4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3908
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3909
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3910
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3911
xdr_snfs_argop4(XDR *xdrs, nfs_argop4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3912
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3913
	if (!xdr_int(xdrs, (int *)&objp->argop))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3914
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3915
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3916
	switch (objp->argop) {
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3917
	case OP_PUTFH:
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3918
		return (xdr_decode_nfs_fh4(xdrs,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3919
			&objp->nfs_argop4_u.opputfh.object));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3920
	default:
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3921
		return (xdr_nfs_argop4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3922
	}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3923
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3924
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3925
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3926
 * Client side encode only arg op processing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3927
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3928
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3929
xdr_cnfs_argop4(XDR *xdrs, nfs_argop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3930
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3931
	int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3932
	int op;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3933
	nfs4_sharedfh_t *sfh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3934
	mntinfo4_t *mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3935
	rpc_inline_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3937
	ASSERT(xdrs->x_op == XDR_ENCODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3938
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3939
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3940
	 * Special case the private pseudo ops
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3941
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3942
	if (!(objp->argop & SUNW_PRIVATE_OP))
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  3943
		return (xdr_cnfs_argop4_wrap(xdrs, objp));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3944
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3945
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3946
	 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3947
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3948
	switch (objp->argop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3949
	case OP_CPUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3950
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3951
		 * We are passed in the file handle as a nfs4_sharedfh_t *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3952
		 * We need to acquire the correct locks so we can copy it out.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3953
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3954
		sfh = (nfs4_sharedfh_t *)objp->nfs_argop4_u.opcputfh.sfh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3955
		mi = sfh->sfh_mi;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3956
		(void) nfs_rw_enter_sig(&mi->mi_fh_lock, RW_READER, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3957
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3958
		len = sfh->sfh_fh.nfs_fh4_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3959
		ASSERT(len <= NFS4_FHSIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3960
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3961
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3962
		 * First try and inline the copy
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3963
		 * Must first be a multiple of BYTES_PER_XDR_UNIT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3964
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3965
		if (!(len % BYTES_PER_XDR_UNIT) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3966
		    (ptr = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT + len)) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3967
									NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3968
			IXDR_PUT_U_INT32(ptr, OP_PUTFH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3969
			IXDR_PUT_U_INT32(ptr, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3970
			bcopy(sfh->sfh_fh.nfs_fh4_val, ptr, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3971
			nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3972
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3973
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3974
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3975
		op = OP_PUTFH;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3976
		if (!XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3977
			nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3978
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3979
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3980
		if (!XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3981
			nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3982
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3983
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3984
		if (!(len % BYTES_PER_XDR_UNIT)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3985
			if (XDR_PUTBYTES(xdrs, sfh->sfh_fh.nfs_fh4_val, len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3986
				nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3987
				return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3988
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3989
		} else if (xdr_opaque(xdrs, sfh->sfh_fh.nfs_fh4_val, len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3990
			nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3991
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3992
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3993
		nfs_rw_exit(&mi->mi_fh_lock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3994
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3995
	case OP_CLOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3996
		len = strlen(objp->nfs_argop4_u.opclookup.cname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3997
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3998
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3999
		op = OP_LOOKUP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4000
		if (XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4001
			if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4002
				return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4003
					objp->nfs_argop4_u.opclookup.cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4004
					len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4005
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4006
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4007
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4008
	case OP_COPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4009
		/* op processing inlined in xdr_OPEN4cargs */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4010
		return (xdr_OPEN4cargs(xdrs, &objp->nfs_argop4_u.opcopen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4011
	case OP_CREMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4012
		len = strlen(objp->nfs_argop4_u.opcremove.ctarget);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4013
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4014
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4015
		op = OP_REMOVE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4016
		if (XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4017
			if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4018
				return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4019
					objp->nfs_argop4_u.opcremove.ctarget,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4020
					len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4021
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4022
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4023
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4024
	case OP_CCREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4025
		op = OP_CREATE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4026
		if (!XDR_PUTINT32(xdrs, &op))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4027
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4028
		return (xdr_CREATE4cargs(xdrs, &objp->nfs_argop4_u.opccreate));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4029
	case OP_CLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4030
		len = strlen(objp->nfs_argop4_u.opclink.cnewname);
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_LINK;
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.opclink.cnewname,
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_CRENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4043
		len = strlen(objp->nfs_argop4_u.opcrename.coldname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4044
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4045
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4046
		op = OP_RENAME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4047
		if (!XDR_PUTINT32(xdrs, &op))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4048
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4049
		if (!XDR_PUTINT32(xdrs, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4050
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4051
		if (!xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4052
				objp->nfs_argop4_u.opcrename.coldname, len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4053
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4054
		len = strlen(objp->nfs_argop4_u.opcrename.cnewname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4055
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4056
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4057
		if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4058
			return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4059
				objp->nfs_argop4_u.opcrename.cnewname, len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4060
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4061
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4062
	case OP_CSECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4063
		len = strlen(objp->nfs_argop4_u.opcsecinfo.cname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4064
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4065
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4066
		op = OP_SECINFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4067
		if (XDR_PUTINT32(xdrs, &op)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4068
			if (XDR_PUTINT32(xdrs, &len)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4069
				return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4070
					objp->nfs_argop4_u.opcsecinfo.cname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4071
					len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4072
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4073
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4074
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4075
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4076
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4077
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4078
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4079
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4080
 * Note that the len and decode_len will only be different in the case
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4081
 * of the client's use of this free function.  If the server is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4082
 * freeing results, then the len/decode_len will always match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4083
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4084
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4085
xdr_nfs_resop4_free(XDR *xdrs, nfs_resop4 **arrayp, int len, int decode_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4086
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4087
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4088
	nfs_resop4 *array = *arrayp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4089
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4090
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4091
	 * Optimized XDR_FREE only results array
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4092
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4093
	ASSERT(xdrs->x_op == XDR_FREE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4094
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4095
	if (array == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4096
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4097
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4098
	for (i = 0; i < decode_len; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4099
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4100
		 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4101
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4102
		switch (array[i].resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4103
		case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4104
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4105
		case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4106
			if (array[i].nfs_resop4_u.opgetattr.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4107
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4108
			if (array[i].nfs_resop4_u.opgetattr.ga_res.n4g_ext_res)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4109
				kmem_free(array[i].nfs_resop4_u.opgetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4110
					ga_res.n4g_ext_res,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4111
					sizeof (struct nfs4_ga_ext_res));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4112
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4113
		case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4114
			if (array[i].nfs_resop4_u.opgetfh.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4115
				continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4116
			if (array[i].nfs_resop4_u.opgetfh.object.nfs_fh4_val !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4117
							NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4118
				kmem_free(array[i].nfs_resop4_u.opgetfh.object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4119
							nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4120
					array[i].nfs_resop4_u.opgetfh.object.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4121
							nfs_fh4_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4122
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4123
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4124
		case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4125
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4126
		case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4127
			(void) xdr_OPEN4res(xdrs, &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4128
								opopen);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4129
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4130
		case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4131
		case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4132
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4133
		case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4134
			(void) xdr_READ4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4135
					    &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4136
								opread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4137
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4138
		case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4139
		case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4140
		case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4141
		case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4142
		case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4143
		case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4144
		case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4145
		case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4146
		case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4147
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4148
		case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4149
			(void) xdr_LOCK4res(xdrs, &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4150
								oplock);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4151
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4152
		case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4153
			(void) xdr_LOCKT4res(xdrs, &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4154
								oplockt);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4155
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4156
		case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4157
		case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4158
		case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4159
		case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4160
		case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4161
		case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4162
		case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4163
		case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4164
		case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4165
		case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4166
		case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4167
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4168
		case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4169
			(void) xdr_READLINK4res(xdrs, &array[i].nfs_resop4_u.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4170
								opreadlink);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4171
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4172
		case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4173
			(void) xdr_array(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4174
				(char **)&array[i].nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4175
					SECINFO4resok_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4176
				(uint_t *)&array[i].nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4177
					SECINFO4resok_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4178
				NFS4_SECINFO_LIMIT, sizeof (secinfo4),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4179
				(xdrproc_t)xdr_secinfo4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4180
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4181
		case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4182
			(void) xdr_SETCLIENTID4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4183
					&array[i].nfs_resop4_u.opsetclientid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4184
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4185
		case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4186
		case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4187
		case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4188
		case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4189
		case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4190
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4191
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4192
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4193
			 * An invalid op is a coding error, it should never
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4194
			 * have been decoded.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4195
			 * Don't error because the caller cannot finish
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4196
			 * freeing the residual memory of the array.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4197
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4198
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4199
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4200
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4201
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4202
	kmem_free(*arrayp, len * sizeof (nfs_resop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4203
	*arrayp = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4204
	return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4205
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4207
static bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4208
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
  4209
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4210
	return (xdr_nfs_resop4_free(xdrs, arrayp, len, decode_len));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4211
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4212
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4213
static bool_t
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4214
xdr_nfs_resop4(XDR *xdrs, nfs_resop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4215
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4216
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4217
	 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4218
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4219
	switch (objp->resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4220
	case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4221
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4222
				(int32_t *)&objp->nfs_resop4_u.opputfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4223
	case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4224
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4225
			    (int32_t *)&objp->nfs_resop4_u.opgetattr.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4226
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4227
		if (objp->nfs_resop4_u.opgetattr.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4228
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4229
		return (xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4230
			    &objp->nfs_resop4_u.opgetattr.obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4231
	case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4232
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4233
				(int32_t *)&objp->nfs_resop4_u.opgetfh.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4234
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4235
		if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4236
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4237
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4238
		    (char **)&objp->nfs_resop4_u.opgetfh.object.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4239
		    (uint_t *)&objp->nfs_resop4_u.opgetfh.object.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4240
		    NFS4_FHSIZE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4241
	case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4242
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4243
			(int32_t *)&objp->nfs_resop4_u.oplookup.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4244
	case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4245
		return (xdr_OPEN4res(xdrs, &objp->nfs_resop4_u.opopen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4246
	case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4247
		return (xdr_CLOSE4res(xdrs, &objp->nfs_resop4_u.opclose));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4248
	case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4249
		return (xdr_ACCESS4res(xdrs, &objp->nfs_resop4_u.opaccess));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4250
	case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4251
		return (xdr_READ4res(xdrs, &objp->nfs_resop4_u.opread));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4252
	case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4253
		return (xdr_WRITE4res(xdrs, &objp->nfs_resop4_u.opwrite));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4254
	case OP_DELEGRETURN:
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.opdelegreturn.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4257
	case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4258
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4259
			(int32_t *)&objp->nfs_resop4_u.oplookupp.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4260
	case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4261
		return (xdr_READDIR4res(xdrs, &objp->nfs_resop4_u.opreaddir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4262
	case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4263
		return (xdr_REMOVE4res(xdrs, &objp->nfs_resop4_u.opremove));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4264
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4265
	case OP_COMMIT:
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.opcommit.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.opcommit.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_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4272
				(u_longlong_t *)&objp->nfs_resop4_u.opcommit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4273
						writeverf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4274
	case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4275
		return (xdr_CREATE4res(xdrs, &objp->nfs_resop4_u.opcreate));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4276
	case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4277
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4278
			(int32_t *)&objp->nfs_resop4_u.opdelegpurge.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4279
	case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4280
		return (xdr_LINK4res(xdrs, &objp->nfs_resop4_u.oplink));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4281
	case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4282
		return (xdr_LOCK4res(xdrs, &objp->nfs_resop4_u.oplock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4283
	case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4284
		return (xdr_LOCKT4res(xdrs, &objp->nfs_resop4_u.oplockt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4285
	case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4286
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4287
				(int32_t *)&objp->nfs_resop4_u.oplocku.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4288
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4289
		if (objp->nfs_resop4_u.oplocku.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4290
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4291
		if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4292
		    &objp->nfs_resop4_u.oplocku.lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4293
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4294
		return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4295
		    objp->nfs_resop4_u.oplocku.lock_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4296
		    12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4297
	case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4298
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4299
			(int32_t *)&objp->nfs_resop4_u.opnverify.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4300
	case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4301
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4302
			(int32_t *)&objp->nfs_resop4_u.opopenattr.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4303
	case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4304
		return (xdr_OPEN_CONFIRM4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4305
				&objp->nfs_resop4_u.opopen_confirm));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4306
	case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4307
		return (xdr_OPEN_DOWNGRADE4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4308
				&objp->nfs_resop4_u.opopen_downgrade));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4309
	case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4310
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4311
			(int32_t *)&objp->nfs_resop4_u.opputpubfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4312
	case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4313
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4314
			(int32_t *)&objp->nfs_resop4_u.opputrootfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4315
	case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4316
		return (xdr_READLINK4res(xdrs, &objp->nfs_resop4_u.opreadlink));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4317
	case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4318
		return (xdr_RENAME4res(xdrs, &objp->nfs_resop4_u.oprename));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4319
	case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4320
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4321
				(int32_t *)&objp->nfs_resop4_u.oprenew.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4322
	case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4323
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4324
			(int32_t *)&objp->nfs_resop4_u.oprestorefh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4325
	case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4326
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4327
			(int32_t *)&objp->nfs_resop4_u.opsavefh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4328
	case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4329
		if (!xdr_int(xdrs, (int32_t *)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4330
					status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4331
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4332
		if (objp->nfs_resop4_u.opsecinfo.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4333
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4334
		return (xdr_array(xdrs, (char **)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4335
					SECINFO4resok_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4336
			(uint_t *)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4337
					SECINFO4resok_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4338
			NFS4_SECINFO_LIMIT, sizeof (secinfo4),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4339
			(xdrproc_t)xdr_secinfo4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4340
	case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4341
		if (!xdr_int(xdrs, (int32_t *)&objp->nfs_resop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4342
						status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4343
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4344
		return (xdr_bitmap4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4345
				&objp->nfs_resop4_u.opsetattr.attrsset));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4346
	case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4347
		return (xdr_SETCLIENTID4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4348
				&objp->nfs_resop4_u.opsetclientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4349
	case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4350
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4351
			(int32_t *)&objp->nfs_resop4_u.opsetclientid_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4352
					status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4353
	case OP_VERIFY:
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.opverify.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4356
	case OP_RELEASE_LOCKOWNER:
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.oprelease_lockowner.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4359
	case OP_ILLEGAL:
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.opillegal.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4362
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4363
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4364
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4366
static bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4367
xdr_cnfs_resop4_wrap(XDR *xdrs, nfs_resop4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4368
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4369
	if (!xdr_int(xdrs, (int *)&objp->resop))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4370
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4371
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4372
	return (xdr_nfs_resop4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4373
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4374
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4375
static bool_t
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4376
xdr_snfs_resop4(XDR *xdrs, nfs_resop4 *objp)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4377
{
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4378
	if (!xdr_int(xdrs, (int *)&objp->resop))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4379
		return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4380
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4381
	switch (objp->resop) {
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4382
	case OP_GETFH:
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4383
		if (!XDR_PUTINT32(xdrs,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4384
		    (int32_t *)&objp->nfs_resop4_u.opgetfh.status))
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4385
			return (FALSE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4386
		if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK)
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4387
			return (TRUE);
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4388
		return (xdr_encode_nfs_fh4(xdrs,
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4389
			&objp->nfs_resop4_u.opgetfh.object));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4390
	default:
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4391
		return (xdr_nfs_resop4(xdrs, objp));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4392
	}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4393
}
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4394
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4395
static bool_t
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4396
xdr_nfs_resop4_clnt(XDR *xdrs, nfs_resop4 *objp, nfs_argop4 *aobjp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4397
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4398
	if (!xdr_int(xdrs, (int *)&objp->resop))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4399
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4400
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4401
	 * These should be ordered by frequency of use
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4402
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4403
	switch (objp->resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4404
	case OP_PUTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4405
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4406
				(int32_t *)&objp->nfs_resop4_u.opputfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4407
	case OP_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4408
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4409
			    (int32_t *)&objp->nfs_resop4_u.opgetattr.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4410
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4411
		if (objp->nfs_resop4_u.opgetattr.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4412
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4413
		return (xdr_ga_res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4414
				(GETATTR4res *)&objp->nfs_resop4_u.opgetattr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4415
				&aobjp->nfs_argop4_u.opgetattr));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4416
	case OP_GETFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4417
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4418
				(int32_t *)&objp->nfs_resop4_u.opgetfh.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4419
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4420
		if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4421
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4422
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4423
		    (char **)&objp->nfs_resop4_u.opgetfh.object.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4424
		    (uint_t *)&objp->nfs_resop4_u.opgetfh.object.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4425
		    NFS4_FHSIZE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4426
	case OP_LOOKUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4427
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4428
			(int32_t *)&objp->nfs_resop4_u.oplookup.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4429
	case OP_NVERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4430
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4431
			(int32_t *)&objp->nfs_resop4_u.opnverify.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4432
	case OP_OPEN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4433
		return (xdr_OPEN4res(xdrs, &objp->nfs_resop4_u.opopen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4434
	case OP_CLOSE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4435
		return (xdr_CLOSE4res(xdrs, &objp->nfs_resop4_u.opclose));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4436
	case OP_ACCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4437
		return (xdr_ACCESS4res(xdrs, &objp->nfs_resop4_u.opaccess));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4438
	case OP_READ:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4439
		return (xdr_READ4res_clnt(xdrs, &objp->nfs_resop4_u.opread,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4440
					&aobjp->nfs_argop4_u.opread));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4441
	case OP_WRITE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4442
		return (xdr_WRITE4res(xdrs, &objp->nfs_resop4_u.opwrite));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4443
	case OP_DELEGRETURN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4444
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4445
			(int32_t *)&objp->nfs_resop4_u.opdelegreturn.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4446
	case OP_LOOKUPP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4447
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4448
			(int32_t *)&objp->nfs_resop4_u.oplookupp.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4449
	case OP_READDIR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4450
		return (xdr_READDIR4res_clnt(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4451
				&objp->nfs_resop4_u.opreaddirclnt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4452
				&aobjp->nfs_argop4_u.opreaddir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4453
	case OP_REMOVE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4454
		return (xdr_REMOVE4res(xdrs, &objp->nfs_resop4_u.opremove));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4456
	case OP_COMMIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4457
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4458
			    (int32_t *)&objp->nfs_resop4_u.opcommit.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4459
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4460
		if (objp->nfs_resop4_u.opcommit.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4461
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4462
		return (xdr_u_longlong_t(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4463
				(u_longlong_t *)&objp->nfs_resop4_u.opcommit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4464
						writeverf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4465
	case OP_CREATE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4466
		return (xdr_CREATE4res(xdrs, &objp->nfs_resop4_u.opcreate));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4467
	case OP_DELEGPURGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4468
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4469
			(int32_t *)&objp->nfs_resop4_u.opdelegpurge.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4470
	case OP_LINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4471
		return (xdr_LINK4res(xdrs, &objp->nfs_resop4_u.oplink));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4472
	case OP_LOCK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4473
		return (xdr_LOCK4res(xdrs, &objp->nfs_resop4_u.oplock));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4474
	case OP_LOCKT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4475
		return (xdr_LOCKT4res(xdrs, &objp->nfs_resop4_u.oplockt));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4476
	case OP_LOCKU:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4477
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4478
				(int32_t *)&objp->nfs_resop4_u.oplocku.status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4479
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4480
		if (objp->nfs_resop4_u.oplocku.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4481
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4482
		if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4483
		    &objp->nfs_resop4_u.oplocku.lock_stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4484
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4485
		return (xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4486
		    objp->nfs_resop4_u.oplocku.lock_stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4487
		    12));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4488
	case OP_OPENATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4489
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4490
			(int32_t *)&objp->nfs_resop4_u.opopenattr.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4491
	case OP_OPEN_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4492
		return (xdr_OPEN_CONFIRM4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4493
				&objp->nfs_resop4_u.opopen_confirm));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4494
	case OP_OPEN_DOWNGRADE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4495
		return (xdr_OPEN_DOWNGRADE4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4496
				&objp->nfs_resop4_u.opopen_downgrade));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4497
	case OP_PUTPUBFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4498
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4499
			(int32_t *)&objp->nfs_resop4_u.opputpubfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4500
	case OP_PUTROOTFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4501
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4502
			(int32_t *)&objp->nfs_resop4_u.opputrootfh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4503
	case OP_READLINK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4504
		return (xdr_READLINK4res(xdrs, &objp->nfs_resop4_u.opreadlink));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4505
	case OP_RENAME:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4506
		return (xdr_RENAME4res(xdrs, &objp->nfs_resop4_u.oprename));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4507
	case OP_RENEW:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4508
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4509
				(int32_t *)&objp->nfs_resop4_u.oprenew.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4510
	case OP_RESTOREFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4511
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4512
			(int32_t *)&objp->nfs_resop4_u.oprestorefh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4513
	case OP_SAVEFH:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4514
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4515
			(int32_t *)&objp->nfs_resop4_u.opsavefh.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4516
	case OP_SECINFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4517
		if (!xdr_int(xdrs, (int32_t *)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4518
					status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4519
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4520
		if (objp->nfs_resop4_u.opsecinfo.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4521
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4522
		return (xdr_array(xdrs, (char **)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4523
					SECINFO4resok_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4524
			(uint_t *)&objp->nfs_resop4_u.opsecinfo.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4525
					SECINFO4resok_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4526
			~0, sizeof (secinfo4), (xdrproc_t)xdr_secinfo4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4527
	case OP_SETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4528
		if (!xdr_int(xdrs, (int32_t *)&objp->nfs_resop4_u.opsetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4529
						status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4530
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4531
		return (xdr_bitmap4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4532
				&objp->nfs_resop4_u.opsetattr.attrsset));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4533
	case OP_SETCLIENTID:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4534
		return (xdr_SETCLIENTID4res(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4535
				&objp->nfs_resop4_u.opsetclientid));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4536
	case OP_SETCLIENTID_CONFIRM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4537
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4538
			(int32_t *)&objp->nfs_resop4_u.opsetclientid_confirm.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4539
					status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4540
	case OP_VERIFY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4541
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4542
			(int32_t *)&objp->nfs_resop4_u.opverify.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4543
	case OP_RELEASE_LOCKOWNER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4544
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4545
		    (int32_t *)&objp->nfs_resop4_u.oprelease_lockowner.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4546
	case OP_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4547
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4548
			(int32_t *)&objp->nfs_resop4_u.opillegal.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4549
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4550
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4551
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4553
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4554
xdr_COMPOUND4args_clnt(XDR *xdrs, COMPOUND4args_clnt *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4555
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4556
	static int32_t twelve = 12;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4557
	static int32_t minorversion = NFS4_MINORVERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4558
	uint32_t *ctagp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4559
	rpc_inline_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4560
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4561
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4562
	 * XDR_ENCODE only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4563
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4564
	if (xdrs->x_op == XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4565
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4566
	if (xdrs->x_op == XDR_DECODE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4567
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4568
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4569
	ctagp = (uint32_t *)&nfs4_ctags[objp->ctag].ct_tag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4570
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4571
	if ((ptr = XDR_INLINE(xdrs, 5 * BYTES_PER_XDR_UNIT)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4572
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4573
		 * Efficiently encode fixed length tags, could be longlongs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4574
		 * but 8 byte XDR alignment not assured
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4575
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4576
		IXDR_PUT_U_INT32(ptr, 12);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4577
		IXDR_PUT_U_INT32(ptr, ctagp[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4578
		IXDR_PUT_U_INT32(ptr, ctagp[1]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4579
		IXDR_PUT_U_INT32(ptr, ctagp[2]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4581
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4582
		 * Fixed minor version for now
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4583
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4584
		IXDR_PUT_U_INT32(ptr, NFS4_MINORVERSION);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4585
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4586
		if (!XDR_PUTINT32(xdrs, &twelve))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4587
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4588
		if (!XDR_PUTINT32(xdrs, (int32_t *)&ctagp[0]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4589
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4590
		if (!XDR_PUTINT32(xdrs, (int32_t *)&ctagp[1]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4591
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4592
		if (!XDR_PUTINT32(xdrs, (int32_t *)&ctagp[2]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4593
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4594
		if (!XDR_PUTINT32(xdrs, (int32_t *)&minorversion))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4595
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4596
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4597
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4598
	return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4599
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4600
			sizeof (nfs_argop4), (xdrproc_t)xdr_cnfs_argop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4601
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4603
bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4604
xdr_COMPOUND4args_srv(XDR *xdrs, COMPOUND4args *objp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4605
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4606
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4607
			(uint_t *)&objp->tag.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4608
			NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4609
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4610
	if (!xdr_u_int(xdrs, &objp->minorversion))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4611
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4612
	if (xdrs->x_op != XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4613
		return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4614
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4615
			sizeof (nfs_argop4), (xdrproc_t)xdr_snfs_argop4));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4616
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4617
	return (xdr_snfs_argop4_free(xdrs, &objp->array, objp->array_len));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4618
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4620
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4621
xdr_COMPOUND4res_clnt(XDR *xdrs, COMPOUND4res_clnt *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4622
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4623
	uint32_t len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4624
	int32_t *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4625
	nfs_argop4 *argop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4626
	nfs_resop4 *resop;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4627
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4628
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4629
	 * No XDR_ENCODE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4630
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4631
	if (xdrs->x_op == XDR_ENCODE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4632
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4633
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4634
	if (xdrs->x_op != XDR_FREE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4635
		if ((ptr = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4636
			objp->status = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4637
			len = IXDR_GET_U_INT32(ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4638
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4639
			if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4640
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4641
			if (!xdr_u_int(xdrs, (uint32_t *)&len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4642
				return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4643
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4644
		if (len > NFS4_MAX_UTF8STRING)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4645
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4646
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4647
		 * Ignore the tag
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4648
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4649
		if (!XDR_CONTROL(xdrs, XDR_SKIPBYTES, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4650
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4651
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4652
		if (!xdr_int(xdrs, (int32_t *)&objp->array_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4653
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4655
		if (objp->array_len > objp->argsp->array_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4656
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4658
		if (objp->status == NFS_OK &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4659
		    objp->array_len != objp->argsp->array_len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4660
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4662
		/* Alloc the results array */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4663
		argop = objp->argsp->array;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4664
		len = objp->array_len * sizeof (nfs_resop4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4665
		objp->decode_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4666
		objp->array = resop = kmem_zalloc(len, KM_SLEEP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4668
		for (len = 0; len < objp->array_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4669
			len++, resop++, argop++, objp->decode_len++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4670
			if (!xdr_nfs_resop4_clnt(xdrs, resop, argop)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4671
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4672
				 * Make sure to free anything that may
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4673
				 * have been allocated along the way.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4674
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4675
				xdrs->x_op = XDR_FREE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4676
				(void) xdr_nfs_resop4_free(xdrs, &objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4677
							    objp->array_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4678
							    objp->decode_len);
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
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4682
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4683
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4684
	return (xdr_nfs_resop4_free(xdrs, &objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4685
				    objp->array_len, objp->decode_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4686
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4688
bool_t
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4689
xdr_COMPOUND4res_srv(XDR *xdrs, COMPOUND4res *objp)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4690
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4691
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4692
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4693
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4694
			(uint_t *)&objp->tag.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4695
			NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4696
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4697
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4698
	if (xdrs->x_op != XDR_FREE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4699
		return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4700
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
806
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4701
			sizeof (nfs_resop4), (xdrproc_t)xdr_snfs_resop4));
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4702
849fb015aa25 6337437 .zfs doesn't work over NFS
ek110237
parents: 0
diff changeset
  4703
	return (xdr_snfs_resop4_free(xdrs, &objp->array,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4704
				    objp->array_len, objp->array_len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4705
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4707
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4708
xdr_nfs_cb_argop4(XDR *xdrs, nfs_cb_argop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4709
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4710
	if (!xdr_u_int(xdrs, &objp->argop))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4711
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4712
	switch (objp->argop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4713
	case OP_CB_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4714
		if (!xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4715
		    (char **)&objp->nfs_cb_argop4_u.opcbgetattr.fh.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4716
		    (uint_t *)&objp->nfs_cb_argop4_u.opcbgetattr.fh.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4717
		    NFS4_FHSIZE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4718
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4719
		return (xdr_bitmap4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4720
			&objp->nfs_cb_argop4_u.opcbgetattr.attr_request));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4721
	case OP_CB_RECALL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4722
		if (!xdr_u_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4723
			    &objp->nfs_cb_argop4_u.opcbrecall.stateid.seqid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4724
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4725
		if (!xdr_opaque(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4726
			    objp->nfs_cb_argop4_u.opcbrecall.stateid.other,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4727
			    12))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4728
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4729
		if (!xdr_bool(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4730
				&objp->nfs_cb_argop4_u.opcbrecall.truncate))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4731
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4732
		return (xdr_bytes(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4733
		    (char **)&objp->nfs_cb_argop4_u.opcbrecall.fh.nfs_fh4_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4734
		    (uint_t *)&objp->nfs_cb_argop4_u.opcbrecall.fh.nfs_fh4_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4735
		    NFS4_FHSIZE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4736
	case OP_CB_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4737
		return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4738
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4739
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4740
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4742
static bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4743
xdr_nfs_cb_resop4(XDR *xdrs, nfs_cb_resop4 *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4744
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4745
	if (!xdr_u_int(xdrs, &objp->resop))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4746
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4747
	switch (objp->resop) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4748
	case OP_CB_GETATTR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4749
		if (!xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4750
				(int32_t *)&objp->nfs_cb_resop4_u.opcbgetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4751
				    status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4752
			return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4753
		if (objp->nfs_cb_resop4_u.opcbgetattr.status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4754
			return (TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4755
		return (xdr_fattr4(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4756
				&objp->nfs_cb_resop4_u.opcbgetattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4757
				    obj_attributes));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4758
	case OP_CB_RECALL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4759
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4760
			(int32_t *)&objp->nfs_cb_resop4_u.opcbrecall.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4761
	case OP_CB_ILLEGAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4762
		return (xdr_int(xdrs,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4763
			(int32_t *)&objp->nfs_cb_resop4_u.opcbillegal.status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4764
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4765
	return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4766
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4767
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4768
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4769
xdr_CB_COMPOUND4args(XDR *xdrs, CB_COMPOUND4args *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4770
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4771
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4772
			(uint_t *)&objp->tag.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4773
			NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4774
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4775
	if (!xdr_u_int(xdrs, &objp->minorversion))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4776
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4777
	if (!xdr_u_int(xdrs, &objp->callback_ident))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4778
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4779
	return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4780
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4781
			sizeof (nfs_cb_argop4), (xdrproc_t)xdr_nfs_cb_argop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4782
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4783
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4784
bool_t
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4785
xdr_CB_COMPOUND4res(XDR *xdrs, CB_COMPOUND4res *objp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4786
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4787
	if (!xdr_int(xdrs, (int32_t *)&objp->status))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4788
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4789
	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4790
			(uint_t *)&objp->tag.utf8string_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4791
			NFS4_MAX_UTF8STRING))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4792
		return (FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4793
	return (xdr_array(xdrs, (char **)&objp->array,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4794
			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4795
			sizeof (nfs_cb_resop4), (xdrproc_t)xdr_nfs_cb_resop4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4796
}