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