The patch titled direct-io: sync and invalidate file region when falling back to buffered write has been added to the -mm tree. Its filename is direct-io-sync-and-invalidate-file-region-when-falling-back-to-buffered-write.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: direct-io: sync and invalidate file region when falling back to buffered write From: Jeff Moyer <jmoyer@xxxxxxxxxx> Cc: Jeff Moyer <jmoyer@xxxxxxxxxx> Cc: Zach Brown <zach.brown@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- mm/filemap.c | 28 +++++++++++++++++++++++++--- 1 files changed, 25 insertions(+), 3 deletions(-) diff -puN mm/filemap.c~direct-io-sync-and-invalidate-file-region-when-falling-back-to-buffered-write mm/filemap.c --- a/mm/filemap.c~direct-io-sync-and-invalidate-file-region-when-falling-back-to-buffered-write +++ a/mm/filemap.c @@ -2222,13 +2222,13 @@ __generic_file_aio_write_nolock(struct k unsigned long nr_segs, loff_t *ppos) { struct file *file = iocb->ki_filp; - const struct address_space * mapping = file->f_mapping; + struct address_space * mapping = file->f_mapping; size_t ocount; /* original count */ size_t count; /* after file limit checks */ struct inode *inode = mapping->host; unsigned long seg; loff_t pos; - ssize_t written; + ssize_t written, written_direct; ssize_t err; ocount = 0; @@ -2258,7 +2258,7 @@ __generic_file_aio_write_nolock(struct k /* We can write back this queue in page reclaim */ current->backing_dev_info = mapping->backing_dev_info; - written = 0; + written = written_direct = 0; err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); if (err) @@ -2285,10 +2285,32 @@ __generic_file_aio_write_nolock(struct k */ pos += written; count -= written; + + written_direct = written; } written = generic_file_buffered_write(iocb, iov, nr_segs, pos, ppos, count, written); + + /* + * When falling through to buffered I/O, we need to ensure that the + * page cache pages are written to disk and invalidated to preserve + * the expected O_DIRECT semantics. + */ + if (unlikely(file->f_flags & O_DIRECT)) { + pgoff_t endbyte = pos + count - 1; + + err = do_sync_file_range(file, pos, endbyte, + SYNC_FILE_RANGE_WAIT_BEFORE| + SYNC_FILE_RANGE_WRITE| + SYNC_FILE_RANGE_WAIT_AFTER); + if (err == 0) + invalidate_mapping_pages(mapping, + pos >> PAGE_CACHE_SHIFT, + endbyte >> PAGE_CACHE_SHIFT); + else + written = written_direct; + } out: current->backing_dev_info = NULL; return written ? written : err; _ Patches currently in -mm which might be from jmoyer@xxxxxxxxxx are direct-io-sync-and-invalidate-file-region-when-falling-back-to-buffered-write.patch direct-io-sync-and-invalidate-file-region-when-falling-back-to-buffered-write-fixes.patch dio-centralize-completion-in-dio_complete.patch dio-call-blk_run_address_space-once-per-op.patch dio-formalize-bio-counters-as-a-dio-reference-count.patch dio-remove-duplicate-bio-wait-code.patch dio-only-call-aio_complete-after-returning-eiocbqueued.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html