diff options
author | Sunil Mushran <sunil.mushran@oracle.com> | 2008-07-16 17:22:22 -0700 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2008-07-31 16:21:14 -0700 |
commit | 961cecbee6786f4b1f1b8f695e87045b583f9f49 (patch) | |
tree | 350d8604d04c594463372e3fab0cab2e953c7770 /fs/ocfs2 | |
parent | 539d8264093560b917ee3afe4c7f74e5da09d6a5 (diff) | |
download | kernel_samsung_smdk4412-961cecbee6786f4b1f1b8f695e87045b583f9f49.zip kernel_samsung_smdk4412-961cecbee6786f4b1f1b8f695e87045b583f9f49.tar.gz kernel_samsung_smdk4412-961cecbee6786f4b1f1b8f695e87045b583f9f49.tar.bz2 |
[PATCH] ocfs2: Fix oops when racing files truncates with writes into an mmap region
This patch fixes an oops that is reproduced when one races writes to a mmap-ed
region with another process truncating the file.
Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/aops.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c index 1db0801..506c24f 100644 --- a/fs/ocfs2/aops.c +++ b/fs/ocfs2/aops.c @@ -1073,12 +1073,15 @@ static void ocfs2_write_failure(struct inode *inode, for(i = 0; i < wc->w_num_pages; i++) { tmppage = wc->w_pages[i]; - if (ocfs2_should_order_data(inode)) - walk_page_buffers(wc->w_handle, page_buffers(tmppage), - from, to, NULL, - ocfs2_journal_dirty_data); - - block_commit_write(tmppage, from, to); + if (page_has_buffers(tmppage)) { + if (ocfs2_should_order_data(inode)) + walk_page_buffers(wc->w_handle, + page_buffers(tmppage), + from, to, NULL, + ocfs2_journal_dirty_data); + + block_commit_write(tmppage, from, to); + } } } @@ -1901,12 +1904,14 @@ int ocfs2_write_end_nolock(struct address_space *mapping, to = PAGE_CACHE_SIZE; } - if (ocfs2_should_order_data(inode)) - walk_page_buffers(wc->w_handle, page_buffers(tmppage), - from, to, NULL, - ocfs2_journal_dirty_data); - - block_commit_write(tmppage, from, to); + if (page_has_buffers(tmppage)) { + if (ocfs2_should_order_data(inode)) + walk_page_buffers(wc->w_handle, + page_buffers(tmppage), + from, to, NULL, + ocfs2_journal_dirty_data); + block_commit_write(tmppage, from, to); + } } out_write_size: |