Messages in this thread Patch in this message | | | Date | Thu, 12 Aug 2010 16:59:41 +0900 | From | Naoya Horiguchi <> | Subject | [RFC] [PATCH 2/4] dio: add page locking for direct I/O |
| |
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@ah.jp.nec.com> --- 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
| |