draft server xdr rewrite

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: "J. Bruce Fields" <bfields@xxxxxxxxxx>

The following patches fix two problems:
	- The server can't support ACLs longer than 4k.
	- The server can't return more than 4k of readdir data per rpc,
	  limiting performance on large directories.

At fault in both cases is the compound xdr encoding, which is unable to
deal with page boundaries.

Simplifying slightly:

I want to be able to write server code something like:

	__be32 *p;

	p = reserve_space(12)
		return nfserr_resource;
	write64(&p, bignum);
	write32(&p, smallernum);
	p = reserve_space(xdr, &p, 4+namelen);
	if (!p)
		return nfserr_resource;
	write32(&p, namelen);
	writemem(&p, name);
	...

and have page boundaries handled under the covers.

The following patches do that by replacing the __be32 * by
approximately:

	struct svcxdr_ptr {
		__be32 *p;
		struct page **next_page;
	}

with next_page a pointer into an array of available pages.  The encoders
can then traverse to the next page with something like:

	ptr->p = page_address(*ptr->next_page++);

We also define a svcxdr_stream to keep track of various state.  That and
not wanting a struct as a return value makes the reserve_space above
into:

	if (!reserve_space(xdr, &p, 12))
		return nfserr_resource;
	...

Seem reasonable?

If so, I plan to convert the rest of the v4 encoding.  (After revising
these patches--e.g. readdir still has a few problems I want to fix.  But
this does pass the usual connectathon and pynfs testing already.)

--b.

J. Bruce Fields (7):
  nfsd4: reserve space for integrity/privacy
  nfsd4: simplify nfsd4_encode_fattr interface slightly
  nfsd4: nfsd4_encode_fattr cleanup
  nfsd4: encode_rdattr_error cleanup
  nfsd4: rewrite xdr encoding of attributes
  nfsd4: track maximum bytes
  nfsd4: readdir encoding

 fs/nfsd/nfs4proc.c |  17 +-
 fs/nfsd/nfs4xdr.c  | 892 +++++++++++++++++++++++++++++++++--------------------
 fs/nfsd/xdr4.h     |  24 +-
 3 files changed, 588 insertions(+), 345 deletions(-)

-- 
1.7.11.7

--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux