usr/src/uts/common/fs/nfs/nfs4_xdr.c
changeset 806 849fb015aa25
parent 0 68f95e015346
child 836 dfdf8a665ca9
equal deleted inserted replaced
805:3946c495718a 806:849fb015aa25
   147 	}
   147 	}
   148 	return (TRUE);
   148 	return (TRUE);
   149 }
   149 }
   150 
   150 
   151 /*
   151 /*
   152  * Called in nfs_acl_xdr.c
   152  * XDR_INLINE encode a filehandle.
       
   153  */
       
   154 bool_t
       
   155 xdr_inline_encode_nfs_fh4(uint32_t **ptrp, uint32_t *ptr_redzone,
       
   156 	nfs_fh4_fmt_t *fhp)
       
   157 {
       
   158 	uint32_t *ptr = *ptrp;
       
   159 	uint_t otw_len;
       
   160 	char *curp;
       
   161 	uint_t dlen;
       
   162 	uint32_t padword;
       
   163 
       
   164 	/*
       
   165 	 * First get the variable sized part of the filehandle.
       
   166 	 */
       
   167 	otw_len = fhp->fh4_len + fhp->fh4_xlen + sizeof (fhp->fh4_fsid) +
       
   168 	    sizeof (fhp->fh4_len) + sizeof (fhp->fh4_xlen);
       
   169 	/*
       
   170 	 * Round out to a full word.
       
   171 	 */
       
   172 	otw_len = RNDUP(otw_len);
       
   173 	padword = (otw_len / BYTES_PER_XDR_UNIT) - 1;
       
   174 
       
   175 	/*
       
   176 	 * Add in the fixed sized pieces.
       
   177 	 */
       
   178 	otw_len += sizeof (fhp->fh4_flag);
       
   179 
       
   180 #ifdef VOLATILE_FH_TEST
       
   181 	otw_len += sizeof (fhp->fh4_volatile_id);
       
   182 #endif
       
   183 
       
   184 	/*
       
   185 	 * Make sure we don't exceed our buffer.
       
   186 	 */
       
   187 	if ((ptr + (otw_len / BYTES_PER_XDR_UNIT) + 1) > ptr_redzone)
       
   188 		return (FALSE);
       
   189 
       
   190 	IXDR_PUT_U_INT32(ptr, otw_len);
       
   191 
       
   192 	/*
       
   193 	 * Zero out the pading.
       
   194 	 */
       
   195 	ptr[padword] = 0;
       
   196 
       
   197 	/* fh4_fsid */
       
   198 	IXDR_PUT_INT32(ptr, fhp->fh4_fsid.val[0]);
       
   199 	IXDR_PUT_INT32(ptr, fhp->fh4_fsid.val[1]);
       
   200 
       
   201 	/*
       
   202 	 * Since the next pieces are unaligned, we need to
       
   203 	 * do bytewise copies.
       
   204 	 */
       
   205 	curp = (char *)ptr;
       
   206 
       
   207 	/* fh4_len + fh4_data */
       
   208 	dlen = sizeof (fhp->fh4_len);
       
   209 	dlen += fhp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_len;
       
   210 	bcopy(&fhp->fh4_len, curp, dlen);
       
   211 	curp += dlen;
       
   212 
       
   213 	/* fh4_xlen + fh4_xdata */
       
   214 	dlen = sizeof (fhp->fh4_xlen);
       
   215 	dlen += fhp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA : fhp->fh4_xlen;
       
   216 	bcopy(&fhp->fh4_xlen, curp, dlen);
       
   217 	curp += dlen;
       
   218 
       
   219 	/* do necessary rounding/padding */
       
   220 	curp = (char *)RNDUP((uintptr_t)curp);
       
   221 	ptr = (uint32_t *)curp;
       
   222 
       
   223 	/*
       
   224 	 * With the above padding, we're word aligned again.
       
   225 	 */
       
   226 	ASSERT(((uintptr_t)ptr % BYTES_PER_XDR_UNIT) == 0);
       
   227 
       
   228 	/* fh4_flag */
       
   229 	IXDR_PUT_INT32(ptr, fhp->fh4_flag);
       
   230 
       
   231 #ifdef VOLATILE_FH_TEST
       
   232 	/* fh4_volatile_id */
       
   233 	IXDR_PUT_INT32(ptr, fhp->fh4_volatile_id);
       
   234 #endif
       
   235 	*ptrp = ptr;
       
   236 
       
   237 	return (TRUE);
       
   238 }
       
   239 
       
   240 static char xdr_crud[BYTES_PER_XDR_UNIT];
       
   241 
       
   242 static bool_t
       
   243 xdr_decode_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
       
   244 {
       
   245 	uint32_t fhsize;		/* filehandle size */
       
   246 	uint32_t fsize;			/* fh_len size */
       
   247 	uint32_t xsize;			/* fh_xlen size */
       
   248 	uint32_t rsize;			/* bytes to round */
       
   249 	uint32_t psize;			/* pad size */
       
   250 	uint32_t dsize;			/* "data" size */
       
   251 	nfs_fh4_fmt_t *fh_fmtp;
       
   252 
       
   253 	ASSERT(xdrs->x_op == XDR_DECODE);
       
   254 
       
   255 	/*
       
   256 	 * Retrieve the filehandle length.
       
   257 	 */
       
   258 	if (!XDR_GETINT32(xdrs, (int32_t *)&fhsize))
       
   259 		return (FALSE);
       
   260 
       
   261 	/*
       
   262 	 * Check to see if what the client sent us is bigger than what
       
   263 	 * we can ever possibly send out or smaller than what we could
       
   264 	 * possibly send out.
       
   265 	 */
       
   266 	if (fhsize > sizeof (nfs_fh4_fmt_t) ||
       
   267 	    fhsize < sizeof (fsid_t) + sizeof (ushort_t) + sizeof (ushort_t))
       
   268 		return (FALSE);
       
   269 
       
   270 	rsize = fhsize % BYTES_PER_XDR_UNIT;
       
   271 	if (rsize != 0)
       
   272 		rsize = BYTES_PER_XDR_UNIT - rsize;
       
   273 
       
   274 	objp->nfs_fh4_val = kmem_zalloc(sizeof (nfs_fh4_fmt_t), KM_SLEEP);
       
   275 	objp->nfs_fh4_len = sizeof (nfs_fh4_fmt_t);
       
   276 	fh_fmtp = (nfs_fh4_fmt_t *)objp->nfs_fh4_val;
       
   277 
       
   278 	/*
       
   279 	 * Decode what should be fh4_fsid.
       
   280 	 */
       
   281 	if (!XDR_GETINT32(xdrs, (int32_t *)&fh_fmtp->fh4_fsid.val[0]))
       
   282 		return (FALSE);
       
   283 	if (!XDR_GETINT32(xdrs, (int32_t *)&fh_fmtp->fh4_fsid.val[1]))
       
   284 		return (FALSE);
       
   285 	fhsize -= sizeof (fsid_t);
       
   286 
       
   287 	/*
       
   288 	 * Decode what should be fh4_len.  fh4_len is two bytes, so we're
       
   289 	 * unaligned now, have to use XDR_GETBYTES from now on.
       
   290 	 */
       
   291 	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_len,
       
   292 	    sizeof (ushort_t)))
       
   293 		return (FALSE);
       
   294 	fhsize -= sizeof (ushort_t);
       
   295 
       
   296 	fsize = fh_fmtp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA :
       
   297 			fh_fmtp->fh4_len;
       
   298 	/*
       
   299 	 * Make sure the client isn't sending us a bogus length for fh4_data.
       
   300 	 */
       
   301 	if (fhsize < fsize)
       
   302 		return (FALSE);
       
   303 
       
   304 	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_data, fsize))
       
   305 		return (FALSE);
       
   306 	fhsize -= fsize;
       
   307 
       
   308 	/* make sure we have enough left to decode fh_xlen */
       
   309 	if (fhsize < sizeof (ushort_t))
       
   310 		return (FALSE);
       
   311 
       
   312 	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_xlen,
       
   313 	    sizeof (ushort_t)))
       
   314 		return (FALSE);
       
   315 	fhsize -= sizeof (ushort_t);
       
   316 
       
   317 	xsize = fh_fmtp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA :
       
   318 			fh_fmtp->fh4_xlen;
       
   319 	/*
       
   320 	 * Make sure the client isn't sending us a bogus length for fh4_xdata.
       
   321 	 */
       
   322 	if (fhsize < xsize)
       
   323 		return (FALSE);
       
   324 
       
   325 	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_xdata, xsize))
       
   326 		return (FALSE);
       
   327 	fhsize -= xsize;
       
   328 
       
   329 	/* we purposedly align things, so skip padding */
       
   330 	dsize = fsize + xsize + sizeof (ushort_t) + sizeof (ushort_t);
       
   331 	psize = RNDUP(dsize);
       
   332 	if (psize != dsize)
       
   333 		if (!XDR_GETBYTES(xdrs, (caddr_t)&xdr_crud, psize - dsize))
       
   334 			return (FALSE);
       
   335 
       
   336 	/* make sure we have enough left to decode fh4_flag */
       
   337 	if (fhsize < sizeof (uint32_t))
       
   338 		return (FALSE);
       
   339 
       
   340 	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_flag,
       
   341 	    sizeof (uint32_t)))
       
   342 		return (FALSE);
       
   343 	fhsize -= sizeof (uint32_t);
       
   344 
       
   345 #ifdef VOLATILE_FH_TEST
       
   346 	/* make sure we have enough left to decode fh4_volatile_id */
       
   347 	if (fhsize < sizeof (uint32_t))
       
   348 		return (FALSE);
       
   349 
       
   350 	if (!XDR_GETBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_volatile_id,
       
   351 	    sizeof (uint32_t)))
       
   352 		return (FALSE);
       
   353 	fhsize -= sizeof (uint32_t);
       
   354 #endif
       
   355 	/*
       
   356 	 * Make sure client didn't send request with too much padding.
       
   357 	 */
       
   358 	if (fhsize > sizeof (uint32_t))
       
   359 		return (FALSE);
       
   360 
       
   361 	if (rsize)
       
   362 		if (!XDR_GETBYTES(xdrs, (caddr_t)&xdr_crud, rsize))
       
   363 			return (FALSE);
       
   364 
       
   365 	return (TRUE);
       
   366 }
       
   367 
       
   368 static char zero_word[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
       
   369 
       
   370 static bool_t
       
   371 xdr_encode_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
       
   372 {
       
   373 	uint_t otwsize, fsize, xsize;	/* otw, file, and export sizes */
       
   374 	uint_t dsize, rsize;		/* rounding sizes */
       
   375 	nfs_fh4_fmt_t *fh_fmtp;
       
   376 
       
   377 	ASSERT(xdrs->x_op == XDR_ENCODE);
       
   378 
       
   379 	fh_fmtp = (nfs_fh4_fmt_t *)objp->nfs_fh4_val;
       
   380 	fsize = fh_fmtp->fh4_len < NFS_FHMAXDATA ? NFS_FHMAXDATA :
       
   381 			fh_fmtp->fh4_len;
       
   382 	xsize = fh_fmtp->fh4_xlen < NFS_FHMAXDATA ? NFS_FHMAXDATA :
       
   383 			fh_fmtp->fh4_xlen;
       
   384 	/* fh4_i */
       
   385 	otwsize = sizeof (fsid_t) + sizeof (ushort_t) + fsize +
       
   386 			sizeof (ushort_t) + xsize;
       
   387 
       
   388 	/* round out to a full word */
       
   389 	otwsize = RNDUP(otwsize);
       
   390 
       
   391 	/* fh4_flag */
       
   392 	otwsize += sizeof (uint32_t);
       
   393 
       
   394 #ifdef VOLATILE_FH_TEST
       
   395 	/* fh4_volatile_id */
       
   396 	otwsize += sizeof (uint32_t);
       
   397 #endif
       
   398 
       
   399 	/*
       
   400 	 * XDR in filehandle size.
       
   401 	 */
       
   402 	if (!XDR_PUTINT32(xdrs, (int32_t *)&otwsize))
       
   403 		return (FALSE);
       
   404 
       
   405 	if (!XDR_PUTINT32(xdrs, (int32_t *)&fh_fmtp->fh4_fsid.val[0]))
       
   406 		return (FALSE);
       
   407 	if (!XDR_PUTINT32(xdrs, (int32_t *)&fh_fmtp->fh4_fsid.val[1]))
       
   408 		return (FALSE);
       
   409 
       
   410 	if (!XDR_PUTBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_len, fsize +
       
   411 	    sizeof (ushort_t)))
       
   412 		return (FALSE);
       
   413 
       
   414 	if (!XDR_PUTBYTES(xdrs, (caddr_t)&fh_fmtp->fh4_xlen, xsize +
       
   415 	    sizeof (ushort_t)))
       
   416 		return (FALSE);
       
   417 
       
   418 	dsize = fsize + xsize + sizeof (ushort_t) + sizeof (ushort_t);
       
   419 	rsize = RNDUP(dsize);
       
   420 
       
   421 	/*
       
   422 	 * Pad in the extra space to force alignment.
       
   423 	 */
       
   424 	if (dsize != rsize)
       
   425 		if (!XDR_PUTBYTES(xdrs, (caddr_t)&zero_word, rsize - dsize))
       
   426 			return (FALSE);
       
   427 
       
   428 	if (!XDR_PUTINT32(xdrs, (int32_t *)&fh_fmtp->fh4_flag))
       
   429 		return (FALSE);
       
   430 
       
   431 #ifdef VOLATILE_FH_TEST
       
   432 	if (!XDR_PUTINT32(xdrs, (int32_t *)&fh_fmtp->fh4_volatile_id))
       
   433 		return (FALSE);
       
   434 #endif
       
   435 
       
   436 	return (TRUE);
       
   437 }
       
   438 
       
   439 /*
       
   440  * XDR a NFSv4 filehandle.
   153  */
   441  */
   154 bool_t
   442 bool_t
   155 xdr_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
   443 xdr_nfs_fh4(XDR *xdrs, nfs_fh4 *objp)
   156 {
   444 {
   157 	if (xdrs->x_op != XDR_FREE)
   445 	if (xdrs->x_op == XDR_DECODE)
   158 		return (xdr_bytes(xdrs, (char **)&objp->nfs_fh4_val,
   446 		return (xdr_decode_nfs_fh4(xdrs, objp));
   159 			(uint_t *)&objp->nfs_fh4_len, NFS4_FHSIZE));
   447 	else if (xdrs->x_op == XDR_ENCODE)
       
   448 		return (xdr_encode_nfs_fh4(xdrs, objp));
   160 
   449 
   161 	if (objp->nfs_fh4_val != NULL) {
   450 	if (objp->nfs_fh4_val != NULL) {
   162 		kmem_free(objp->nfs_fh4_val, objp->nfs_fh4_len);
   451 		kmem_free(objp->nfs_fh4_val, objp->nfs_fh4_len);
   163 		objp->nfs_fh4_val = NULL;
   452 		objp->nfs_fh4_val = NULL;
   164 	}
   453 	}
  3277 	return (xdr_u_longlong_t(xdrs,
  3566 	return (xdr_u_longlong_t(xdrs,
  3278 			(u_longlong_t *)&objp->writeverf));
  3567 			(u_longlong_t *)&objp->writeverf));
  3279 }
  3568 }
  3280 
  3569 
  3281 static bool_t
  3570 static bool_t
  3282 xdr_nfs_argop4_free(XDR *xdrs, nfs_argop4 **arrayp, int len)
  3571 xdr_snfs_argop4_free(XDR *xdrs, nfs_argop4 **arrayp, int len)
  3283 {
  3572 {
  3284 	int i;
  3573 	int i;
  3285 	nfs_argop4 *array = *arrayp;
  3574 	nfs_argop4 *array = *arrayp;
  3286 
  3575 
  3287 	/*
  3576 	/*
  3455 }
  3744 }
  3456 
  3745 
  3457 static bool_t
  3746 static bool_t
  3458 xdr_nfs_argop4(XDR *xdrs, nfs_argop4 *objp)
  3747 xdr_nfs_argop4(XDR *xdrs, nfs_argop4 *objp)
  3459 {
  3748 {
  3460 	if (!xdr_int(xdrs, (int *)&objp->argop))
       
  3461 		return (FALSE);
       
  3462 
       
  3463 	/*
  3749 	/*
  3464 	 * These should be ordered by frequency of use
  3750 	 * These should be ordered by frequency of use
  3465 	 */
  3751 	 */
  3466 	switch (objp->argop) {
  3752 	switch (objp->argop) {
  3467 	case OP_PUTFH:
  3753 	case OP_PUTFH:
  3612 		return (TRUE);
  3898 		return (TRUE);
  3613 	}
  3899 	}
  3614 	return (FALSE);
  3900 	return (FALSE);
  3615 }
  3901 }
  3616 
  3902 
       
  3903 static bool_t
       
  3904 xdr_cnfs_argop4_wrap(XDR *xdrs, nfs_argop4 *objp)
       
  3905 {
       
  3906 	if (!xdr_int(xdrs, (int *)&objp->argop))
       
  3907 		return (FALSE);
       
  3908 
       
  3909 	return (xdr_nfs_argop4(xdrs, objp));
       
  3910 }
       
  3911 
       
  3912 static bool_t
       
  3913 xdr_snfs_argop4(XDR *xdrs, nfs_argop4 *objp)
       
  3914 {
       
  3915 	if (!xdr_int(xdrs, (int *)&objp->argop))
       
  3916 		return (FALSE);
       
  3917 
       
  3918 	switch (objp->argop) {
       
  3919 	case OP_PUTFH:
       
  3920 		return (xdr_decode_nfs_fh4(xdrs,
       
  3921 			&objp->nfs_argop4_u.opputfh.object));
       
  3922 	default:
       
  3923 		return (xdr_nfs_argop4(xdrs, objp));
       
  3924 	}
       
  3925 }
       
  3926 
  3617 /*
  3927 /*
  3618  * Client side encode only arg op processing
  3928  * Client side encode only arg op processing
  3619  */
  3929  */
  3620 static bool_t
  3930 static bool_t
  3621 xdr_cnfs_argop4(XDR *xdrs, nfs_argop4 *objp)
  3931 xdr_cnfs_argop4(XDR *xdrs, nfs_argop4 *objp)
  3630 
  3940 
  3631 	/*
  3941 	/*
  3632 	 * Special case the private pseudo ops
  3942 	 * Special case the private pseudo ops
  3633 	 */
  3943 	 */
  3634 	if (!(objp->argop & SUNW_PRIVATE_OP))
  3944 	if (!(objp->argop & SUNW_PRIVATE_OP))
  3635 		return (xdr_nfs_argop4(xdrs, objp));
  3945 		return (xdr_cnfs_argop4_wrap(xdrs, objp));
  3636 
  3946 
  3637 	/*
  3947 	/*
  3638 	 * These should be ordered by frequency of use
  3948 	 * These should be ordered by frequency of use
  3639 	 */
  3949 	 */
  3640 	switch (objp->argop) {
  3950 	switch (objp->argop) {
  3895 	*arrayp = NULL;
  4205 	*arrayp = NULL;
  3896 	return (TRUE);
  4206 	return (TRUE);
  3897 }
  4207 }
  3898 
  4208 
  3899 static bool_t
  4209 static bool_t
       
  4210 xdr_snfs_resop4_free(XDR *xdrs, nfs_resop4 **arrayp, int len, int decode_len)
       
  4211 {
       
  4212 	return (xdr_nfs_resop4_free(xdrs, arrayp, len, decode_len));
       
  4213 }
       
  4214 
       
  4215 static bool_t
  3900 xdr_nfs_resop4(XDR *xdrs, nfs_resop4 *objp)
  4216 xdr_nfs_resop4(XDR *xdrs, nfs_resop4 *objp)
  3901 {
  4217 {
  3902 	if (!xdr_int(xdrs, (int *)&objp->resop))
       
  3903 		return (FALSE);
       
  3904 	/*
  4218 	/*
  3905 	 * These should be ordered by frequency of use
  4219 	 * These should be ordered by frequency of use
  3906 	 */
  4220 	 */
  3907 	switch (objp->resop) {
  4221 	switch (objp->resop) {
  3908 	case OP_PUTFH:
  4222 	case OP_PUTFH:
  4050 	}
  4364 	}
  4051 	return (FALSE);
  4365 	return (FALSE);
  4052 }
  4366 }
  4053 
  4367 
  4054 static bool_t
  4368 static bool_t
       
  4369 xdr_cnfs_resop4_wrap(XDR *xdrs, nfs_resop4 *objp)
       
  4370 {
       
  4371 	if (!xdr_int(xdrs, (int *)&objp->resop))
       
  4372 		return (FALSE);
       
  4373 
       
  4374 	return (xdr_nfs_resop4(xdrs, objp));
       
  4375 }
       
  4376 
       
  4377 static bool_t
       
  4378 xdr_snfs_resop4(XDR *xdrs, nfs_resop4 *objp)
       
  4379 {
       
  4380 	if (!xdr_int(xdrs, (int *)&objp->resop))
       
  4381 		return (FALSE);
       
  4382 
       
  4383 	switch (objp->resop) {
       
  4384 	case OP_GETFH:
       
  4385 		if (!XDR_PUTINT32(xdrs,
       
  4386 		    (int32_t *)&objp->nfs_resop4_u.opgetfh.status))
       
  4387 			return (FALSE);
       
  4388 		if (objp->nfs_resop4_u.opgetfh.status != NFS4_OK)
       
  4389 			return (TRUE);
       
  4390 		return (xdr_encode_nfs_fh4(xdrs,
       
  4391 			&objp->nfs_resop4_u.opgetfh.object));
       
  4392 	default:
       
  4393 		return (xdr_nfs_resop4(xdrs, objp));
       
  4394 	}
       
  4395 }
       
  4396 
       
  4397 static bool_t
  4055 xdr_nfs_resop4_clnt(XDR *xdrs, nfs_resop4 *objp, nfs_argop4 *aobjp)
  4398 xdr_nfs_resop4_clnt(XDR *xdrs, nfs_resop4 *objp, nfs_argop4 *aobjp)
  4056 {
  4399 {
  4057 	if (!xdr_int(xdrs, (int *)&objp->resop))
  4400 	if (!xdr_int(xdrs, (int *)&objp->resop))
  4058 		return (FALSE);
  4401 		return (FALSE);
  4059 	/*
  4402 	/*
  4258 			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
  4601 			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
  4259 			sizeof (nfs_argop4), (xdrproc_t)xdr_cnfs_argop4));
  4602 			sizeof (nfs_argop4), (xdrproc_t)xdr_cnfs_argop4));
  4260 }
  4603 }
  4261 
  4604 
  4262 bool_t
  4605 bool_t
  4263 xdr_COMPOUND4args(XDR *xdrs, COMPOUND4args *objp)
  4606 xdr_COMPOUND4args_srv(XDR *xdrs, COMPOUND4args *objp)
  4264 {
  4607 {
  4265 	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
  4608 	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
  4266 			(uint_t *)&objp->tag.utf8string_len,
  4609 			(uint_t *)&objp->tag.utf8string_len,
  4267 			NFS4_MAX_UTF8STRING))
  4610 			NFS4_MAX_UTF8STRING))
  4268 		return (FALSE);
  4611 		return (FALSE);
  4269 	if (!xdr_u_int(xdrs, &objp->minorversion))
  4612 	if (!xdr_u_int(xdrs, &objp->minorversion))
  4270 		return (FALSE);
  4613 		return (FALSE);
  4271 	if (xdrs->x_op != XDR_FREE)
  4614 	if (xdrs->x_op != XDR_FREE)
  4272 		return (xdr_array(xdrs, (char **)&objp->array,
  4615 		return (xdr_array(xdrs, (char **)&objp->array,
  4273 			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
  4616 			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
  4274 			sizeof (nfs_argop4), (xdrproc_t)xdr_nfs_argop4));
  4617 			sizeof (nfs_argop4), (xdrproc_t)xdr_snfs_argop4));
  4275 
  4618 
  4276 	return (xdr_nfs_argop4_free(xdrs, &objp->array, objp->array_len));
  4619 	return (xdr_snfs_argop4_free(xdrs, &objp->array, objp->array_len));
  4277 }
  4620 }
  4278 
  4621 
  4279 bool_t
  4622 bool_t
  4280 xdr_COMPOUND4res_clnt(XDR *xdrs, COMPOUND4res_clnt *objp)
  4623 xdr_COMPOUND4res_clnt(XDR *xdrs, COMPOUND4res_clnt *objp)
  4281 {
  4624 {
  4343 	return (xdr_nfs_resop4_free(xdrs, &objp->array,
  4686 	return (xdr_nfs_resop4_free(xdrs, &objp->array,
  4344 				    objp->array_len, objp->decode_len));
  4687 				    objp->array_len, objp->decode_len));
  4345 }
  4688 }
  4346 
  4689 
  4347 bool_t
  4690 bool_t
  4348 xdr_COMPOUND4res(XDR *xdrs, COMPOUND4res *objp)
  4691 xdr_COMPOUND4res_srv(XDR *xdrs, COMPOUND4res *objp)
  4349 {
  4692 {
  4350 	if (!xdr_int(xdrs, (int32_t *)&objp->status))
  4693 	if (!xdr_int(xdrs, (int32_t *)&objp->status))
  4351 		return (FALSE);
  4694 		return (FALSE);
  4352 	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
  4695 	if (!xdr_bytes(xdrs, (char **)&objp->tag.utf8string_val,
  4353 			(uint_t *)&objp->tag.utf8string_len,
  4696 			(uint_t *)&objp->tag.utf8string_len,
  4355 		return (FALSE);
  4698 		return (FALSE);
  4356 
  4699 
  4357 	if (xdrs->x_op != XDR_FREE)
  4700 	if (xdrs->x_op != XDR_FREE)
  4358 		return (xdr_array(xdrs, (char **)&objp->array,
  4701 		return (xdr_array(xdrs, (char **)&objp->array,
  4359 			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
  4702 			(uint_t *)&objp->array_len, NFS4_COMPOUND_LIMIT,
  4360 			sizeof (nfs_resop4), (xdrproc_t)xdr_nfs_resop4));
  4703 			sizeof (nfs_resop4), (xdrproc_t)xdr_snfs_resop4));
  4361 
  4704 
  4362 	return (xdr_nfs_resop4_free(xdrs, &objp->array,
  4705 	return (xdr_snfs_resop4_free(xdrs, &objp->array,
  4363 				    objp->array_len, objp->array_len));
  4706 				    objp->array_len, objp->array_len));
  4364 }
  4707 }
  4365 
  4708 
  4366 static bool_t
  4709 static bool_t
  4367 xdr_nfs_cb_argop4(XDR *xdrs, nfs_cb_argop4 *objp)
  4710 xdr_nfs_cb_argop4(XDR *xdrs, nfs_cb_argop4 *objp)