Linux Audio

Check our new training course

Loading...
v4.17
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * linux/fs/nfs/nfs2xdr.c
   4 *
   5 * XDR functions to encode/decode NFS RPC arguments and results.
   6 *
   7 * Copyright (C) 1992, 1993, 1994  Rick Sladkey
   8 * Copyright (C) 1996 Olaf Kirch
   9 * 04 Aug 1998  Ion Badulescu <ionut@cs.columbia.edu>
  10 * 		FIFO's need special handling in NFSv2
  11 */
  12
  13#include <linux/param.h>
  14#include <linux/time.h>
  15#include <linux/mm.h>
  16#include <linux/errno.h>
  17#include <linux/string.h>
  18#include <linux/in.h>
  19#include <linux/pagemap.h>
  20#include <linux/proc_fs.h>
  21#include <linux/sunrpc/clnt.h>
  22#include <linux/nfs.h>
  23#include <linux/nfs2.h>
  24#include <linux/nfs_fs.h>
 
 
  25#include "internal.h"
  26
  27#define NFSDBG_FACILITY		NFSDBG_XDR
  28
  29/* Mapping from NFS error code to "errno" error code. */
  30#define errno_NFSERR_IO		EIO
  31
  32/*
  33 * Declare the space requirements for NFS arguments and replies as
  34 * number of 32bit-words
  35 */
 
  36#define NFS_fhandle_sz		(8)
  37#define NFS_sattr_sz		(8)
  38#define NFS_filename_sz		(1+(NFS2_MAXNAMLEN>>2))
  39#define NFS_path_sz		(1+(NFS2_MAXPATHLEN>>2))
  40#define NFS_fattr_sz		(17)
  41#define NFS_info_sz		(5)
  42#define NFS_entry_sz		(NFS_filename_sz+3)
  43
  44#define NFS_diropargs_sz	(NFS_fhandle_sz+NFS_filename_sz)
  45#define NFS_removeargs_sz	(NFS_fhandle_sz+NFS_filename_sz)
  46#define NFS_sattrargs_sz	(NFS_fhandle_sz+NFS_sattr_sz)
  47#define NFS_readlinkargs_sz	(NFS_fhandle_sz)
  48#define NFS_readargs_sz		(NFS_fhandle_sz+3)
  49#define NFS_writeargs_sz	(NFS_fhandle_sz+4)
  50#define NFS_createargs_sz	(NFS_diropargs_sz+NFS_sattr_sz)
  51#define NFS_renameargs_sz	(NFS_diropargs_sz+NFS_diropargs_sz)
  52#define NFS_linkargs_sz		(NFS_fhandle_sz+NFS_diropargs_sz)
  53#define NFS_symlinkargs_sz	(NFS_diropargs_sz+1+NFS_sattr_sz)
  54#define NFS_readdirargs_sz	(NFS_fhandle_sz+2)
  55
  56#define NFS_attrstat_sz		(1+NFS_fattr_sz)
  57#define NFS_diropres_sz		(1+NFS_fhandle_sz+NFS_fattr_sz)
  58#define NFS_readlinkres_sz	(2)
  59#define NFS_readres_sz		(1+NFS_fattr_sz+1)
  60#define NFS_writeres_sz         (NFS_attrstat_sz)
  61#define NFS_stat_sz		(1)
  62#define NFS_readdirres_sz	(1)
  63#define NFS_statfsres_sz	(1+NFS_info_sz)
  64
  65static int nfs_stat_to_errno(enum nfs_stat);
  66
  67/*
  68 * While encoding arguments, set up the reply buffer in advance to
  69 * receive reply data directly into the page cache.
  70 */
  71static void prepare_reply_buffer(struct rpc_rqst *req, struct page **pages,
  72				 unsigned int base, unsigned int len,
  73				 unsigned int bufsize)
  74{
  75	struct rpc_auth	*auth = req->rq_cred->cr_auth;
  76	unsigned int replen;
  77
  78	replen = RPC_REPHDRSIZE + auth->au_rslack + bufsize;
  79	xdr_inline_pages(&req->rq_rcv_buf, replen << 2, pages, base, len);
  80}
  81
  82/*
  83 * Handle decode buffer overflows out-of-line.
  84 */
  85static void print_overflow_msg(const char *func, const struct xdr_stream *xdr)
  86{
  87	dprintk("NFS: %s prematurely hit the end of our receive buffer. "
  88		"Remaining buffer length is %tu words.\n",
  89		func, xdr->end - xdr->p);
  90}
  91
  92
  93/*
  94 * Encode/decode NFSv2 basic data types
  95 *
  96 * Basic NFSv2 data types are defined in section 2.3 of RFC 1094:
  97 * "NFS: Network File System Protocol Specification".
  98 *
  99 * Not all basic data types have their own encoding and decoding
 100 * functions.  For run-time efficiency, some data types are encoded
 101 * or decoded inline.
 102 */
 103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 104/*
 105 *	typedef opaque	nfsdata<>;
 106 */
 107static int decode_nfsdata(struct xdr_stream *xdr, struct nfs_pgio_res *result)
 108{
 109	u32 recvd, count;
 110	__be32 *p;
 111
 112	p = xdr_inline_decode(xdr, 4);
 113	if (unlikely(p == NULL))
 114		goto out_overflow;
 115	count = be32_to_cpup(p);
 116	recvd = xdr_read_pages(xdr, count);
 117	if (unlikely(count > recvd))
 118		goto out_cheating;
 119out:
 120	result->eof = 0;	/* NFSv2 does not pass EOF flag on the wire. */
 121	result->count = count;
 122	return count;
 123out_cheating:
 124	dprintk("NFS: server cheating in read result: "
 125		"count %u > recvd %u\n", count, recvd);
 126	count = recvd;
 127	goto out;
 128out_overflow:
 129	print_overflow_msg(__func__, xdr);
 130	return -EIO;
 131}
 132
 133/*
 134 *	enum stat {
 135 *		NFS_OK = 0,
 136 *		NFSERR_PERM = 1,
 137 *		NFSERR_NOENT = 2,
 138 *		NFSERR_IO = 5,
 139 *		NFSERR_NXIO = 6,
 140 *		NFSERR_ACCES = 13,
 141 *		NFSERR_EXIST = 17,
 142 *		NFSERR_NODEV = 19,
 143 *		NFSERR_NOTDIR = 20,
 144 *		NFSERR_ISDIR = 21,
 145 *		NFSERR_FBIG = 27,
 146 *		NFSERR_NOSPC = 28,
 147 *		NFSERR_ROFS = 30,
 148 *		NFSERR_NAMETOOLONG = 63,
 149 *		NFSERR_NOTEMPTY = 66,
 150 *		NFSERR_DQUOT = 69,
 151 *		NFSERR_STALE = 70,
 152 *		NFSERR_WFLUSH = 99
 153 *	};
 154 */
 155static int decode_stat(struct xdr_stream *xdr, enum nfs_stat *status)
 156{
 157	__be32 *p;
 158
 159	p = xdr_inline_decode(xdr, 4);
 160	if (unlikely(p == NULL))
 161		goto out_overflow;
 
 
 
 
 
 162	*status = be32_to_cpup(p);
 
 163	return 0;
 164out_overflow:
 165	print_overflow_msg(__func__, xdr);
 166	return -EIO;
 167}
 168
 169/*
 170 * 2.3.2.  ftype
 171 *
 172 *	enum ftype {
 173 *		NFNON = 0,
 174 *		NFREG = 1,
 175 *		NFDIR = 2,
 176 *		NFBLK = 3,
 177 *		NFCHR = 4,
 178 *		NFLNK = 5
 179 *	};
 180 *
 181 */
 182static __be32 *xdr_decode_ftype(__be32 *p, u32 *type)
 183{
 184	*type = be32_to_cpup(p++);
 185	if (unlikely(*type > NF2FIFO))
 186		*type = NFBAD;
 187	return p;
 188}
 189
 190/*
 191 * 2.3.3.  fhandle
 192 *
 193 *	typedef opaque fhandle[FHSIZE];
 194 */
 195static void encode_fhandle(struct xdr_stream *xdr, const struct nfs_fh *fh)
 196{
 197	__be32 *p;
 198
 199	p = xdr_reserve_space(xdr, NFS2_FHSIZE);
 200	memcpy(p, fh->data, NFS2_FHSIZE);
 201}
 202
 203static int decode_fhandle(struct xdr_stream *xdr, struct nfs_fh *fh)
 204{
 205	__be32 *p;
 206
 207	p = xdr_inline_decode(xdr, NFS2_FHSIZE);
 208	if (unlikely(p == NULL))
 209		goto out_overflow;
 210	fh->size = NFS2_FHSIZE;
 211	memcpy(fh->data, p, NFS2_FHSIZE);
 212	return 0;
 213out_overflow:
 214	print_overflow_msg(__func__, xdr);
 215	return -EIO;
 216}
 217
 218/*
 219 * 2.3.4.  timeval
 220 *
 221 *	struct timeval {
 222 *		unsigned int seconds;
 223 *		unsigned int useconds;
 224 *	};
 225 */
 226static __be32 *xdr_encode_time(__be32 *p, const struct timespec *timep)
 227{
 228	*p++ = cpu_to_be32(timep->tv_sec);
 229	if (timep->tv_nsec != 0)
 230		*p++ = cpu_to_be32(timep->tv_nsec / NSEC_PER_USEC);
 231	else
 232		*p++ = cpu_to_be32(0);
 233	return p;
 234}
 235
 236/*
 237 * Passing the invalid value useconds=1000000 is a Sun convention for
 238 * "set to current server time".  It's needed to make permissions checks
 239 * for the "touch" program across v2 mounts to Solaris and Irix servers
 240 * work correctly.  See description of sattr in section 6.1 of "NFS
 241 * Illustrated" by Brent Callaghan, Addison-Wesley, ISBN 0-201-32750-5.
 242 */
 243static __be32 *xdr_encode_current_server_time(__be32 *p,
 244					      const struct timespec *timep)
 245{
 246	*p++ = cpu_to_be32(timep->tv_sec);
 247	*p++ = cpu_to_be32(1000000);
 248	return p;
 249}
 250
 251static __be32 *xdr_decode_time(__be32 *p, struct timespec *timep)
 252{
 253	timep->tv_sec = be32_to_cpup(p++);
 254	timep->tv_nsec = be32_to_cpup(p++) * NSEC_PER_USEC;
 255	return p;
 256}
 257
 258/*
 259 * 2.3.5.  fattr
 260 *
 261 *	struct fattr {
 262 *		ftype		type;
 263 *		unsigned int	mode;
 264 *		unsigned int	nlink;
 265 *		unsigned int	uid;
 266 *		unsigned int	gid;
 267 *		unsigned int	size;
 268 *		unsigned int	blocksize;
 269 *		unsigned int	rdev;
 270 *		unsigned int	blocks;
 271 *		unsigned int	fsid;
 272 *		unsigned int	fileid;
 273 *		timeval		atime;
 274 *		timeval		mtime;
 275 *		timeval		ctime;
 276 *	};
 277 *
 278 */
 279static int decode_fattr(struct xdr_stream *xdr, struct nfs_fattr *fattr)
 
 280{
 281	u32 rdev, type;
 282	__be32 *p;
 283
 284	p = xdr_inline_decode(xdr, NFS_fattr_sz << 2);
 285	if (unlikely(p == NULL))
 286		goto out_overflow;
 287
 288	fattr->valid |= NFS_ATTR_FATTR_V2;
 289
 290	p = xdr_decode_ftype(p, &type);
 291
 292	fattr->mode = be32_to_cpup(p++);
 293	fattr->nlink = be32_to_cpup(p++);
 294	fattr->uid = make_kuid(&init_user_ns, be32_to_cpup(p++));
 295	if (!uid_valid(fattr->uid))
 296		goto out_uid;
 297	fattr->gid = make_kgid(&init_user_ns, be32_to_cpup(p++));
 298	if (!gid_valid(fattr->gid))
 299		goto out_gid;
 300		
 301	fattr->size = be32_to_cpup(p++);
 302	fattr->du.nfs2.blocksize = be32_to_cpup(p++);
 303
 304	rdev = be32_to_cpup(p++);
 305	fattr->rdev = new_decode_dev(rdev);
 306	if (type == (u32)NFCHR && rdev == (u32)NFS2_FIFO_DEV) {
 307		fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO;
 308		fattr->rdev = 0;
 309	}
 310
 311	fattr->du.nfs2.blocks = be32_to_cpup(p++);
 312	fattr->fsid.major = be32_to_cpup(p++);
 313	fattr->fsid.minor = 0;
 314	fattr->fileid = be32_to_cpup(p++);
 315
 316	p = xdr_decode_time(p, &fattr->atime);
 317	p = xdr_decode_time(p, &fattr->mtime);
 318	xdr_decode_time(p, &fattr->ctime);
 319	fattr->change_attr = nfs_timespec_to_change_attr(&fattr->ctime);
 320
 321	return 0;
 322out_uid:
 323	dprintk("NFS: returned invalid uid\n");
 324	return -EINVAL;
 325out_gid:
 326	dprintk("NFS: returned invalid gid\n");
 327	return -EINVAL;
 328out_overflow:
 329	print_overflow_msg(__func__, xdr);
 330	return -EIO;
 331}
 332
 333/*
 334 * 2.3.6.  sattr
 335 *
 336 *	struct sattr {
 337 *		unsigned int	mode;
 338 *		unsigned int	uid;
 339 *		unsigned int	gid;
 340 *		unsigned int	size;
 341 *		timeval		atime;
 342 *		timeval		mtime;
 343 *	};
 344 */
 345
 346#define NFS2_SATTR_NOT_SET	(0xffffffff)
 347
 348static __be32 *xdr_time_not_set(__be32 *p)
 349{
 350	*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 351	*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 352	return p;
 353}
 354
 355static void encode_sattr(struct xdr_stream *xdr, const struct iattr *attr)
 
 356{
 357	__be32 *p;
 358
 359	p = xdr_reserve_space(xdr, NFS_sattr_sz << 2);
 360
 361	if (attr->ia_valid & ATTR_MODE)
 362		*p++ = cpu_to_be32(attr->ia_mode);
 363	else
 364		*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 365	if (attr->ia_valid & ATTR_UID)
 366		*p++ = cpu_to_be32(from_kuid(&init_user_ns, attr->ia_uid));
 367	else
 368		*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 369	if (attr->ia_valid & ATTR_GID)
 370		*p++ = cpu_to_be32(from_kgid(&init_user_ns, attr->ia_gid));
 371	else
 372		*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 373	if (attr->ia_valid & ATTR_SIZE)
 374		*p++ = cpu_to_be32((u32)attr->ia_size);
 375	else
 376		*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 377
 378	if (attr->ia_valid & ATTR_ATIME_SET)
 379		p = xdr_encode_time(p, &attr->ia_atime);
 380	else if (attr->ia_valid & ATTR_ATIME)
 381		p = xdr_encode_current_server_time(p, &attr->ia_atime);
 382	else
 383		p = xdr_time_not_set(p);
 384	if (attr->ia_valid & ATTR_MTIME_SET)
 385		xdr_encode_time(p, &attr->ia_mtime);
 386	else if (attr->ia_valid & ATTR_MTIME)
 387		xdr_encode_current_server_time(p, &attr->ia_mtime);
 388	else
 389		xdr_time_not_set(p);
 390}
 391
 392/*
 393 * 2.3.7.  filename
 394 *
 395 *	typedef string filename<MAXNAMLEN>;
 396 */
 397static void encode_filename(struct xdr_stream *xdr,
 398			    const char *name, u32 length)
 399{
 400	__be32 *p;
 401
 402	WARN_ON_ONCE(length > NFS2_MAXNAMLEN);
 403	p = xdr_reserve_space(xdr, 4 + length);
 404	xdr_encode_opaque(p, name, length);
 405}
 406
 407static int decode_filename_inline(struct xdr_stream *xdr,
 408				  const char **name, u32 *length)
 409{
 410	__be32 *p;
 411	u32 count;
 412
 413	p = xdr_inline_decode(xdr, 4);
 414	if (unlikely(p == NULL))
 415		goto out_overflow;
 416	count = be32_to_cpup(p);
 417	if (count > NFS3_MAXNAMLEN)
 418		goto out_nametoolong;
 419	p = xdr_inline_decode(xdr, count);
 420	if (unlikely(p == NULL))
 421		goto out_overflow;
 422	*name = (const char *)p;
 423	*length = count;
 424	return 0;
 425out_nametoolong:
 426	dprintk("NFS: returned filename too long: %u\n", count);
 427	return -ENAMETOOLONG;
 428out_overflow:
 429	print_overflow_msg(__func__, xdr);
 430	return -EIO;
 431}
 432
 433/*
 434 * 2.3.8.  path
 435 *
 436 *	typedef string path<MAXPATHLEN>;
 437 */
 438static void encode_path(struct xdr_stream *xdr, struct page **pages, u32 length)
 439{
 440	__be32 *p;
 441
 442	p = xdr_reserve_space(xdr, 4);
 443	*p = cpu_to_be32(length);
 444	xdr_write_pages(xdr, pages, 0, length);
 445}
 446
 447static int decode_path(struct xdr_stream *xdr)
 448{
 449	u32 length, recvd;
 450	__be32 *p;
 451
 452	p = xdr_inline_decode(xdr, 4);
 453	if (unlikely(p == NULL))
 454		goto out_overflow;
 455	length = be32_to_cpup(p);
 456	if (unlikely(length >= xdr->buf->page_len || length > NFS_MAXPATHLEN))
 457		goto out_size;
 458	recvd = xdr_read_pages(xdr, length);
 459	if (unlikely(length > recvd))
 460		goto out_cheating;
 461	xdr_terminate_string(xdr->buf, length);
 462	return 0;
 463out_size:
 464	dprintk("NFS: returned pathname too long: %u\n", length);
 465	return -ENAMETOOLONG;
 466out_cheating:
 467	dprintk("NFS: server cheating in pathname result: "
 468		"length %u > received %u\n", length, recvd);
 469	return -EIO;
 470out_overflow:
 471	print_overflow_msg(__func__, xdr);
 472	return -EIO;
 473}
 474
 475/*
 476 * 2.3.9.  attrstat
 477 *
 478 *	union attrstat switch (stat status) {
 479 *	case NFS_OK:
 480 *		fattr attributes;
 481 *	default:
 482 *		void;
 483 *	};
 484 */
 485static int decode_attrstat(struct xdr_stream *xdr, struct nfs_fattr *result,
 486			   __u32 *op_status)
 
 487{
 488	enum nfs_stat status;
 489	int error;
 490
 491	error = decode_stat(xdr, &status);
 492	if (unlikely(error))
 493		goto out;
 494	if (op_status)
 495		*op_status = status;
 496	if (status != NFS_OK)
 497		goto out_default;
 498	error = decode_fattr(xdr, result);
 499out:
 500	return error;
 501out_default:
 502	return nfs_stat_to_errno(status);
 503}
 504
 505/*
 506 * 2.3.10.  diropargs
 507 *
 508 *	struct diropargs {
 509 *		fhandle  dir;
 510 *		filename name;
 511 *	};
 512 */
 513static void encode_diropargs(struct xdr_stream *xdr, const struct nfs_fh *fh,
 514			     const char *name, u32 length)
 515{
 516	encode_fhandle(xdr, fh);
 517	encode_filename(xdr, name, length);
 518}
 519
 520/*
 521 * 2.3.11.  diropres
 522 *
 523 *	union diropres switch (stat status) {
 524 *	case NFS_OK:
 525 *		struct {
 526 *			fhandle file;
 527 *			fattr   attributes;
 528 *		} diropok;
 529 *	default:
 530 *		void;
 531 *	};
 532 */
 533static int decode_diropok(struct xdr_stream *xdr, struct nfs_diropok *result)
 
 534{
 535	int error;
 536
 537	error = decode_fhandle(xdr, result->fh);
 538	if (unlikely(error))
 539		goto out;
 540	error = decode_fattr(xdr, result->fattr);
 541out:
 542	return error;
 543}
 544
 545static int decode_diropres(struct xdr_stream *xdr, struct nfs_diropok *result)
 
 546{
 547	enum nfs_stat status;
 548	int error;
 549
 550	error = decode_stat(xdr, &status);
 551	if (unlikely(error))
 552		goto out;
 553	if (status != NFS_OK)
 554		goto out_default;
 555	error = decode_diropok(xdr, result);
 556out:
 557	return error;
 558out_default:
 559	return nfs_stat_to_errno(status);
 560}
 561
 562
 563/*
 564 * NFSv2 XDR encode functions
 565 *
 566 * NFSv2 argument types are defined in section 2.2 of RFC 1094:
 567 * "NFS: Network File System Protocol Specification".
 568 */
 569
 570static void nfs2_xdr_enc_fhandle(struct rpc_rqst *req,
 571				 struct xdr_stream *xdr,
 572				 const void *data)
 573{
 574	const struct nfs_fh *fh = data;
 575
 576	encode_fhandle(xdr, fh);
 577}
 578
 579/*
 580 * 2.2.3.  sattrargs
 581 *
 582 *	struct sattrargs {
 583 *		fhandle file;
 584 *		sattr attributes;
 585 *	};
 586 */
 587static void nfs2_xdr_enc_sattrargs(struct rpc_rqst *req,
 588				   struct xdr_stream *xdr,
 589				   const void *data)
 590{
 591	const struct nfs_sattrargs *args = data;
 592
 593	encode_fhandle(xdr, args->fh);
 594	encode_sattr(xdr, args->sattr);
 595}
 596
 597static void nfs2_xdr_enc_diropargs(struct rpc_rqst *req,
 598				   struct xdr_stream *xdr,
 599				   const void *data)
 600{
 601	const struct nfs_diropargs *args = data;
 602
 603	encode_diropargs(xdr, args->fh, args->name, args->len);
 604}
 605
 606static void nfs2_xdr_enc_readlinkargs(struct rpc_rqst *req,
 607				      struct xdr_stream *xdr,
 608				      const void *data)
 609{
 610	const struct nfs_readlinkargs *args = data;
 611
 612	encode_fhandle(xdr, args->fh);
 613	prepare_reply_buffer(req, args->pages, args->pgbase,
 614					args->pglen, NFS_readlinkres_sz);
 615}
 616
 617/*
 618 * 2.2.7.  readargs
 619 *
 620 *	struct readargs {
 621 *		fhandle file;
 622 *		unsigned offset;
 623 *		unsigned count;
 624 *		unsigned totalcount;
 625 *	};
 626 */
 627static void encode_readargs(struct xdr_stream *xdr,
 628			    const struct nfs_pgio_args *args)
 629{
 630	u32 offset = args->offset;
 631	u32 count = args->count;
 632	__be32 *p;
 633
 634	encode_fhandle(xdr, args->fh);
 635
 636	p = xdr_reserve_space(xdr, 4 + 4 + 4);
 637	*p++ = cpu_to_be32(offset);
 638	*p++ = cpu_to_be32(count);
 639	*p = cpu_to_be32(count);
 640}
 641
 642static void nfs2_xdr_enc_readargs(struct rpc_rqst *req,
 643				  struct xdr_stream *xdr,
 644				  const void *data)
 645{
 646	const struct nfs_pgio_args *args = data;
 647
 648	encode_readargs(xdr, args);
 649	prepare_reply_buffer(req, args->pages, args->pgbase,
 650					args->count, NFS_readres_sz);
 651	req->rq_rcv_buf.flags |= XDRBUF_READ;
 652}
 653
 654/*
 655 * 2.2.9.  writeargs
 656 *
 657 *	struct writeargs {
 658 *		fhandle file;
 659 *		unsigned beginoffset;
 660 *		unsigned offset;
 661 *		unsigned totalcount;
 662 *		nfsdata data;
 663 *	};
 664 */
 665static void encode_writeargs(struct xdr_stream *xdr,
 666			     const struct nfs_pgio_args *args)
 667{
 668	u32 offset = args->offset;
 669	u32 count = args->count;
 670	__be32 *p;
 671
 672	encode_fhandle(xdr, args->fh);
 673
 674	p = xdr_reserve_space(xdr, 4 + 4 + 4 + 4);
 675	*p++ = cpu_to_be32(offset);
 676	*p++ = cpu_to_be32(offset);
 677	*p++ = cpu_to_be32(count);
 678
 679	/* nfsdata */
 680	*p = cpu_to_be32(count);
 681	xdr_write_pages(xdr, args->pages, args->pgbase, count);
 682}
 683
 684static void nfs2_xdr_enc_writeargs(struct rpc_rqst *req,
 685				   struct xdr_stream *xdr,
 686				   const void *data)
 687{
 688	const struct nfs_pgio_args *args = data;
 689
 690	encode_writeargs(xdr, args);
 691	xdr->buf->flags |= XDRBUF_WRITE;
 692}
 693
 694/*
 695 * 2.2.10.  createargs
 696 *
 697 *	struct createargs {
 698 *		diropargs where;
 699 *		sattr attributes;
 700 *	};
 701 */
 702static void nfs2_xdr_enc_createargs(struct rpc_rqst *req,
 703				    struct xdr_stream *xdr,
 704				    const void *data)
 705{
 706	const struct nfs_createargs *args = data;
 707
 708	encode_diropargs(xdr, args->fh, args->name, args->len);
 709	encode_sattr(xdr, args->sattr);
 710}
 711
 712static void nfs2_xdr_enc_removeargs(struct rpc_rqst *req,
 713				    struct xdr_stream *xdr,
 714				    const void *data)
 715{
 716	const struct nfs_removeargs *args = data;
 717
 718	encode_diropargs(xdr, args->fh, args->name.name, args->name.len);
 719}
 720
 721/*
 722 * 2.2.12.  renameargs
 723 *
 724 *	struct renameargs {
 725 *		diropargs from;
 726 *		diropargs to;
 727 *	};
 728 */
 729static void nfs2_xdr_enc_renameargs(struct rpc_rqst *req,
 730				    struct xdr_stream *xdr,
 731				    const void *data)
 732{
 733	const struct nfs_renameargs *args = data;
 734	const struct qstr *old = args->old_name;
 735	const struct qstr *new = args->new_name;
 736
 737	encode_diropargs(xdr, args->old_dir, old->name, old->len);
 738	encode_diropargs(xdr, args->new_dir, new->name, new->len);
 739}
 740
 741/*
 742 * 2.2.13.  linkargs
 743 *
 744 *	struct linkargs {
 745 *		fhandle from;
 746 *		diropargs to;
 747 *	};
 748 */
 749static void nfs2_xdr_enc_linkargs(struct rpc_rqst *req,
 750				  struct xdr_stream *xdr,
 751				  const void *data)
 752{
 753	const struct nfs_linkargs *args = data;
 754
 755	encode_fhandle(xdr, args->fromfh);
 756	encode_diropargs(xdr, args->tofh, args->toname, args->tolen);
 757}
 758
 759/*
 760 * 2.2.14.  symlinkargs
 761 *
 762 *	struct symlinkargs {
 763 *		diropargs from;
 764 *		path to;
 765 *		sattr attributes;
 766 *	};
 767 */
 768static void nfs2_xdr_enc_symlinkargs(struct rpc_rqst *req,
 769				     struct xdr_stream *xdr,
 770				     const void *data)
 771{
 772	const struct nfs_symlinkargs *args = data;
 773
 774	encode_diropargs(xdr, args->fromfh, args->fromname, args->fromlen);
 775	encode_path(xdr, args->pages, args->pathlen);
 776	encode_sattr(xdr, args->sattr);
 777}
 778
 779/*
 780 * 2.2.17.  readdirargs
 781 *
 782 *	struct readdirargs {
 783 *		fhandle dir;
 784 *		nfscookie cookie;
 785 *		unsigned count;
 786 *	};
 787 */
 788static void encode_readdirargs(struct xdr_stream *xdr,
 789			       const struct nfs_readdirargs *args)
 790{
 791	__be32 *p;
 792
 793	encode_fhandle(xdr, args->fh);
 794
 795	p = xdr_reserve_space(xdr, 4 + 4);
 796	*p++ = cpu_to_be32(args->cookie);
 797	*p = cpu_to_be32(args->count);
 798}
 799
 800static void nfs2_xdr_enc_readdirargs(struct rpc_rqst *req,
 801				     struct xdr_stream *xdr,
 802				     const void *data)
 803{
 804	const struct nfs_readdirargs *args = data;
 805
 806	encode_readdirargs(xdr, args);
 807	prepare_reply_buffer(req, args->pages, 0,
 808					args->count, NFS_readdirres_sz);
 809}
 810
 811/*
 812 * NFSv2 XDR decode functions
 813 *
 814 * NFSv2 result types are defined in section 2.2 of RFC 1094:
 815 * "NFS: Network File System Protocol Specification".
 816 */
 817
 818static int nfs2_xdr_dec_stat(struct rpc_rqst *req, struct xdr_stream *xdr,
 819			     void *__unused)
 820{
 821	enum nfs_stat status;
 822	int error;
 823
 824	error = decode_stat(xdr, &status);
 825	if (unlikely(error))
 826		goto out;
 827	if (status != NFS_OK)
 828		goto out_default;
 829out:
 830	return error;
 831out_default:
 832	return nfs_stat_to_errno(status);
 833}
 834
 835static int nfs2_xdr_dec_attrstat(struct rpc_rqst *req, struct xdr_stream *xdr,
 836				 void *result)
 837{
 838	return decode_attrstat(xdr, result, NULL);
 839}
 840
 841static int nfs2_xdr_dec_diropres(struct rpc_rqst *req, struct xdr_stream *xdr,
 842				 void *result)
 843{
 844	return decode_diropres(xdr, result);
 845}
 846
 847/*
 848 * 2.2.6.  readlinkres
 849 *
 850 *	union readlinkres switch (stat status) {
 851 *	case NFS_OK:
 852 *		path data;
 853 *	default:
 854 *		void;
 855 *	};
 856 */
 857static int nfs2_xdr_dec_readlinkres(struct rpc_rqst *req,
 858				    struct xdr_stream *xdr, void *__unused)
 859{
 860	enum nfs_stat status;
 861	int error;
 862
 863	error = decode_stat(xdr, &status);
 864	if (unlikely(error))
 865		goto out;
 866	if (status != NFS_OK)
 867		goto out_default;
 868	error = decode_path(xdr);
 869out:
 870	return error;
 871out_default:
 872	return nfs_stat_to_errno(status);
 873}
 874
 875/*
 876 * 2.2.7.  readres
 877 *
 878 *	union readres switch (stat status) {
 879 *	case NFS_OK:
 880 *		fattr attributes;
 881 *		nfsdata data;
 882 *	default:
 883 *		void;
 884 *	};
 885 */
 886static int nfs2_xdr_dec_readres(struct rpc_rqst *req, struct xdr_stream *xdr,
 887				void *data)
 888{
 889	struct nfs_pgio_res *result = data;
 890	enum nfs_stat status;
 891	int error;
 892
 893	error = decode_stat(xdr, &status);
 894	if (unlikely(error))
 895		goto out;
 896	result->op_status = status;
 897	if (status != NFS_OK)
 898		goto out_default;
 899	error = decode_fattr(xdr, result->fattr);
 900	if (unlikely(error))
 901		goto out;
 902	error = decode_nfsdata(xdr, result);
 903out:
 904	return error;
 905out_default:
 906	return nfs_stat_to_errno(status);
 907}
 908
 909static int nfs2_xdr_dec_writeres(struct rpc_rqst *req, struct xdr_stream *xdr,
 910				 void *data)
 911{
 912	struct nfs_pgio_res *result = data;
 913
 914	/* All NFSv2 writes are "file sync" writes */
 915	result->verf->committed = NFS_FILE_SYNC;
 916	return decode_attrstat(xdr, result->fattr, &result->op_status);
 
 917}
 918
 919/**
 920 * nfs2_decode_dirent - Decode a single NFSv2 directory entry stored in
 921 *                      the local page cache.
 922 * @xdr: XDR stream where entry resides
 923 * @entry: buffer to fill in with entry data
 924 * @plus: boolean indicating whether this should be a readdirplus entry
 925 *
 926 * Returns zero if successful, otherwise a negative errno value is
 927 * returned.
 928 *
 929 * This function is not invoked during READDIR reply decoding, but
 930 * rather whenever an application invokes the getdents(2) system call
 931 * on a directory already in our cache.
 932 *
 933 * 2.2.17.  entry
 934 *
 935 *	struct entry {
 936 *		unsigned	fileid;
 937 *		filename	name;
 938 *		nfscookie	cookie;
 939 *		entry		*nextentry;
 940 *	};
 941 */
 942int nfs2_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
 943		       bool plus)
 944{
 945	__be32 *p;
 946	int error;
 947
 948	p = xdr_inline_decode(xdr, 4);
 949	if (unlikely(p == NULL))
 950		goto out_overflow;
 951	if (*p++ == xdr_zero) {
 952		p = xdr_inline_decode(xdr, 4);
 953		if (unlikely(p == NULL))
 954			goto out_overflow;
 955		if (*p++ == xdr_zero)
 956			return -EAGAIN;
 957		entry->eof = 1;
 958		return -EBADCOOKIE;
 959	}
 960
 961	p = xdr_inline_decode(xdr, 4);
 962	if (unlikely(p == NULL))
 963		goto out_overflow;
 964	entry->ino = be32_to_cpup(p);
 965
 966	error = decode_filename_inline(xdr, &entry->name, &entry->len);
 967	if (unlikely(error))
 968		return error;
 969
 970	/*
 971	 * The type (size and byte order) of nfscookie isn't defined in
 972	 * RFC 1094.  This implementation assumes that it's an XDR uint32.
 973	 */
 974	entry->prev_cookie = entry->cookie;
 975	p = xdr_inline_decode(xdr, 4);
 976	if (unlikely(p == NULL))
 977		goto out_overflow;
 978	entry->cookie = be32_to_cpup(p);
 979
 980	entry->d_type = DT_UNKNOWN;
 981
 982	return 0;
 983
 984out_overflow:
 985	print_overflow_msg(__func__, xdr);
 986	return -EAGAIN;
 987}
 988
 989/*
 990 * 2.2.17.  readdirres
 991 *
 992 *	union readdirres switch (stat status) {
 993 *	case NFS_OK:
 994 *		struct {
 995 *			entry *entries;
 996 *			bool eof;
 997 *		} readdirok;
 998 *	default:
 999 *		void;
1000 *	};
1001 *
1002 * Read the directory contents into the page cache, but don't
1003 * touch them.  The actual decoding is done by nfs2_decode_dirent()
1004 * during subsequent nfs_readdir() calls.
1005 */
1006static int decode_readdirok(struct xdr_stream *xdr)
1007{
1008	return xdr_read_pages(xdr, xdr->buf->page_len);
1009}
1010
1011static int nfs2_xdr_dec_readdirres(struct rpc_rqst *req,
1012				   struct xdr_stream *xdr, void *__unused)
1013{
1014	enum nfs_stat status;
1015	int error;
1016
1017	error = decode_stat(xdr, &status);
1018	if (unlikely(error))
1019		goto out;
1020	if (status != NFS_OK)
1021		goto out_default;
1022	error = decode_readdirok(xdr);
1023out:
1024	return error;
1025out_default:
1026	return nfs_stat_to_errno(status);
1027}
1028
1029/*
1030 * 2.2.18.  statfsres
1031 *
1032 *	union statfsres (stat status) {
1033 *	case NFS_OK:
1034 *		struct {
1035 *			unsigned tsize;
1036 *			unsigned bsize;
1037 *			unsigned blocks;
1038 *			unsigned bfree;
1039 *			unsigned bavail;
1040 *		} info;
1041 *	default:
1042 *		void;
1043 *	};
1044 */
1045static int decode_info(struct xdr_stream *xdr, struct nfs2_fsstat *result)
1046{
1047	__be32 *p;
1048
1049	p = xdr_inline_decode(xdr, NFS_info_sz << 2);
1050	if (unlikely(p == NULL))
1051		goto out_overflow;
1052	result->tsize  = be32_to_cpup(p++);
1053	result->bsize  = be32_to_cpup(p++);
1054	result->blocks = be32_to_cpup(p++);
1055	result->bfree  = be32_to_cpup(p++);
1056	result->bavail = be32_to_cpup(p);
1057	return 0;
1058out_overflow:
1059	print_overflow_msg(__func__, xdr);
1060	return -EIO;
1061}
1062
1063static int nfs2_xdr_dec_statfsres(struct rpc_rqst *req, struct xdr_stream *xdr,
1064				  void *result)
1065{
1066	enum nfs_stat status;
1067	int error;
1068
1069	error = decode_stat(xdr, &status);
1070	if (unlikely(error))
1071		goto out;
1072	if (status != NFS_OK)
1073		goto out_default;
1074	error = decode_info(xdr, result);
1075out:
1076	return error;
1077out_default:
1078	return nfs_stat_to_errno(status);
1079}
1080
1081
1082/*
1083 * We need to translate between nfs status return values and
1084 * the local errno values which may not be the same.
1085 */
1086static const struct {
1087	int stat;
1088	int errno;
1089} nfs_errtbl[] = {
1090	{ NFS_OK,		0		},
1091	{ NFSERR_PERM,		-EPERM		},
1092	{ NFSERR_NOENT,		-ENOENT		},
1093	{ NFSERR_IO,		-errno_NFSERR_IO},
1094	{ NFSERR_NXIO,		-ENXIO		},
1095/*	{ NFSERR_EAGAIN,	-EAGAIN		}, */
1096	{ NFSERR_ACCES,		-EACCES		},
1097	{ NFSERR_EXIST,		-EEXIST		},
1098	{ NFSERR_XDEV,		-EXDEV		},
1099	{ NFSERR_NODEV,		-ENODEV		},
1100	{ NFSERR_NOTDIR,	-ENOTDIR	},
1101	{ NFSERR_ISDIR,		-EISDIR		},
1102	{ NFSERR_INVAL,		-EINVAL		},
1103	{ NFSERR_FBIG,		-EFBIG		},
1104	{ NFSERR_NOSPC,		-ENOSPC		},
1105	{ NFSERR_ROFS,		-EROFS		},
1106	{ NFSERR_MLINK,		-EMLINK		},
1107	{ NFSERR_NAMETOOLONG,	-ENAMETOOLONG	},
1108	{ NFSERR_NOTEMPTY,	-ENOTEMPTY	},
1109	{ NFSERR_DQUOT,		-EDQUOT		},
1110	{ NFSERR_STALE,		-ESTALE		},
1111	{ NFSERR_REMOTE,	-EREMOTE	},
1112#ifdef EWFLUSH
1113	{ NFSERR_WFLUSH,	-EWFLUSH	},
1114#endif
1115	{ NFSERR_BADHANDLE,	-EBADHANDLE	},
1116	{ NFSERR_NOT_SYNC,	-ENOTSYNC	},
1117	{ NFSERR_BAD_COOKIE,	-EBADCOOKIE	},
1118	{ NFSERR_NOTSUPP,	-ENOTSUPP	},
1119	{ NFSERR_TOOSMALL,	-ETOOSMALL	},
1120	{ NFSERR_SERVERFAULT,	-EREMOTEIO	},
1121	{ NFSERR_BADTYPE,	-EBADTYPE	},
1122	{ NFSERR_JUKEBOX,	-EJUKEBOX	},
1123	{ -1,			-EIO		}
1124};
1125
1126/**
1127 * nfs_stat_to_errno - convert an NFS status code to a local errno
1128 * @status: NFS status code to convert
1129 *
1130 * Returns a local errno value, or -EIO if the NFS status code is
1131 * not recognized.  This function is used jointly by NFSv2 and NFSv3.
1132 */
1133static int nfs_stat_to_errno(enum nfs_stat status)
1134{
1135	int i;
1136
1137	for (i = 0; nfs_errtbl[i].stat != -1; i++) {
1138		if (nfs_errtbl[i].stat == (int)status)
1139			return nfs_errtbl[i].errno;
1140	}
1141	dprintk("NFS: Unrecognized nfs status value: %u\n", status);
1142	return nfs_errtbl[i].errno;
1143}
1144
1145#define PROC(proc, argtype, restype, timer)				\
1146[NFSPROC_##proc] = {							\
1147	.p_proc	    =  NFSPROC_##proc,					\
1148	.p_encode   =  nfs2_xdr_enc_##argtype,				\
1149	.p_decode   =  nfs2_xdr_dec_##restype,				\
1150	.p_arglen   =  NFS_##argtype##_sz,				\
1151	.p_replen   =  NFS_##restype##_sz,				\
1152	.p_timer    =  timer,						\
1153	.p_statidx  =  NFSPROC_##proc,					\
1154	.p_name     =  #proc,						\
1155	}
1156const struct rpc_procinfo nfs_procedures[] = {
1157	PROC(GETATTR,	fhandle,	attrstat,	1),
1158	PROC(SETATTR,	sattrargs,	attrstat,	0),
1159	PROC(LOOKUP,	diropargs,	diropres,	2),
1160	PROC(READLINK,	readlinkargs,	readlinkres,	3),
1161	PROC(READ,	readargs,	readres,	3),
1162	PROC(WRITE,	writeargs,	writeres,	4),
1163	PROC(CREATE,	createargs,	diropres,	0),
1164	PROC(REMOVE,	removeargs,	stat,		0),
1165	PROC(RENAME,	renameargs,	stat,		0),
1166	PROC(LINK,	linkargs,	stat,		0),
1167	PROC(SYMLINK,	symlinkargs,	stat,		0),
1168	PROC(MKDIR,	createargs,	diropres,	0),
1169	PROC(RMDIR,	diropargs,	stat,		0),
1170	PROC(READDIR,	readdirargs,	readdirres,	3),
1171	PROC(STATFS,	fhandle,	statfsres,	0),
1172};
1173
1174static unsigned int nfs_version2_counts[ARRAY_SIZE(nfs_procedures)];
1175const struct rpc_version nfs_version2 = {
1176	.number			= 2,
1177	.nrprocs		= ARRAY_SIZE(nfs_procedures),
1178	.procs			= nfs_procedures,
1179	.counts			= nfs_version2_counts,
1180};
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * linux/fs/nfs/nfs2xdr.c
   4 *
   5 * XDR functions to encode/decode NFS RPC arguments and results.
   6 *
   7 * Copyright (C) 1992, 1993, 1994  Rick Sladkey
   8 * Copyright (C) 1996 Olaf Kirch
   9 * 04 Aug 1998  Ion Badulescu <ionut@cs.columbia.edu>
  10 * 		FIFO's need special handling in NFSv2
  11 */
  12
  13#include <linux/param.h>
  14#include <linux/time.h>
  15#include <linux/mm.h>
  16#include <linux/errno.h>
  17#include <linux/string.h>
  18#include <linux/in.h>
  19#include <linux/pagemap.h>
  20#include <linux/proc_fs.h>
  21#include <linux/sunrpc/clnt.h>
  22#include <linux/nfs.h>
  23#include <linux/nfs2.h>
  24#include <linux/nfs_fs.h>
  25#include <linux/nfs_common.h>
  26#include "nfstrace.h"
  27#include "internal.h"
  28
  29#define NFSDBG_FACILITY		NFSDBG_XDR
  30
 
 
 
  31/*
  32 * Declare the space requirements for NFS arguments and replies as
  33 * number of 32bit-words
  34 */
  35#define NFS_pagepad_sz		(1) /* Page padding */
  36#define NFS_fhandle_sz		(8)
  37#define NFS_sattr_sz		(8)
  38#define NFS_filename_sz		(1+(NFS2_MAXNAMLEN>>2))
  39#define NFS_path_sz		(1+(NFS2_MAXPATHLEN>>2))
  40#define NFS_fattr_sz		(17)
  41#define NFS_info_sz		(5)
  42#define NFS_entry_sz		(NFS_filename_sz+3)
  43
  44#define NFS_diropargs_sz	(NFS_fhandle_sz+NFS_filename_sz)
  45#define NFS_removeargs_sz	(NFS_fhandle_sz+NFS_filename_sz)
  46#define NFS_sattrargs_sz	(NFS_fhandle_sz+NFS_sattr_sz)
  47#define NFS_readlinkargs_sz	(NFS_fhandle_sz)
  48#define NFS_readargs_sz		(NFS_fhandle_sz+3)
  49#define NFS_writeargs_sz	(NFS_fhandle_sz+4)
  50#define NFS_createargs_sz	(NFS_diropargs_sz+NFS_sattr_sz)
  51#define NFS_renameargs_sz	(NFS_diropargs_sz+NFS_diropargs_sz)
  52#define NFS_linkargs_sz		(NFS_fhandle_sz+NFS_diropargs_sz)
  53#define NFS_symlinkargs_sz	(NFS_diropargs_sz+1+NFS_sattr_sz)
  54#define NFS_readdirargs_sz	(NFS_fhandle_sz+2)
  55
  56#define NFS_attrstat_sz		(1+NFS_fattr_sz)
  57#define NFS_diropres_sz		(1+NFS_fhandle_sz+NFS_fattr_sz)
  58#define NFS_readlinkres_sz	(2+NFS_pagepad_sz)
  59#define NFS_readres_sz		(1+NFS_fattr_sz+1+NFS_pagepad_sz)
  60#define NFS_writeres_sz         (NFS_attrstat_sz)
  61#define NFS_stat_sz		(1)
  62#define NFS_readdirres_sz	(1+NFS_pagepad_sz)
  63#define NFS_statfsres_sz	(1+NFS_info_sz)
  64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  65/*
  66 * Encode/decode NFSv2 basic data types
  67 *
  68 * Basic NFSv2 data types are defined in section 2.3 of RFC 1094:
  69 * "NFS: Network File System Protocol Specification".
  70 *
  71 * Not all basic data types have their own encoding and decoding
  72 * functions.  For run-time efficiency, some data types are encoded
  73 * or decoded inline.
  74 */
  75
  76static struct user_namespace *rpc_userns(const struct rpc_clnt *clnt)
  77{
  78	if (clnt && clnt->cl_cred)
  79		return clnt->cl_cred->user_ns;
  80	return &init_user_ns;
  81}
  82
  83static struct user_namespace *rpc_rqst_userns(const struct rpc_rqst *rqstp)
  84{
  85	if (rqstp->rq_task)
  86		return rpc_userns(rqstp->rq_task->tk_client);
  87	return &init_user_ns;
  88}
  89
  90/*
  91 *	typedef opaque	nfsdata<>;
  92 */
  93static int decode_nfsdata(struct xdr_stream *xdr, struct nfs_pgio_res *result)
  94{
  95	u32 recvd, count;
  96	__be32 *p;
  97
  98	p = xdr_inline_decode(xdr, 4);
  99	if (unlikely(!p))
 100		return -EIO;
 101	count = be32_to_cpup(p);
 102	recvd = xdr_read_pages(xdr, count);
 103	if (unlikely(count > recvd))
 104		goto out_cheating;
 105out:
 106	result->eof = 0;	/* NFSv2 does not pass EOF flag on the wire. */
 107	result->count = count;
 108	return count;
 109out_cheating:
 110	dprintk("NFS: server cheating in read result: "
 111		"count %u > recvd %u\n", count, recvd);
 112	count = recvd;
 113	goto out;
 
 
 
 114}
 115
 116/*
 117 *	enum stat {
 118 *		NFS_OK = 0,
 119 *		NFSERR_PERM = 1,
 120 *		NFSERR_NOENT = 2,
 121 *		NFSERR_IO = 5,
 122 *		NFSERR_NXIO = 6,
 123 *		NFSERR_ACCES = 13,
 124 *		NFSERR_EXIST = 17,
 125 *		NFSERR_NODEV = 19,
 126 *		NFSERR_NOTDIR = 20,
 127 *		NFSERR_ISDIR = 21,
 128 *		NFSERR_FBIG = 27,
 129 *		NFSERR_NOSPC = 28,
 130 *		NFSERR_ROFS = 30,
 131 *		NFSERR_NAMETOOLONG = 63,
 132 *		NFSERR_NOTEMPTY = 66,
 133 *		NFSERR_DQUOT = 69,
 134 *		NFSERR_STALE = 70,
 135 *		NFSERR_WFLUSH = 99
 136 *	};
 137 */
 138static int decode_stat(struct xdr_stream *xdr, enum nfs_stat *status)
 139{
 140	__be32 *p;
 141
 142	p = xdr_inline_decode(xdr, 4);
 143	if (unlikely(!p))
 144		return -EIO;
 145	if (unlikely(*p != cpu_to_be32(NFS_OK)))
 146		goto out_status;
 147	*status = 0;
 148	return 0;
 149out_status:
 150	*status = be32_to_cpup(p);
 151	trace_nfs_xdr_status(xdr, (int)*status);
 152	return 0;
 
 
 
 153}
 154
 155/*
 156 * 2.3.2.  ftype
 157 *
 158 *	enum ftype {
 159 *		NFNON = 0,
 160 *		NFREG = 1,
 161 *		NFDIR = 2,
 162 *		NFBLK = 3,
 163 *		NFCHR = 4,
 164 *		NFLNK = 5
 165 *	};
 166 *
 167 */
 168static __be32 *xdr_decode_ftype(__be32 *p, u32 *type)
 169{
 170	*type = be32_to_cpup(p++);
 171	if (unlikely(*type > NF2FIFO))
 172		*type = NFBAD;
 173	return p;
 174}
 175
 176/*
 177 * 2.3.3.  fhandle
 178 *
 179 *	typedef opaque fhandle[FHSIZE];
 180 */
 181static void encode_fhandle(struct xdr_stream *xdr, const struct nfs_fh *fh)
 182{
 183	__be32 *p;
 184
 185	p = xdr_reserve_space(xdr, NFS2_FHSIZE);
 186	memcpy(p, fh->data, NFS2_FHSIZE);
 187}
 188
 189static int decode_fhandle(struct xdr_stream *xdr, struct nfs_fh *fh)
 190{
 191	__be32 *p;
 192
 193	p = xdr_inline_decode(xdr, NFS2_FHSIZE);
 194	if (unlikely(!p))
 195		return -EIO;
 196	fh->size = NFS2_FHSIZE;
 197	memcpy(fh->data, p, NFS2_FHSIZE);
 198	return 0;
 
 
 
 199}
 200
 201/*
 202 * 2.3.4.  timeval
 203 *
 204 *	struct timeval {
 205 *		unsigned int seconds;
 206 *		unsigned int useconds;
 207 *	};
 208 */
 209static __be32 *xdr_encode_time(__be32 *p, const struct timespec64 *timep)
 210{
 211	*p++ = cpu_to_be32((u32)timep->tv_sec);
 212	if (timep->tv_nsec != 0)
 213		*p++ = cpu_to_be32(timep->tv_nsec / NSEC_PER_USEC);
 214	else
 215		*p++ = cpu_to_be32(0);
 216	return p;
 217}
 218
 219/*
 220 * Passing the invalid value useconds=1000000 is a Sun convention for
 221 * "set to current server time".  It's needed to make permissions checks
 222 * for the "touch" program across v2 mounts to Solaris and Irix servers
 223 * work correctly.  See description of sattr in section 6.1 of "NFS
 224 * Illustrated" by Brent Callaghan, Addison-Wesley, ISBN 0-201-32750-5.
 225 */
 226static __be32 *xdr_encode_current_server_time(__be32 *p,
 227					      const struct timespec64 *timep)
 228{
 229	*p++ = cpu_to_be32(timep->tv_sec);
 230	*p++ = cpu_to_be32(1000000);
 231	return p;
 232}
 233
 234static __be32 *xdr_decode_time(__be32 *p, struct timespec64 *timep)
 235{
 236	timep->tv_sec = be32_to_cpup(p++);
 237	timep->tv_nsec = be32_to_cpup(p++) * NSEC_PER_USEC;
 238	return p;
 239}
 240
 241/*
 242 * 2.3.5.  fattr
 243 *
 244 *	struct fattr {
 245 *		ftype		type;
 246 *		unsigned int	mode;
 247 *		unsigned int	nlink;
 248 *		unsigned int	uid;
 249 *		unsigned int	gid;
 250 *		unsigned int	size;
 251 *		unsigned int	blocksize;
 252 *		unsigned int	rdev;
 253 *		unsigned int	blocks;
 254 *		unsigned int	fsid;
 255 *		unsigned int	fileid;
 256 *		timeval		atime;
 257 *		timeval		mtime;
 258 *		timeval		ctime;
 259 *	};
 260 *
 261 */
 262static int decode_fattr(struct xdr_stream *xdr, struct nfs_fattr *fattr,
 263		struct user_namespace *userns)
 264{
 265	u32 rdev, type;
 266	__be32 *p;
 267
 268	p = xdr_inline_decode(xdr, NFS_fattr_sz << 2);
 269	if (unlikely(!p))
 270		return -EIO;
 271
 272	fattr->valid |= NFS_ATTR_FATTR_V2;
 273
 274	p = xdr_decode_ftype(p, &type);
 275
 276	fattr->mode = be32_to_cpup(p++);
 277	fattr->nlink = be32_to_cpup(p++);
 278	fattr->uid = make_kuid(userns, be32_to_cpup(p++));
 279	if (!uid_valid(fattr->uid))
 280		goto out_uid;
 281	fattr->gid = make_kgid(userns, be32_to_cpup(p++));
 282	if (!gid_valid(fattr->gid))
 283		goto out_gid;
 284		
 285	fattr->size = be32_to_cpup(p++);
 286	fattr->du.nfs2.blocksize = be32_to_cpup(p++);
 287
 288	rdev = be32_to_cpup(p++);
 289	fattr->rdev = new_decode_dev(rdev);
 290	if (type == (u32)NFCHR && rdev == (u32)NFS2_FIFO_DEV) {
 291		fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO;
 292		fattr->rdev = 0;
 293	}
 294
 295	fattr->du.nfs2.blocks = be32_to_cpup(p++);
 296	fattr->fsid.major = be32_to_cpup(p++);
 297	fattr->fsid.minor = 0;
 298	fattr->fileid = be32_to_cpup(p++);
 299
 300	p = xdr_decode_time(p, &fattr->atime);
 301	p = xdr_decode_time(p, &fattr->mtime);
 302	xdr_decode_time(p, &fattr->ctime);
 303	fattr->change_attr = nfs_timespec_to_change_attr(&fattr->ctime);
 304
 305	return 0;
 306out_uid:
 307	dprintk("NFS: returned invalid uid\n");
 308	return -EINVAL;
 309out_gid:
 310	dprintk("NFS: returned invalid gid\n");
 311	return -EINVAL;
 
 
 
 312}
 313
 314/*
 315 * 2.3.6.  sattr
 316 *
 317 *	struct sattr {
 318 *		unsigned int	mode;
 319 *		unsigned int	uid;
 320 *		unsigned int	gid;
 321 *		unsigned int	size;
 322 *		timeval		atime;
 323 *		timeval		mtime;
 324 *	};
 325 */
 326
 327#define NFS2_SATTR_NOT_SET	(0xffffffff)
 328
 329static __be32 *xdr_time_not_set(__be32 *p)
 330{
 331	*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 332	*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 333	return p;
 334}
 335
 336static void encode_sattr(struct xdr_stream *xdr, const struct iattr *attr,
 337		struct user_namespace *userns)
 338{
 339	__be32 *p;
 340
 341	p = xdr_reserve_space(xdr, NFS_sattr_sz << 2);
 342
 343	if (attr->ia_valid & ATTR_MODE)
 344		*p++ = cpu_to_be32(attr->ia_mode);
 345	else
 346		*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 347	if (attr->ia_valid & ATTR_UID)
 348		*p++ = cpu_to_be32(from_kuid_munged(userns, attr->ia_uid));
 349	else
 350		*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 351	if (attr->ia_valid & ATTR_GID)
 352		*p++ = cpu_to_be32(from_kgid_munged(userns, attr->ia_gid));
 353	else
 354		*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 355	if (attr->ia_valid & ATTR_SIZE)
 356		*p++ = cpu_to_be32((u32)attr->ia_size);
 357	else
 358		*p++ = cpu_to_be32(NFS2_SATTR_NOT_SET);
 359
 360	if (attr->ia_valid & ATTR_ATIME_SET)
 361		p = xdr_encode_time(p, &attr->ia_atime);
 362	else if (attr->ia_valid & ATTR_ATIME)
 363		p = xdr_encode_current_server_time(p, &attr->ia_atime);
 364	else
 365		p = xdr_time_not_set(p);
 366	if (attr->ia_valid & ATTR_MTIME_SET)
 367		xdr_encode_time(p, &attr->ia_mtime);
 368	else if (attr->ia_valid & ATTR_MTIME)
 369		xdr_encode_current_server_time(p, &attr->ia_mtime);
 370	else
 371		xdr_time_not_set(p);
 372}
 373
 374/*
 375 * 2.3.7.  filename
 376 *
 377 *	typedef string filename<MAXNAMLEN>;
 378 */
 379static void encode_filename(struct xdr_stream *xdr,
 380			    const char *name, u32 length)
 381{
 382	__be32 *p;
 383
 384	WARN_ON_ONCE(length > NFS2_MAXNAMLEN);
 385	p = xdr_reserve_space(xdr, 4 + length);
 386	xdr_encode_opaque(p, name, length);
 387}
 388
 389static int decode_filename_inline(struct xdr_stream *xdr,
 390				  const char **name, u32 *length)
 391{
 392	__be32 *p;
 393	u32 count;
 394
 395	p = xdr_inline_decode(xdr, 4);
 396	if (unlikely(!p))
 397		return -EIO;
 398	count = be32_to_cpup(p);
 399	if (count > NFS3_MAXNAMLEN)
 400		goto out_nametoolong;
 401	p = xdr_inline_decode(xdr, count);
 402	if (unlikely(!p))
 403		return -EIO;
 404	*name = (const char *)p;
 405	*length = count;
 406	return 0;
 407out_nametoolong:
 408	dprintk("NFS: returned filename too long: %u\n", count);
 409	return -ENAMETOOLONG;
 
 
 
 410}
 411
 412/*
 413 * 2.3.8.  path
 414 *
 415 *	typedef string path<MAXPATHLEN>;
 416 */
 417static void encode_path(struct xdr_stream *xdr, struct page **pages, u32 length)
 418{
 419	__be32 *p;
 420
 421	p = xdr_reserve_space(xdr, 4);
 422	*p = cpu_to_be32(length);
 423	xdr_write_pages(xdr, pages, 0, length);
 424}
 425
 426static int decode_path(struct xdr_stream *xdr)
 427{
 428	u32 length, recvd;
 429	__be32 *p;
 430
 431	p = xdr_inline_decode(xdr, 4);
 432	if (unlikely(!p))
 433		return -EIO;
 434	length = be32_to_cpup(p);
 435	if (unlikely(length >= xdr->buf->page_len || length > NFS_MAXPATHLEN))
 436		goto out_size;
 437	recvd = xdr_read_pages(xdr, length);
 438	if (unlikely(length > recvd))
 439		goto out_cheating;
 440	xdr_terminate_string(xdr->buf, length);
 441	return 0;
 442out_size:
 443	dprintk("NFS: returned pathname too long: %u\n", length);
 444	return -ENAMETOOLONG;
 445out_cheating:
 446	dprintk("NFS: server cheating in pathname result: "
 447		"length %u > received %u\n", length, recvd);
 448	return -EIO;
 
 
 
 449}
 450
 451/*
 452 * 2.3.9.  attrstat
 453 *
 454 *	union attrstat switch (stat status) {
 455 *	case NFS_OK:
 456 *		fattr attributes;
 457 *	default:
 458 *		void;
 459 *	};
 460 */
 461static int decode_attrstat(struct xdr_stream *xdr, struct nfs_fattr *result,
 462			   __u32 *op_status,
 463			   struct user_namespace *userns)
 464{
 465	enum nfs_stat status;
 466	int error;
 467
 468	error = decode_stat(xdr, &status);
 469	if (unlikely(error))
 470		goto out;
 471	if (op_status)
 472		*op_status = status;
 473	if (status != NFS_OK)
 474		goto out_default;
 475	error = decode_fattr(xdr, result, userns);
 476out:
 477	return error;
 478out_default:
 479	return nfs_stat_to_errno(status);
 480}
 481
 482/*
 483 * 2.3.10.  diropargs
 484 *
 485 *	struct diropargs {
 486 *		fhandle  dir;
 487 *		filename name;
 488 *	};
 489 */
 490static void encode_diropargs(struct xdr_stream *xdr, const struct nfs_fh *fh,
 491			     const char *name, u32 length)
 492{
 493	encode_fhandle(xdr, fh);
 494	encode_filename(xdr, name, length);
 495}
 496
 497/*
 498 * 2.3.11.  diropres
 499 *
 500 *	union diropres switch (stat status) {
 501 *	case NFS_OK:
 502 *		struct {
 503 *			fhandle file;
 504 *			fattr   attributes;
 505 *		} diropok;
 506 *	default:
 507 *		void;
 508 *	};
 509 */
 510static int decode_diropok(struct xdr_stream *xdr, struct nfs_diropok *result,
 511		struct user_namespace *userns)
 512{
 513	int error;
 514
 515	error = decode_fhandle(xdr, result->fh);
 516	if (unlikely(error))
 517		goto out;
 518	error = decode_fattr(xdr, result->fattr, userns);
 519out:
 520	return error;
 521}
 522
 523static int decode_diropres(struct xdr_stream *xdr, struct nfs_diropok *result,
 524		struct user_namespace *userns)
 525{
 526	enum nfs_stat status;
 527	int error;
 528
 529	error = decode_stat(xdr, &status);
 530	if (unlikely(error))
 531		goto out;
 532	if (status != NFS_OK)
 533		goto out_default;
 534	error = decode_diropok(xdr, result, userns);
 535out:
 536	return error;
 537out_default:
 538	return nfs_stat_to_errno(status);
 539}
 540
 541
 542/*
 543 * NFSv2 XDR encode functions
 544 *
 545 * NFSv2 argument types are defined in section 2.2 of RFC 1094:
 546 * "NFS: Network File System Protocol Specification".
 547 */
 548
 549static void nfs2_xdr_enc_fhandle(struct rpc_rqst *req,
 550				 struct xdr_stream *xdr,
 551				 const void *data)
 552{
 553	const struct nfs_fh *fh = data;
 554
 555	encode_fhandle(xdr, fh);
 556}
 557
 558/*
 559 * 2.2.3.  sattrargs
 560 *
 561 *	struct sattrargs {
 562 *		fhandle file;
 563 *		sattr attributes;
 564 *	};
 565 */
 566static void nfs2_xdr_enc_sattrargs(struct rpc_rqst *req,
 567				   struct xdr_stream *xdr,
 568				   const void *data)
 569{
 570	const struct nfs_sattrargs *args = data;
 571
 572	encode_fhandle(xdr, args->fh);
 573	encode_sattr(xdr, args->sattr, rpc_rqst_userns(req));
 574}
 575
 576static void nfs2_xdr_enc_diropargs(struct rpc_rqst *req,
 577				   struct xdr_stream *xdr,
 578				   const void *data)
 579{
 580	const struct nfs_diropargs *args = data;
 581
 582	encode_diropargs(xdr, args->fh, args->name, args->len);
 583}
 584
 585static void nfs2_xdr_enc_readlinkargs(struct rpc_rqst *req,
 586				      struct xdr_stream *xdr,
 587				      const void *data)
 588{
 589	const struct nfs_readlinkargs *args = data;
 590
 591	encode_fhandle(xdr, args->fh);
 592	rpc_prepare_reply_pages(req, args->pages, args->pgbase, args->pglen,
 593				NFS_readlinkres_sz - NFS_pagepad_sz);
 594}
 595
 596/*
 597 * 2.2.7.  readargs
 598 *
 599 *	struct readargs {
 600 *		fhandle file;
 601 *		unsigned offset;
 602 *		unsigned count;
 603 *		unsigned totalcount;
 604 *	};
 605 */
 606static void encode_readargs(struct xdr_stream *xdr,
 607			    const struct nfs_pgio_args *args)
 608{
 609	u32 offset = args->offset;
 610	u32 count = args->count;
 611	__be32 *p;
 612
 613	encode_fhandle(xdr, args->fh);
 614
 615	p = xdr_reserve_space(xdr, 4 + 4 + 4);
 616	*p++ = cpu_to_be32(offset);
 617	*p++ = cpu_to_be32(count);
 618	*p = cpu_to_be32(count);
 619}
 620
 621static void nfs2_xdr_enc_readargs(struct rpc_rqst *req,
 622				  struct xdr_stream *xdr,
 623				  const void *data)
 624{
 625	const struct nfs_pgio_args *args = data;
 626
 627	encode_readargs(xdr, args);
 628	rpc_prepare_reply_pages(req, args->pages, args->pgbase, args->count,
 629				NFS_readres_sz - NFS_pagepad_sz);
 630	req->rq_rcv_buf.flags |= XDRBUF_READ;
 631}
 632
 633/*
 634 * 2.2.9.  writeargs
 635 *
 636 *	struct writeargs {
 637 *		fhandle file;
 638 *		unsigned beginoffset;
 639 *		unsigned offset;
 640 *		unsigned totalcount;
 641 *		nfsdata data;
 642 *	};
 643 */
 644static void encode_writeargs(struct xdr_stream *xdr,
 645			     const struct nfs_pgio_args *args)
 646{
 647	u32 offset = args->offset;
 648	u32 count = args->count;
 649	__be32 *p;
 650
 651	encode_fhandle(xdr, args->fh);
 652
 653	p = xdr_reserve_space(xdr, 4 + 4 + 4 + 4);
 654	*p++ = cpu_to_be32(offset);
 655	*p++ = cpu_to_be32(offset);
 656	*p++ = cpu_to_be32(count);
 657
 658	/* nfsdata */
 659	*p = cpu_to_be32(count);
 660	xdr_write_pages(xdr, args->pages, args->pgbase, count);
 661}
 662
 663static void nfs2_xdr_enc_writeargs(struct rpc_rqst *req,
 664				   struct xdr_stream *xdr,
 665				   const void *data)
 666{
 667	const struct nfs_pgio_args *args = data;
 668
 669	encode_writeargs(xdr, args);
 670	xdr->buf->flags |= XDRBUF_WRITE;
 671}
 672
 673/*
 674 * 2.2.10.  createargs
 675 *
 676 *	struct createargs {
 677 *		diropargs where;
 678 *		sattr attributes;
 679 *	};
 680 */
 681static void nfs2_xdr_enc_createargs(struct rpc_rqst *req,
 682				    struct xdr_stream *xdr,
 683				    const void *data)
 684{
 685	const struct nfs_createargs *args = data;
 686
 687	encode_diropargs(xdr, args->fh, args->name, args->len);
 688	encode_sattr(xdr, args->sattr, rpc_rqst_userns(req));
 689}
 690
 691static void nfs2_xdr_enc_removeargs(struct rpc_rqst *req,
 692				    struct xdr_stream *xdr,
 693				    const void *data)
 694{
 695	const struct nfs_removeargs *args = data;
 696
 697	encode_diropargs(xdr, args->fh, args->name.name, args->name.len);
 698}
 699
 700/*
 701 * 2.2.12.  renameargs
 702 *
 703 *	struct renameargs {
 704 *		diropargs from;
 705 *		diropargs to;
 706 *	};
 707 */
 708static void nfs2_xdr_enc_renameargs(struct rpc_rqst *req,
 709				    struct xdr_stream *xdr,
 710				    const void *data)
 711{
 712	const struct nfs_renameargs *args = data;
 713	const struct qstr *old = args->old_name;
 714	const struct qstr *new = args->new_name;
 715
 716	encode_diropargs(xdr, args->old_dir, old->name, old->len);
 717	encode_diropargs(xdr, args->new_dir, new->name, new->len);
 718}
 719
 720/*
 721 * 2.2.13.  linkargs
 722 *
 723 *	struct linkargs {
 724 *		fhandle from;
 725 *		diropargs to;
 726 *	};
 727 */
 728static void nfs2_xdr_enc_linkargs(struct rpc_rqst *req,
 729				  struct xdr_stream *xdr,
 730				  const void *data)
 731{
 732	const struct nfs_linkargs *args = data;
 733
 734	encode_fhandle(xdr, args->fromfh);
 735	encode_diropargs(xdr, args->tofh, args->toname, args->tolen);
 736}
 737
 738/*
 739 * 2.2.14.  symlinkargs
 740 *
 741 *	struct symlinkargs {
 742 *		diropargs from;
 743 *		path to;
 744 *		sattr attributes;
 745 *	};
 746 */
 747static void nfs2_xdr_enc_symlinkargs(struct rpc_rqst *req,
 748				     struct xdr_stream *xdr,
 749				     const void *data)
 750{
 751	const struct nfs_symlinkargs *args = data;
 752
 753	encode_diropargs(xdr, args->fromfh, args->fromname, args->fromlen);
 754	encode_path(xdr, args->pages, args->pathlen);
 755	encode_sattr(xdr, args->sattr, rpc_rqst_userns(req));
 756}
 757
 758/*
 759 * 2.2.17.  readdirargs
 760 *
 761 *	struct readdirargs {
 762 *		fhandle dir;
 763 *		nfscookie cookie;
 764 *		unsigned count;
 765 *	};
 766 */
 767static void encode_readdirargs(struct xdr_stream *xdr,
 768			       const struct nfs_readdirargs *args)
 769{
 770	__be32 *p;
 771
 772	encode_fhandle(xdr, args->fh);
 773
 774	p = xdr_reserve_space(xdr, 4 + 4);
 775	*p++ = cpu_to_be32(args->cookie);
 776	*p = cpu_to_be32(args->count);
 777}
 778
 779static void nfs2_xdr_enc_readdirargs(struct rpc_rqst *req,
 780				     struct xdr_stream *xdr,
 781				     const void *data)
 782{
 783	const struct nfs_readdirargs *args = data;
 784
 785	encode_readdirargs(xdr, args);
 786	rpc_prepare_reply_pages(req, args->pages, 0, args->count,
 787				NFS_readdirres_sz - NFS_pagepad_sz);
 788}
 789
 790/*
 791 * NFSv2 XDR decode functions
 792 *
 793 * NFSv2 result types are defined in section 2.2 of RFC 1094:
 794 * "NFS: Network File System Protocol Specification".
 795 */
 796
 797static int nfs2_xdr_dec_stat(struct rpc_rqst *req, struct xdr_stream *xdr,
 798			     void *__unused)
 799{
 800	enum nfs_stat status;
 801	int error;
 802
 803	error = decode_stat(xdr, &status);
 804	if (unlikely(error))
 805		goto out;
 806	if (status != NFS_OK)
 807		goto out_default;
 808out:
 809	return error;
 810out_default:
 811	return nfs_stat_to_errno(status);
 812}
 813
 814static int nfs2_xdr_dec_attrstat(struct rpc_rqst *req, struct xdr_stream *xdr,
 815				 void *result)
 816{
 817	return decode_attrstat(xdr, result, NULL, rpc_rqst_userns(req));
 818}
 819
 820static int nfs2_xdr_dec_diropres(struct rpc_rqst *req, struct xdr_stream *xdr,
 821				 void *result)
 822{
 823	return decode_diropres(xdr, result, rpc_rqst_userns(req));
 824}
 825
 826/*
 827 * 2.2.6.  readlinkres
 828 *
 829 *	union readlinkres switch (stat status) {
 830 *	case NFS_OK:
 831 *		path data;
 832 *	default:
 833 *		void;
 834 *	};
 835 */
 836static int nfs2_xdr_dec_readlinkres(struct rpc_rqst *req,
 837				    struct xdr_stream *xdr, void *__unused)
 838{
 839	enum nfs_stat status;
 840	int error;
 841
 842	error = decode_stat(xdr, &status);
 843	if (unlikely(error))
 844		goto out;
 845	if (status != NFS_OK)
 846		goto out_default;
 847	error = decode_path(xdr);
 848out:
 849	return error;
 850out_default:
 851	return nfs_stat_to_errno(status);
 852}
 853
 854/*
 855 * 2.2.7.  readres
 856 *
 857 *	union readres switch (stat status) {
 858 *	case NFS_OK:
 859 *		fattr attributes;
 860 *		nfsdata data;
 861 *	default:
 862 *		void;
 863 *	};
 864 */
 865static int nfs2_xdr_dec_readres(struct rpc_rqst *req, struct xdr_stream *xdr,
 866				void *data)
 867{
 868	struct nfs_pgio_res *result = data;
 869	enum nfs_stat status;
 870	int error;
 871
 872	error = decode_stat(xdr, &status);
 873	if (unlikely(error))
 874		goto out;
 875	result->op_status = status;
 876	if (status != NFS_OK)
 877		goto out_default;
 878	error = decode_fattr(xdr, result->fattr, rpc_rqst_userns(req));
 879	if (unlikely(error))
 880		goto out;
 881	error = decode_nfsdata(xdr, result);
 882out:
 883	return error;
 884out_default:
 885	return nfs_stat_to_errno(status);
 886}
 887
 888static int nfs2_xdr_dec_writeres(struct rpc_rqst *req, struct xdr_stream *xdr,
 889				 void *data)
 890{
 891	struct nfs_pgio_res *result = data;
 892
 893	/* All NFSv2 writes are "file sync" writes */
 894	result->verf->committed = NFS_FILE_SYNC;
 895	return decode_attrstat(xdr, result->fattr, &result->op_status,
 896			rpc_rqst_userns(req));
 897}
 898
 899/**
 900 * nfs2_decode_dirent - Decode a single NFSv2 directory entry stored in
 901 *                      the local page cache.
 902 * @xdr: XDR stream where entry resides
 903 * @entry: buffer to fill in with entry data
 904 * @plus: boolean indicating whether this should be a readdirplus entry
 905 *
 906 * Returns zero if successful, otherwise a negative errno value is
 907 * returned.
 908 *
 909 * This function is not invoked during READDIR reply decoding, but
 910 * rather whenever an application invokes the getdents(2) system call
 911 * on a directory already in our cache.
 912 *
 913 * 2.2.17.  entry
 914 *
 915 *	struct entry {
 916 *		unsigned	fileid;
 917 *		filename	name;
 918 *		nfscookie	cookie;
 919 *		entry		*nextentry;
 920 *	};
 921 */
 922int nfs2_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry,
 923		       bool plus)
 924{
 925	__be32 *p;
 926	int error;
 927
 928	p = xdr_inline_decode(xdr, 4);
 929	if (unlikely(!p))
 930		return -EAGAIN;
 931	if (*p++ == xdr_zero) {
 932		p = xdr_inline_decode(xdr, 4);
 933		if (unlikely(!p))
 934			return -EAGAIN;
 935		if (*p++ == xdr_zero)
 936			return -EAGAIN;
 937		entry->eof = 1;
 938		return -EBADCOOKIE;
 939	}
 940
 941	p = xdr_inline_decode(xdr, 4);
 942	if (unlikely(!p))
 943		return -EAGAIN;
 944	entry->ino = be32_to_cpup(p);
 945
 946	error = decode_filename_inline(xdr, &entry->name, &entry->len);
 947	if (unlikely(error))
 948		return error == -ENAMETOOLONG ? -ENAMETOOLONG : -EAGAIN;
 949
 950	/*
 951	 * The type (size and byte order) of nfscookie isn't defined in
 952	 * RFC 1094.  This implementation assumes that it's an XDR uint32.
 953	 */
 
 954	p = xdr_inline_decode(xdr, 4);
 955	if (unlikely(!p))
 956		return -EAGAIN;
 957	entry->cookie = be32_to_cpup(p);
 958
 959	entry->d_type = DT_UNKNOWN;
 960
 961	return 0;
 
 
 
 
 962}
 963
 964/*
 965 * 2.2.17.  readdirres
 966 *
 967 *	union readdirres switch (stat status) {
 968 *	case NFS_OK:
 969 *		struct {
 970 *			entry *entries;
 971 *			bool eof;
 972 *		} readdirok;
 973 *	default:
 974 *		void;
 975 *	};
 976 *
 977 * Read the directory contents into the page cache, but don't
 978 * touch them.  The actual decoding is done by nfs2_decode_dirent()
 979 * during subsequent nfs_readdir() calls.
 980 */
 981static int decode_readdirok(struct xdr_stream *xdr)
 982{
 983	return xdr_read_pages(xdr, xdr->buf->page_len);
 984}
 985
 986static int nfs2_xdr_dec_readdirres(struct rpc_rqst *req,
 987				   struct xdr_stream *xdr, void *__unused)
 988{
 989	enum nfs_stat status;
 990	int error;
 991
 992	error = decode_stat(xdr, &status);
 993	if (unlikely(error))
 994		goto out;
 995	if (status != NFS_OK)
 996		goto out_default;
 997	error = decode_readdirok(xdr);
 998out:
 999	return error;
1000out_default:
1001	return nfs_stat_to_errno(status);
1002}
1003
1004/*
1005 * 2.2.18.  statfsres
1006 *
1007 *	union statfsres (stat status) {
1008 *	case NFS_OK:
1009 *		struct {
1010 *			unsigned tsize;
1011 *			unsigned bsize;
1012 *			unsigned blocks;
1013 *			unsigned bfree;
1014 *			unsigned bavail;
1015 *		} info;
1016 *	default:
1017 *		void;
1018 *	};
1019 */
1020static int decode_info(struct xdr_stream *xdr, struct nfs2_fsstat *result)
1021{
1022	__be32 *p;
1023
1024	p = xdr_inline_decode(xdr, NFS_info_sz << 2);
1025	if (unlikely(!p))
1026		return -EIO;
1027	result->tsize  = be32_to_cpup(p++);
1028	result->bsize  = be32_to_cpup(p++);
1029	result->blocks = be32_to_cpup(p++);
1030	result->bfree  = be32_to_cpup(p++);
1031	result->bavail = be32_to_cpup(p);
1032	return 0;
 
 
 
1033}
1034
1035static int nfs2_xdr_dec_statfsres(struct rpc_rqst *req, struct xdr_stream *xdr,
1036				  void *result)
1037{
1038	enum nfs_stat status;
1039	int error;
1040
1041	error = decode_stat(xdr, &status);
1042	if (unlikely(error))
1043		goto out;
1044	if (status != NFS_OK)
1045		goto out_default;
1046	error = decode_info(xdr, result);
1047out:
1048	return error;
1049out_default:
1050	return nfs_stat_to_errno(status);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1051}
1052
1053#define PROC(proc, argtype, restype, timer)				\
1054[NFSPROC_##proc] = {							\
1055	.p_proc	    =  NFSPROC_##proc,					\
1056	.p_encode   =  nfs2_xdr_enc_##argtype,				\
1057	.p_decode   =  nfs2_xdr_dec_##restype,				\
1058	.p_arglen   =  NFS_##argtype##_sz,				\
1059	.p_replen   =  NFS_##restype##_sz,				\
1060	.p_timer    =  timer,						\
1061	.p_statidx  =  NFSPROC_##proc,					\
1062	.p_name     =  #proc,						\
1063	}
1064const struct rpc_procinfo nfs_procedures[] = {
1065	PROC(GETATTR,	fhandle,	attrstat,	1),
1066	PROC(SETATTR,	sattrargs,	attrstat,	0),
1067	PROC(LOOKUP,	diropargs,	diropres,	2),
1068	PROC(READLINK,	readlinkargs,	readlinkres,	3),
1069	PROC(READ,	readargs,	readres,	3),
1070	PROC(WRITE,	writeargs,	writeres,	4),
1071	PROC(CREATE,	createargs,	diropres,	0),
1072	PROC(REMOVE,	removeargs,	stat,		0),
1073	PROC(RENAME,	renameargs,	stat,		0),
1074	PROC(LINK,	linkargs,	stat,		0),
1075	PROC(SYMLINK,	symlinkargs,	stat,		0),
1076	PROC(MKDIR,	createargs,	diropres,	0),
1077	PROC(RMDIR,	diropargs,	stat,		0),
1078	PROC(READDIR,	readdirargs,	readdirres,	3),
1079	PROC(STATFS,	fhandle,	statfsres,	0),
1080};
1081
1082static unsigned int nfs_version2_counts[ARRAY_SIZE(nfs_procedures)];
1083const struct rpc_version nfs_version2 = {
1084	.number			= 2,
1085	.nrprocs		= ARRAY_SIZE(nfs_procedures),
1086	.procs			= nfs_procedures,
1087	.counts			= nfs_version2_counts,
1088};