diff options
author | J. Bruce Fields <bfields@redhat.com> | 2014-01-09 16:24:35 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2014-01-23 13:50:27 -0500 |
commit | 068c34c0ce8add2e5f01ee6c85710e6fefb832ad (patch) | |
tree | afdc7ef6f2a5d385fa7393b1d25a6d4aa1855b81 | |
parent | 3554116d3aae25353713f3d0131d86ae6c1e5674 (diff) |
nfsd: fix encode_entryplus_baggage stack usage
We stick an extra svc_fh in nfsd3_readdirres to save the need to
kmalloc, though maybe it would be fine to kmalloc instead.
Acked-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
-rw-r--r-- | fs/nfsd/nfs3xdr.c | 12 | ||||
-rw-r--r-- | fs/nfsd/xdr3.h | 3 |
2 files changed, 9 insertions, 6 deletions
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 1ee6baec5fa1..de6e39e12cb3 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c | |||
@@ -842,21 +842,21 @@ out: | |||
842 | 842 | ||
843 | static __be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen) | 843 | static __be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen) |
844 | { | 844 | { |
845 | struct svc_fh fh; | 845 | struct svc_fh *fh = &cd->scratch; |
846 | __be32 err; | 846 | __be32 err; |
847 | 847 | ||
848 | fh_init(&fh, NFS3_FHSIZE); | 848 | fh_init(fh, NFS3_FHSIZE); |
849 | err = compose_entry_fh(cd, &fh, name, namlen); | 849 | err = compose_entry_fh(cd, fh, name, namlen); |
850 | if (err) { | 850 | if (err) { |
851 | *p++ = 0; | 851 | *p++ = 0; |
852 | *p++ = 0; | 852 | *p++ = 0; |
853 | goto out; | 853 | goto out; |
854 | } | 854 | } |
855 | p = encode_post_op_attr(cd->rqstp, p, &fh); | 855 | p = encode_post_op_attr(cd->rqstp, p, fh); |
856 | *p++ = xdr_one; /* yes, a file handle follows */ | 856 | *p++ = xdr_one; /* yes, a file handle follows */ |
857 | p = encode_fh(p, &fh); | 857 | p = encode_fh(p, fh); |
858 | out: | 858 | out: |
859 | fh_put(&fh); | 859 | fh_put(fh); |
860 | return p; | 860 | return p; |
861 | } | 861 | } |
862 | 862 | ||
diff --git a/fs/nfsd/xdr3.h b/fs/nfsd/xdr3.h index b6d5542a4ac8..335e04aaf7db 100644 --- a/fs/nfsd/xdr3.h +++ b/fs/nfsd/xdr3.h | |||
@@ -174,6 +174,9 @@ struct nfsd3_linkres { | |||
174 | struct nfsd3_readdirres { | 174 | struct nfsd3_readdirres { |
175 | __be32 status; | 175 | __be32 status; |
176 | struct svc_fh fh; | 176 | struct svc_fh fh; |
177 | /* Just to save kmalloc on every readdirplus entry (svc_fh is a | ||
178 | * little large for the stack): */ | ||
179 | struct svc_fh scratch; | ||
177 | int count; | 180 | int count; |
178 | __be32 verf[2]; | 181 | __be32 verf[2]; |
179 | 182 | ||