Basically it is user's responsibility to take care of race condition related to direct I/O, but some events which are out of user's control (such as memory failure) can happen at any time. So we need to lock and set/clear PG_writeback flags in dierct I/O code to protect from data loss. Signed-off-by: Naoya Horiguchi <n-horiguchi@xxxxxxxxxxxxx> --- fs/direct-io.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/fs/direct-io.c b/fs/direct-io.c index 7600aac..0d0810d 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -439,7 +439,10 @@ static int dio_bio_complete(struct dio *dio, struct bio *bio) struct page *page = bvec[page_no].bv_page; if (dio->rw == READ && !PageCompound(page)) - set_page_dirty_lock(page); + set_page_dirty(page); + if (dio->rw & WRITE) + end_page_writeback(page); + unlock_page(page); page_cache_release(page); } bio_put(bio); @@ -702,11 +705,14 @@ submit_page_section(struct dio *dio, struct page *page, { int ret = 0; + lock_page(page); + if (dio->rw & WRITE) { /* * Read accounting is performed in submit_bio() */ task_io_account_write(len); + set_page_writeback(page); } /* -- 1.7.2.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>