fuse: Fix O_DIRECT operations vs cached writeback misorder
authorPavel Emelyanov <xemul@openvz.org>
Thu, 10 Oct 2013 13:12:05 +0000 (17:12 +0400)
committerMiklos Szeredi <mszeredi@suse.cz>
Wed, 2 Apr 2014 13:38:50 +0000 (15:38 +0200)
commitea8cd33390fafc1eca06a26e6a9c7bf1d386526f
treeeb0b3ecdf4760b3b96bc2d0d179e4c59c33d7ade
parentfe38d7df230b022e72014ef7aa799a4f2acfecf3
fuse: Fix O_DIRECT operations vs cached writeback misorder

The problem is:

1. write cached data to a file
2. read directly from the same file (via another fd)

The 2nd operation may read stale data, i.e. the one that was in a file
before the 1st op. Problem is in how fuse manages writeback.

When direct op occurs the core kernel code calls filemap_write_and_wait
to flush all the cached ops in flight. But fuse acks the writeback right
after the ->writepages callback exits w/o waiting for the real write to
happen. Thus the subsequent direct op proceeds while the real writeback
is still in flight. This is a problem for backends that reorder operation.

Fix this by making the fuse direct IO callback explicitly wait on the
in-flight writeback to finish.

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