aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs3proc.c
diff options
context:
space:
mode:
authorDavid Shaw <dshaw@jabberwocky.com>2009-03-05 20:16:14 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-03-18 17:38:40 -0400
commit31dec2538e45e9fff2007ea1f4c6bae9f78db724 (patch)
treec2b42679c73c1c6f31312f38a1b1d049e918d635 /fs/nfsd/nfs3proc.c
parent1e685ec270cb97680be4eb8cf6b615f5f7f1403a (diff)
Short write in nfsd becomes a full write to the client
If a filesystem being written to via NFS returns a short write count (as opposed to an error) to nfsd, nfsd treats that as a success for the entire write, rather than the short count that actually succeeded. For example, given a 8192 byte write, if the underlying filesystem only writes 4096 bytes, nfsd will ack back to the nfs client that all 8192 bytes were written. The nfs client does have retry logic for short writes, but this is never called as the client is told the complete write succeeded. There are probably other ways it could happen, but in my case it happened with a fuse (filesystem in userspace) filesystem which can rather easily have a partial write. Here is a patch to properly return the short write count to the client. Signed-off-by: David Shaw <dshaw@jabberwocky.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/nfsd/nfs3proc.c')
-rw-r--r--fs/nfsd/nfs3proc.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
index 579ce8c69daa..7c9fe838f038 100644
--- a/fs/nfsd/nfs3proc.c
+++ b/fs/nfsd/nfs3proc.c
@@ -203,6 +203,7 @@ nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
203 struct nfsd3_writeres *resp) 203 struct nfsd3_writeres *resp)
204{ 204{
205 __be32 nfserr; 205 __be32 nfserr;
206 unsigned long cnt = argp->len;
206 207
207 dprintk("nfsd: WRITE(3) %s %d bytes at %ld%s\n", 208 dprintk("nfsd: WRITE(3) %s %d bytes at %ld%s\n",
208 SVCFH_fmt(&argp->fh), 209 SVCFH_fmt(&argp->fh),
@@ -215,9 +216,9 @@ nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
215 nfserr = nfsd_write(rqstp, &resp->fh, NULL, 216 nfserr = nfsd_write(rqstp, &resp->fh, NULL,
216 argp->offset, 217 argp->offset,
217 rqstp->rq_vec, argp->vlen, 218 rqstp->rq_vec, argp->vlen,
218 argp->len, 219 &cnt,
219 &resp->committed); 220 &resp->committed);
220 resp->count = argp->count; 221 resp->count = cnt;
221 RETURN_STATUS(nfserr); 222 RETURN_STATUS(nfserr);
222} 223}
223 224