Short write in nfsd becomes a full write to the client
authorDavid Shaw <dshaw@jabberwocky.com>
Fri, 11 Sep 2009 22:44:45 +0000 (18:44 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 24 Sep 2009 15:47:40 +0000 (08:47 -0700)
commit25151810b6566162d07be68a9d3d9381a7c83de1
tree6c88c8b43302e661b4b2504d20d5d6caad4fa0f3
parent4e109e60b67459bd46e796d25373fe850f75b9f3
Short write in nfsd becomes a full write to the client

commit 31dec2538e45e9fff2007ea1f4c6bae9f78db724 upstream.

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>
Cc: Chuck Ebbert <cebbert@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/nfsd/nfs3proc.c
fs/nfsd/nfs4proc.c
fs/nfsd/nfsproc.c
fs/nfsd/vfs.c
include/linux/nfsd/nfsd.h