linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kinglong Mee <kinglongmee@gmail.com>
To: "J. Bruce Fields" <bfields@redhat.com>, linux-nfs@vger.kernel.org
Cc: Christoph Hellwig <hch@infradead.org>
Subject: Re: [PATCH 13/52] nfsd4: use xdr_reserve_space in attribute encoding
Date: Sun, 25 May 2014 16:46:42 +0800	[thread overview]
Message-ID: <5381ADF2.4050209@gmail.com> (raw)
In-Reply-To: <1400787148-25941-14-git-send-email-bfields@redhat.com>

On 5/23/2014 03:31, J. Bruce Fields wrote:
> From: "J. Bruce Fields" <bfields@redhat.com>
> 
> This is a cosmetic change for now; no change in behavior.
> 
> Note we're just depending on xdr_reserve_space to do the bounds checking
> for us, we're not really depending on its adjustment of iovec or xdr_buf
> lengths yet, as those are fixed up by as necessary after the fact by
> read-link operations and by nfs4svc_encode_compoundres.  However we do
> have to update xdr->iov on read-like operations to prevent
> xdr_reserve_space from messing with the already-fixed-up length of the
> the head.
> 
> When the attribute encoding fails partway through we have to undo the
> length adjustments made so far.  We do it manually for now, but later
> patches will add an xdr_truncate_encode() helper to handle cases like
> this.
> 
> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
> ---
>  fs/nfsd/acl.h       |   2 +-
>  fs/nfsd/idmap.h     |   4 +-
>  fs/nfsd/nfs4acl.c   |  11 +-
>  fs/nfsd/nfs4idmap.c |  42 ++++----
>  fs/nfsd/nfs4proc.c  |   1 +
>  fs/nfsd/nfs4xdr.c   | 286 +++++++++++++++++++++++++++++++---------------------
>  6 files changed, 202 insertions(+), 144 deletions(-)
> 
> diff --git a/fs/nfsd/acl.h b/fs/nfsd/acl.h
> index b481e1f..a986ceb 100644
> --- a/fs/nfsd/acl.h
> +++ b/fs/nfsd/acl.h
> @@ -49,7 +49,7 @@ struct svc_rqst;
>  
>  struct nfs4_acl *nfs4_acl_new(int);
>  int nfs4_acl_get_whotype(char *, u32);
> -__be32 nfs4_acl_write_who(int who, __be32 **p, int *len);
> +__be32 nfs4_acl_write_who(struct xdr_stream *xdr, int who);
>  
>  int nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry,
>  		struct nfs4_acl **acl);
> diff --git a/fs/nfsd/idmap.h b/fs/nfsd/idmap.h
> index 66e58db..a3f3490 100644
> --- a/fs/nfsd/idmap.h
> +++ b/fs/nfsd/idmap.h
> @@ -56,7 +56,7 @@ static inline void nfsd_idmap_shutdown(struct net *net)
>  
>  __be32 nfsd_map_name_to_uid(struct svc_rqst *, const char *, size_t, kuid_t *);
>  __be32 nfsd_map_name_to_gid(struct svc_rqst *, const char *, size_t, kgid_t *);
> -__be32 nfsd4_encode_user(struct svc_rqst *, kuid_t, __be32 **, int *);
> -__be32 nfsd4_encode_group(struct svc_rqst *, kgid_t, __be32 **, int *);
> +__be32 nfsd4_encode_user(struct xdr_stream *, struct svc_rqst *, kuid_t);
> +__be32 nfsd4_encode_group(struct xdr_stream *, struct svc_rqst *, kgid_t);
>  
>  #endif /* LINUX_NFSD_IDMAP_H */
> diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c
> index 7c7c025..d714156 100644
> --- a/fs/nfsd/nfs4acl.c
> +++ b/fs/nfsd/nfs4acl.c
> @@ -919,20 +919,19 @@ nfs4_acl_get_whotype(char *p, u32 len)
>  	return NFS4_ACL_WHO_NAMED;
>  }
>  
> -__be32 nfs4_acl_write_who(int who, __be32 **p, int *len)
> +__be32 nfs4_acl_write_who(struct xdr_stream *xdr, int who)
>  {
> +	__be32 *p;
>  	int i;
> -	int bytes;
>  
>  	for (i = 0; i < ARRAY_SIZE(s2t_map); i++) {
>  		if (s2t_map[i].type != who)
>  			continue;
> -		bytes = 4 + (XDR_QUADLEN(s2t_map[i].stringlen) << 2);
> -		if (bytes > *len)
> +		p = xdr_reserve_space(xdr, s2t_map[i].stringlen + 4);
> +		if (!p)
>  			return nfserr_resource;
> -		*p = xdr_encode_opaque(*p, s2t_map[i].string,
> +		p = xdr_encode_opaque(p, s2t_map[i].string,
>  					s2t_map[i].stringlen);
> -		*len -= bytes;
>  		return 0;
>  	}
>  	WARN_ON_ONCE(1);
> diff --git a/fs/nfsd/nfs4idmap.c b/fs/nfsd/nfs4idmap.c
> index c0dfde6..a0ab0a8 100644
> --- a/fs/nfsd/nfs4idmap.c
> +++ b/fs/nfsd/nfs4idmap.c
> @@ -551,44 +551,43 @@ idmap_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen
>  	return 0;
>  }
>  
> -static __be32 encode_ascii_id(u32 id, __be32 **p, int *buflen)
> +static __be32 encode_ascii_id(struct xdr_stream *xdr, u32 id)
>  {
>  	char buf[11];
>  	int len;
> -	int bytes;
> +	__be32 *p;
>  
>  	len = sprintf(buf, "%u", id);
> -	bytes = 4 + (XDR_QUADLEN(len) << 2);
> -	if (bytes > *buflen)
> +	p = xdr_reserve_space(xdr, len + 4);
> +	if (!p)
>  		return nfserr_resource;
> -	*p = xdr_encode_opaque(*p, buf, len);
> -	*buflen -= bytes;
> +	p = xdr_encode_opaque(p, buf, len);
>  	return 0;
>  }
>  
> -static __be32 idmap_id_to_name(struct svc_rqst *rqstp, int type, u32 id, __be32 **p, int *buflen)
> +static __be32 idmap_id_to_name(struct xdr_stream *xdr,
> +			       struct svc_rqst *rqstp, int type, u32 id)
>  {
>  	struct ent *item, key = {
>  		.id = id,
>  		.type = type,
>  	};
> +	__be32 *p;
>  	int ret;
> -	int bytes;
>  	struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
>  
>  	strlcpy(key.authname, rqst_authname(rqstp), sizeof(key.authname));
>  	ret = idmap_lookup(rqstp, idtoname_lookup, &key, nn->idtoname_cache, &item);
>  	if (ret == -ENOENT)
> -		return encode_ascii_id(id, p, buflen);
> +		return encode_ascii_id(xdr, id);
>  	if (ret)
>  		return nfserrno(ret);
>  	ret = strlen(item->name);
>  	WARN_ON_ONCE(ret > IDMAP_NAMESZ);
> -	bytes = 4 + (XDR_QUADLEN(ret) << 2);
> -	if (bytes > *buflen)
> +	p = xdr_reserve_space(xdr, ret + 4);
> +	if (!p)
>  		return nfserr_resource;
> -	*p = xdr_encode_opaque(*p, item->name, ret);
> -	*buflen -= bytes;
> +	p = xdr_encode_opaque(p, item->name, ret);
>  	cache_put(&item->h, nn->idtoname_cache);
>  	return 0;
>  }
> @@ -622,11 +621,12 @@ do_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, u
>  	return idmap_name_to_id(rqstp, type, name, namelen, id);
>  }
>  
> -static __be32 encode_name_from_id(struct svc_rqst *rqstp, int type, u32 id, __be32 **p, int *buflen)
> +static __be32 encode_name_from_id(struct xdr_stream *xdr,
> +				  struct svc_rqst *rqstp, int type, u32 id)
>  {
>  	if (nfs4_disable_idmapping && rqstp->rq_cred.cr_flavor < RPC_AUTH_GSS)
> -		return encode_ascii_id(id, p, buflen);
> -	return idmap_id_to_name(rqstp, type, id, p, buflen);
> +		return encode_ascii_id(xdr, id);
> +	return idmap_id_to_name(xdr, rqstp, type, id);
>  }
>  
>  __be32
> @@ -655,14 +655,16 @@ nfsd_map_name_to_gid(struct svc_rqst *rqstp, const char *name, size_t namelen,
>  	return status;
>  }
>  
> -__be32 nfsd4_encode_user(struct svc_rqst *rqstp, kuid_t uid,  __be32 **p, int *buflen)
> +__be32 nfsd4_encode_user(struct xdr_stream *xdr, struct svc_rqst *rqstp,
> +			 kuid_t uid)
>  {
>  	u32 id = from_kuid(&init_user_ns, uid);
> -	return encode_name_from_id(rqstp, IDMAP_TYPE_USER, id, p, buflen);
> +	return encode_name_from_id(xdr, rqstp, IDMAP_TYPE_USER, id);
>  }
>  
> -__be32 nfsd4_encode_group(struct svc_rqst *rqstp, kgid_t gid, __be32 **p, int *buflen)
> +__be32 nfsd4_encode_group(struct xdr_stream *xdr, struct svc_rqst *rqstp,
> +			  kgid_t gid)
>  {
>  	u32 id = from_kgid(&init_user_ns, gid);
> -	return encode_name_from_id(rqstp, IDMAP_TYPE_GROUP, id, p, buflen);
> +	return encode_name_from_id(xdr, rqstp, IDMAP_TYPE_GROUP, id);
>  }
> diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
> index db14965..1433854 100644
> --- a/fs/nfsd/nfs4proc.c
> +++ b/fs/nfsd/nfs4proc.c
> @@ -1261,6 +1261,7 @@ static void svcxdr_init_encode(struct svc_rqst *rqstp,
>  	struct kvec *head = buf->head;
>  
>  	xdr->buf = buf;
> +	xdr->iov = head;
>  	xdr->p   = head->iov_base + head->iov_len;
>  	xdr->end = head->iov_base + PAGE_SIZE - 2 * RPC_MAX_AUTH_SIZE;
>  }
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index 2ed8036..0ab7aae 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -1755,18 +1755,20 @@ static void write_cinfo(__be32 **p, struct nfsd4_change_info *c)
>  /* Encode as an array of strings the string given with components
>   * separated @sep, escaped with esc_enter and esc_exit.
>   */
> -static __be32 nfsd4_encode_components_esc(char sep, char *components,
> -				   __be32 **pp, int *buflen,
> -				   char esc_enter, char esc_exit)
> +static __be32 nfsd4_encode_components_esc(struct xdr_stream *xdr, char sep,
> +					  char *components, char esc_enter,
> +					  char esc_exit)
>  {
> -	__be32 *p = *pp;
> -	__be32 *countp = p;
> +	__be32 *p;
> +	__be32 *countp;
>  	int strlen, count=0;
>  	char *str, *end, *next;
>  
>  	dprintk("nfsd4_encode_components(%s)\n", components);
> -	if ((*buflen -= 4) < 0)
> +	p = xdr_reserve_space(xdr, 4);
> +	if (!p)
>  		return nfserr_resource;
> +	countp = p;
>  	WRITE32(0); /* We will fill this in with @count later */
>  	end = str = components;
>  	while (*end) {
> @@ -1789,7 +1791,8 @@ static __be32 nfsd4_encode_components_esc(char sep, char *components,
>  
>  		strlen = end - str;
>  		if (strlen) {
> -			if ((*buflen -= ((XDR_QUADLEN(strlen) << 2) + 4)) < 0)
> +			p = xdr_reserve_space(xdr, strlen + 4);
> +			if (!p)
>  				return nfserr_resource;
>  			WRITE32(strlen);
>  			WRITEMEM(str, strlen);
> @@ -1799,7 +1802,6 @@ static __be32 nfsd4_encode_components_esc(char sep, char *components,
>  			end++;
>  		str = end;
>  	}
> -	*pp = p;
>  	p = countp;
>  	WRITE32(count);
>  	return 0;
> @@ -1808,40 +1810,39 @@ static __be32 nfsd4_encode_components_esc(char sep, char *components,
>  /* Encode as an array of strings the string given with components
>   * separated @sep.
>   */
> -static __be32 nfsd4_encode_components(char sep, char *components,
> -				   __be32 **pp, int *buflen)
> +static __be32 nfsd4_encode_components(struct xdr_stream *xdr, char sep,
> +				      char *components)
>  {
> -	return nfsd4_encode_components_esc(sep, components, pp, buflen, 0, 0);
> +	return nfsd4_encode_components_esc(xdr, sep, components, 0, 0);
>  }
>  
>  /*
>   * encode a location element of a fs_locations structure
>   */
> -static __be32 nfsd4_encode_fs_location4(struct nfsd4_fs_location *location,
> -				    __be32 **pp, int *buflen)
> +static __be32 nfsd4_encode_fs_location4(struct xdr_stream *xdr,
> +					struct nfsd4_fs_location *location)
>  {
>  	__be32 status;
> -	__be32 *p = *pp;
>  
> -	status = nfsd4_encode_components_esc(':', location->hosts, &p, buflen,
> +	status = nfsd4_encode_components_esc(xdr, ':', location->hosts,
>  						'[', ']');
>  	if (status)
>  		return status;
> -	status = nfsd4_encode_components('/', location->path, &p, buflen);
> +	status = nfsd4_encode_components(xdr, '/', location->path);
>  	if (status)
>  		return status;
> -	*pp = p;
>  	return 0;
>  }
>  
>  /*
>   * Encode a path in RFC3530 'pathname4' format
>   */
> -static __be32 nfsd4_encode_path(const struct path *root,
> -		const struct path *path, __be32 **pp, int *buflen)
> +static __be32 nfsd4_encode_path(struct xdr_stream *xdr,
> +				const struct path *root,
> +				const struct path *path)
>  {
>  	struct path cur = *path;
> -	__be32 *p = *pp;
> +	__be32 *p;
>  	struct dentry **components = NULL;
>  	unsigned int ncomponents = 0;
>  	__be32 err = nfserr_jukebox;
> @@ -1872,9 +1873,9 @@ static __be32 nfsd4_encode_path(const struct path *root,
>  		components[ncomponents++] = cur.dentry;
>  		cur.dentry = dget_parent(cur.dentry);
>  	}
> -
> -	*buflen -= 4;
> -	if (*buflen < 0)
> +	err = nfserr_resource;
> +	p = xdr_reserve_space(xdr, 4);
> +	if (!p)
>  		goto out_free;
>  	WRITE32(ncomponents);
>  
> @@ -1884,8 +1885,8 @@ static __be32 nfsd4_encode_path(const struct path *root,
>  
>  		spin_lock(&dentry->d_lock);
>  		len = dentry->d_name.len;
> -		*buflen -= 4 + (XDR_QUADLEN(len) << 2);
> -		if (*buflen < 0) {
> +		p = xdr_reserve_space(xdr, len + 4);
> +		if (!p) {
>  			spin_unlock(&dentry->d_lock);
>  			goto out_free;
>  		}
> @@ -1897,7 +1898,6 @@ static __be32 nfsd4_encode_path(const struct path *root,
>  		ncomponents--;
>  	}
>  
> -	*pp = p;
>  	err = 0;
>  out_free:
>  	dprintk(")\n");
> @@ -1908,8 +1908,8 @@ out_free:
>  	return err;
>  }
>  
> -static __be32 nfsd4_encode_fsloc_fsroot(struct svc_rqst *rqstp,
> -		const struct path *path, __be32 **pp, int *buflen)
> +static __be32 nfsd4_encode_fsloc_fsroot(struct xdr_stream *xdr,
> +			struct svc_rqst *rqstp, const struct path *path)
>  {
>  	struct svc_export *exp_ps;
>  	__be32 res;
> @@ -1917,7 +1917,7 @@ static __be32 nfsd4_encode_fsloc_fsroot(struct svc_rqst *rqstp,
>  	exp_ps = rqst_find_fsidzero_export(rqstp);
>  	if (IS_ERR(exp_ps))
>  		return nfserrno(PTR_ERR(exp_ps));
> -	res = nfsd4_encode_path(&exp_ps->ex_path, path, pp, buflen);
> +	res = nfsd4_encode_path(xdr, &exp_ps->ex_path, path);
>  	exp_put(exp_ps);
>  	return res;
>  }
> @@ -1925,28 +1925,26 @@ static __be32 nfsd4_encode_fsloc_fsroot(struct svc_rqst *rqstp,
>  /*
>   *  encode a fs_locations structure
>   */
> -static __be32 nfsd4_encode_fs_locations(struct svc_rqst *rqstp,
> -				     struct svc_export *exp,
> -				     __be32 **pp, int *buflen)
> +static __be32 nfsd4_encode_fs_locations(struct xdr_stream *xdr,
> +			struct svc_rqst *rqstp, struct svc_export *exp)
>  {
>  	__be32 status;
>  	int i;
> -	__be32 *p = *pp;
> +	__be32 *p;
>  	struct nfsd4_fs_locations *fslocs = &exp->ex_fslocs;
>  
> -	status = nfsd4_encode_fsloc_fsroot(rqstp, &exp->ex_path, &p, buflen);
> +	status = nfsd4_encode_fsloc_fsroot(xdr, rqstp, &exp->ex_path);
>  	if (status)
>  		return status;
> -	if ((*buflen -= 4) < 0)
> +	p = xdr_reserve_space(xdr, 4);
> +	if (!p)
>  		return nfserr_resource;
>  	WRITE32(fslocs->locations_count);
>  	for (i=0; i<fslocs->locations_count; i++) {
> -		status = nfsd4_encode_fs_location4(&fslocs->locations[i],
> -						   &p, buflen);
> +		status = nfsd4_encode_fs_location4(xdr, &fslocs->locations[i]);
>  		if (status)
>  			return status;
>  	}
> -	*pp = p;
>  	return 0;
>  }
>  
> @@ -1965,15 +1963,15 @@ static u32 nfs4_file_type(umode_t mode)
>  }
>  
>  static inline __be32
> -nfsd4_encode_aclname(struct svc_rqst *rqstp, struct nfs4_ace *ace,
> -		__be32 **p, int *buflen)
> +nfsd4_encode_aclname(struct xdr_stream *xdr, struct svc_rqst *rqstp,
> +		     struct nfs4_ace *ace)
>  {
>  	if (ace->whotype != NFS4_ACL_WHO_NAMED)
> -		return nfs4_acl_write_who(ace->whotype, p, buflen);
> +		return nfs4_acl_write_who(xdr, ace->whotype);
>  	else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP)
> -		return nfsd4_encode_group(rqstp, ace->who_gid, p, buflen);
> +		return nfsd4_encode_group(xdr, rqstp, ace->who_gid);
>  	else
> -		return nfsd4_encode_user(rqstp, ace->who_uid, p, buflen);
> +		return nfsd4_encode_user(xdr, rqstp, ace->who_uid);
>  }
>  
>  #define WORD0_ABSENT_FS_ATTRS (FATTR4_WORD0_FS_LOCATIONS | FATTR4_WORD0_FSID | \
> @@ -1982,31 +1980,28 @@ nfsd4_encode_aclname(struct svc_rqst *rqstp, struct nfs4_ace *ace,
>  
>  #ifdef CONFIG_NFSD_V4_SECURITY_LABEL
>  static inline __be32
> -nfsd4_encode_security_label(struct svc_rqst *rqstp, void *context, int len, __be32 **pp, int *buflen)
> +nfsd4_encode_security_label(struct xdr_stream *xdr, struct svc_rqst *rqstp,
> +			    void *context, int len)
>  {
>  	__be32 *p = *pp;

  CC [M]  fs/nfsd/nfs4xdr.o
fs/nfsd/nfs4xdr.c: In function ‘nfsd4_encode_security_label’:
fs/nfsd/nfs4xdr.c:1984:15: error: ‘pp’ undeclared (first use in this function)
  __be32 *p = *pp;
               ^
fs/nfsd/nfs4xdr.c:1984:15: note: each undeclared identifier is reported only once for each function it appears in
make[1]: *** [fs/nfsd/nfs4xdr.o] Error 1
make: *** [fs/nfsd/] Error 2

thanks,
Kinglong Mee

  reply	other threads:[~2014-05-25  8:46 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-22 19:31 xdr encoding fixes (v3) J. Bruce Fields
2014-05-22 19:31 ` [PATCH 01/52] nfsd4: READ, READDIR, etc., are idempotent J. Bruce Fields
2014-05-23  1:21   ` Kinglong Mee
2014-05-23 13:15     ` J. Bruce Fields
2014-05-22 19:31 ` [PATCH 02/52] nfsd4: allow larger 4.1 session drc slots J. Bruce Fields
2014-05-22 19:31 ` [PATCH 03/52] nfsd4: fill in some missing op_name's J. Bruce Fields
2014-05-22 19:31 ` [PATCH 04/52] nfsd4: decoding errors can still be cached and require space J. Bruce Fields
2014-05-22 19:31 ` [PATCH 05/52] nfsd4: read size estimate should include padding J. Bruce Fields
2014-05-22 19:31 ` [PATCH 06/52] nfsd4: fix write reply size estimate J. Bruce Fields
2014-05-22 19:31 ` [PATCH 07/52] nfsd4: embed xdr_stream in nfsd4_compoundres J. Bruce Fields
2014-05-22 19:31 ` [PATCH 08/52] nfsd4: tweak nfsd4_encode_getattr to take xdr_stream J. Bruce Fields
2014-05-22 19:31 ` [PATCH 09/52] nfsd4: move proc_compound xdr encode init to helper J. Bruce Fields
2014-05-22 19:31 ` [PATCH 10/52] nfsd4: reserve head space for krb5 integ/priv info J. Bruce Fields
2014-05-22 19:31 ` [PATCH 11/52] nfsd4: fix encoding of out-of-space replies J. Bruce Fields
2014-05-22 19:31 ` [PATCH 12/52] nfsd4: allow space for final error return J. Bruce Fields
2014-05-22 19:31 ` [PATCH 13/52] nfsd4: use xdr_reserve_space in attribute encoding J. Bruce Fields
2014-05-25  8:46   ` Kinglong Mee [this message]
2014-05-22 19:31 ` [PATCH 14/52] nfsd4: use xdr_stream throughout compound encoding J. Bruce Fields
2014-05-22 19:31 ` [PATCH 15/52] nfsd4: remove ADJUST_ARGS J. Bruce Fields
2014-05-22 19:31 ` [PATCH 16/52] nfsd4: no need for encode_compoundres to adjust lengths J. Bruce Fields
2014-05-22 19:31 ` [PATCH 17/52] nfsd4: keep xdr buf length updated J. Bruce Fields
2014-05-22 19:31 ` [PATCH 18/52] rpc: xdr_truncate_encode J. Bruce Fields
2014-05-22 19:31 ` [PATCH 19/52] nfsd4: use xdr_truncate_encode J. Bruce Fields
2014-05-22 19:31 ` [PATCH 20/52] nfsd4: "backfill" using write_bytes_to_xdr_buf J. Bruce Fields
2014-05-22 19:31 ` [PATCH 21/52] nfsd4: teach encoders to handle reserve_space failures J. Bruce Fields
2014-05-22 19:31 ` [PATCH 22/52] nfsd4: reserve space before inlining 0-copy pages J. Bruce Fields
2014-05-22 19:31 ` [PATCH 23/52] nfsd4: nfsd4_check_resp_size needn't recalculate length J. Bruce Fields
2014-05-22 19:31 ` [PATCH 24/52] nfsd4: remove redundant encode buffer size checking J. Bruce Fields
2014-05-22 19:32 ` [PATCH 25/52] nfsd4: size-checking cleanup J. Bruce Fields
2014-05-22 19:32 ` [PATCH 26/52] nfsd4: allow encoding across page boundaries J. Bruce Fields
2014-05-22 19:32 ` [PATCH 27/52] nfsd4: convert 4.1 replay encoding J. Bruce Fields
2014-05-22 19:32 ` [PATCH 28/52] nfsd4: don't try to encode conflicting owner if low on space J. Bruce Fields
2014-05-22 19:32 ` [PATCH 29/52] nfsd4: more precise nfsd4_max_reply J. Bruce Fields
2014-05-22 19:32 ` [PATCH 30/52] nfsd4: minor encode_read cleanup J. Bruce Fields
2014-05-22 19:32 ` [PATCH 31/52] nfsd4: nfsd4_check_resp_size should check against whole buffer J. Bruce Fields
2014-05-22 19:32 ` [PATCH 32/52] nfsd4: fix buflen calculation after read encoding J. Bruce Fields
2014-05-22 19:32 ` [PATCH 33/52] rpc: define xdr_restrict_buflen J. Bruce Fields
2014-05-22 19:32 ` [PATCH 34/52] nfsd4: adjust buflen to session channel limit J. Bruce Fields
2014-05-22 19:32 ` [PATCH 35/52] nfsd4: use session limits to release send buffer reservation J. Bruce Fields
2014-05-22 19:32 ` [PATCH 36/52] nfsd4: allow large readdirs J. Bruce Fields
2014-05-22 19:32 ` [PATCH 37/52] nfsd4: enforce rd_dircount J. Bruce Fields
2014-05-22 19:32 ` [PATCH 38/52] nfsd4: don't treat readlink like a zero-copy operation J. Bruce Fields
2014-05-22 19:32 ` [PATCH 39/52] nfsd4: better estimate of getattr response size J. Bruce Fields
2014-05-22 19:32 ` [PATCH 40/52] nfsd4: estimate sequence " J. Bruce Fields
2014-05-22 19:32 ` [PATCH 41/52] nfsd4: turn off zero-copy-read in exotic cases J. Bruce Fields
2014-05-28  8:09   ` Christoph Hellwig
2014-05-28 14:01     ` J. Bruce Fields
2014-05-28 14:13       ` Anna Schumaker
2014-05-28 14:23         ` J. Bruce Fields
2014-05-28 14:27           ` Anna Schumaker
2014-06-03  4:18           ` Weston Andros Adamson
2014-06-03 14:10             ` J. Bruce Fields
2014-06-03 14:24               ` Weston Andros Adamson
2014-06-03 14:35                 ` J. Bruce Fields
2014-05-28 21:08       ` J. Bruce Fields
2014-06-02 22:12         ` J. Bruce Fields
2014-05-22 19:32 ` [PATCH 42/52] nfsd4: nfsd_vfs_read doesn't use file handle parameter J. Bruce Fields
2014-05-22 19:32 ` [PATCH 43/52] nfsd4: separate splice and readv cases J. Bruce Fields
2014-05-22 19:32 ` [PATCH 44/52] nfsd4: read encoding cleanup J. Bruce Fields
2014-05-22 19:32 ` [PATCH 45/52] nfsd4: more " J. Bruce Fields
2014-05-22 19:32 ` [PATCH 46/52] nfsd4: allow exotic read compounds J. Bruce Fields
2014-05-22 19:32 ` [PATCH 47/52] nfsd4: really fix nfs4err_resource in 4.1 case J. Bruce Fields
2014-05-22 19:32 ` [PATCH 48/52] nfsd4: kill WRITE32 J. Bruce Fields
2014-05-22 19:32 ` [PATCH 49/52] nfsd4: kill WRITE64 J. Bruce Fields
2014-05-22 19:32 ` [PATCH 50/52] nfsd4: kill WRITEMEM J. Bruce Fields
2014-05-22 19:32 ` [PATCH 51/52] nfsd4: kill write32, write64 J. Bruce Fields
2014-05-22 19:32 ` [PATCH 52/52] nfsd4: better reservation of head space for krb5 J. Bruce Fields

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5381ADF2.4050209@gmail.com \
    --to=kinglongmee@gmail.com \
    --cc=bfields@redhat.com \
    --cc=hch@infradead.org \
    --cc=linux-nfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).