Ocfs2: Correctly treat O_DIRECT write in holes or outside 'i_size'.
PATCH 1/1 Ocfs2: Correctly treat O_DIRECT write in holes or outside 'i_size'.
Currently, O_DIRECT writes in a hole or outside the 'i_size' was not actually honored, while using a buffered io instead.
It hurts/cheats the 'O_DIRECT' semantics somehow, users may be confusing about the data lost after a crash when performing the odirect append writes.
A straightforward way is to flush the pagecache like O_SYNC did to guarantee the real touch to disk before writes get returned.
--- fs/ocfs2/file.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
fs/ocfs2/file.c +1 -1
@@ -2321,7 +2321,7 @@ out_dio:BUG_ON (ret == -EIOCBQUEUED && !(file->f_flags &O_DIRECT ));if (((file->f_flags &O_DSYNC ) && !direct_io) ||IS_SYNC (inode) || - ((file->f_flags &O_DIRECT ) && has_refcount)) { + ((file->f_flags &O_DIRECT ) && !direct_io)) { ret =filemap_fdatawrite_range (file->f_mapping, pos, pos + count -1 );if (ret <0 )
Signature · 1 line
1.5.5
PATCH 1/1 Ocfs2: Correctly treat O_DIRECT write in holes or outside 'i_size'.
Quoted 8 lines · Tristan Ye
Currently,
O_DIRECTwrites in a hole or outside the 'i_size' was not actually honored, while using a buffered io instead.It hurts/cheats the '
O_DIRECT' semantics somehow, users may be confusing about the data lost after a crash when performing the odirect append writes.A straightforward way is to flush the pagecache like
O_SYNCdid to guarantee the real touch to disk before writes get returned.
well, actually it is a regression bug.
So tristan, could you please describe the commit that trigger it and the real problem that I describe in the bugzilla. Also please mention the bug no.
From this commit log, it seems that we are bad from the very beginning
which isn't true. ;)
Regards,
Tao
Quoted 19 lines
Signed-off-by Tristan Ye<[email protected]>--- fs/ocfs2/file.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)fs/ocfs2/file.c +1
-1@@ -2321,7 +2321,7 @@ out_dio:BUG_ON (ret == -EIOCBQUEUED && !(file->f_flags&O_DIRECT ));if (((file->f_flags&O_DSYNC )&& !direct_io) ||IS_SYNC (inode) || - ((file->f_flags&O_DIRECT )&& has_refcount)) { + ((file->f_flags&O_DIRECT )&& !direct_io)) { ret =filemap_fdatawrite_range (file->f_mapping, pos, pos + count -1 );if (ret<0 )