ocfs2: avoid direct write if we fall back to buffered v2
PATCH 1/1 ocfs2: avoid direct write if we fall back to buffered v2
when we fall back to buffered write from direct write, we call __generic_file_aio_write but that will end up doing direct write even we are only prepared to do buffered write because the file has O_DIRECT flag set. This is a fix for
https://bugzilla.novell.com/show_bug.cgi?id=591039
revised with Joel's comments.
--- fs/ocfs2/file.c | 23 ++++++++++++----------- 1 files changed, 12 insertions(+), 11 deletions(-)
fs/ocfs2/file.c +12 -11
@@ -1973,18 +1973,18 @@ relock:/* communicate with ocfs2_dio_end_io */ ocfs2_iocb_set_rw_locked (iocb, rw_level); -if (direct_io) { - ret =generic_segment_checks (iov, &nr_segs, &ocount, -VERIFY_READ ); -if (ret) - goto out_dio; + ret =generic_segment_checks (iov, &nr_segs, &ocount, +VERIFY_READ ); +if (ret) + goto out_dio; - count = ocount; - ret =generic_write_checks (file, ppos, &count, -S_ISBLK (inode->i_mode)); -if (ret) - goto out_dio; + count = ocount; + ret =generic_write_checks (file, ppos, &count, +S_ISBLK (inode->i_mode)); +if (ret) + goto out_dio; +if (direct_io) { written =generic_file_direct_write (iocb, iov, &nr_segs, *ppos, ppos, count, ocount);if (written <0 ) {
@@ -1999,7 +1999,8 @@ relock: goto out_dio; } }else { - written =__generic_file_aio_write (iocb, iov, nr_segs, ppos); + written =generic_file_buffered_write (iocb, iov, nr_segs, *ppos, + ppos, count,0 ); } out_dio:
Signature · 1 line
1.6.4.2
PATCH 1/1 ocfs2: avoid direct write if we fall back to buffered v2
Quoted 10 lines · Li Dongyang
fs/ocfs2/file.c +4
-5-if (direct_io) { - ret =generic_segment_checks (iov, &nr_segs, &ocount, -VERIFY_READ ); -if (ret) - goto out_dio; + ret =generic_segment_checks (iov, &nr_segs, &ocount, +VERIFY_READ ); +if (ret) + goto out_dio;
fs/ocfs2/file.c relock: · line 1985
Quoted 10 lines
fs/ocfs2/file.c +5
-5- count = ocount; - ret =generic_write_checks (file, ppos, &count, -S_ISBLK (inode->i_mode)); -if (ret) - goto out_dio; + count = ocount; + ret =generic_write_checks (file, ppos, &count, +S_ISBLK (inode->i_mode)); +if (ret) + goto out_dio;
Make sure you add the management of current->backing_dev_info
just like __generic_file_aio_write() does. We want to ensure that page writeback works OK.
Joel
Signature · 9 lines
"If the human brain were so simple we could understand it, we would be so simple that we could not." - W. A. Clouston Joel Becker Principal Software Developer Oracle E-mail: joel.becker at oracle.com Phone: (650) 506-8127