alibaba/ali_kernel — pull request #48 by gnehzuil (2014-01-29 03:51:54+00:00)
Title: Fix race when checking i_size on direct i/o read

Following on from the "Re: [PATCH v3] vfs: fix a bug when we do some dio
reads with append dio writes" thread on linux-fsdevel, this patch is my
current version of the fix proposed as option (b) in that thread.

Removing the i_size test from the direct i/o read path at vfs level
means that filesystems now have to deal with requests which are beyond
i_size themselves. These I've divided into three sets:

a) Those with "no op" ->direct_IO (9p, cifs, ceph)
These are obviously not going to be an issue

b) Those with "home brew" ->direct_IO (nfs, fuse)
I've been told that NFS should not have any problem with the larger
i_size, however I've added an extra test to FUSE to duplicate the
original behaviour just to be on the safe side.

c) Those using __blockdev_direct_IO()
These call through to ->get_block() which should deal with the EOF
condition correctly. I've verified that with GFS2 and I believe that
Zheng has verified it for ext4. I've also run the test on XFS and it
passes both before and after this change.

The part of the patch in filemap.c looks a lot larger than it really is
- there are only two lines of real change. The rest is just indentation
of the contained code.

There remains a test of i_size though, which was added for btrfs. It
doesn't cause the other filesystems a problem as the test is performed
after ->direct_IO has been called. It is possible that there is a race
that does matter to btrfs, however this patch doesn't change that, so
its still an overall improvement.

[NOTE from Zheng Liu]
I adjust the part of code in fuse_direct_IO because there are some
differences between 2.6.32-358 and upstream kernel (3.13). I believe
it is ok for us.

Reference: 9fe55eea7e4b444bafc42fa0000cc2d1d2847275
Patch-mainline: v3.13-40-g9fe55eea7e4b
Signed-off-by: Steven Whitehouse
Reported-by: Zheng Liu
Cc: Jan Kara
Cc: Dave Chinner
Acked-by: Miklos Szeredi
Cc: Chris Mason
Cc: Josef Bacik
Cc: Christoph Hellwig
Cc: Alexander Viro
Signed-off-by: Zheng Liu