Message ID | 1311004772-14675-1-git-send-email-josef@redhat.com |
---|---|
State | New, archived |
Headers | show |
On Mon, Jul 18, 2011 at 11:59:32AM -0400, Josef Bacik wrote: > Pages can be evicted from cache outside of truncate, for example when > invalidating pages after writing with O_DIRECT. The only proper way to check > page->mapping is under the page lock, so fix ext4_page_mkwrite to do this. > Thanks, Josef, please check the ext4_page_mkwrite implementation in the vfs tree, which is just a wrapper around the generic code and thus shouldn't have this problem any more. -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index e3126c0..1ad7d10 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5855,14 +5855,15 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) */ down_read(&inode->i_alloc_sem); size = i_size_read(inode); + lock_page(page); if (page->mapping != mapping || size <= page_offset(page) || !PageUptodate(page)) { + unlock_page(page); /* page got truncated from under us? */ goto out_unlock; } ret = 0; - lock_page(page); wait_on_page_writeback(page); if (PageMappedToDisk(page)) { up_read(&inode->i_alloc_sem);
Pages can be evicted from cache outside of truncate, for example when invalidating pages after writing with O_DIRECT. The only proper way to check page->mapping is under the page lock, so fix ext4_page_mkwrite to do this. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com> --- fs/ext4/inode.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)