diff options
author | Tao Ma <tao.ma@oracle.com> | 2009-09-10 15:28:47 +0800 |
---|---|---|
committer | Joel Becker <joel.becker@oracle.com> | 2009-09-23 01:54:49 -0700 |
commit | b80474b432913f73cce8db001e9fa3104f9b79ee (patch) | |
tree | ad39c36ce3006167d02ca176eb140012c6530a06 /fs | |
parent | 83e32d9044a4510fffdf65c2691a25c0ba84e259 (diff) | |
download | op-kernel-dev-b80474b432913f73cce8db001e9fa3104f9b79ee.zip op-kernel-dev-b80474b432913f73cce8db001e9fa3104f9b79ee.tar.gz |
ocfs2: Use buffer IO if we are appending a file.
In ocfs2_file_aio_write, we will prevent direct io if
we find that we are appending(changing i_size) and call
generic_file_aio_write_nolock. But actually O_DIRECT flag
is there and this function will call generic_file_direct_write
eventually which will update i_size and leave di->i_size
alone. The bug is
http://oss.oracle.com/bugzilla/show_bug.cgi?id=1173.
So this patch let ocfs2_direct_IO returns 0 directly if we
are appending so that buffered write will be called and
di->i_size get updated successfully. And this is also
what we want in ocfs2_file_aio_write.
Signed-off-by: Tao Ma <tao.ma@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/ocfs2/aops.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 33e03c5..72e7606 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -690,6 +690,10 @@ static ssize_t ocfs2_direct_IO(int rw, if (OCFS2_I(inode)->ip_dyn_features & OCFS2_INLINE_DATA_FL) return 0; + /* Fallback to buffered I/O if we are appending. */ + if (i_size_read(inode) <= offset) + return 0; + ret = blockdev_direct_IO_no_locking(rw, iocb, inode, inode->i_sb->s_bdev, iov, offset, nr_segs, |