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
next prev parent 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).