fuse: writepages: crop secondary requests
authorMaxim Patlasov <MPatlasov@parallels.com>
Wed, 2 Oct 2013 17:38:32 +0000 (21:38 +0400)
committerMiklos Szeredi <mszeredi@suse.cz>
Tue, 5 Nov 2013 09:11:27 +0000 (10:11 +0100)
commit6eaf4782eb09e28dbd13d23b9ce0fb7646daf37e
tree10416e984f694f35454238a2b7f1b8f72a214bdb
parentf6011081f5e290756bd90fe96f1e86d3eac76f77
fuse: writepages: crop secondary requests

If writeback happens while fuse is in FUSE_NOWRITE condition, the request
will be queued but not processed immediately (see fuse_flush_writepages()).
Until FUSE_NOWRITE becomes relaxed, more writebacks can happen.  They will
be queued as "secondary" requests to that first ("primary") request.

Existing implementation crops only primary request.  This is not correct
because a subsequent extending write(2) may increase i_size and then
secondary requests won't be cropped properly.  The result would be stale
data written to the server to a file offset where zeros must be.

Similar problem may happen if secondary requests are attached to an
in-flight request that was already cropped.

The patch solves the issue by cropping all secondary requests in
fuse_writepage_end().  Thanks to Miklos for idea.

Signed-off-by: Maxim Patlasov <MPatlasov@parallels.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
fs/fuse/file.c