From patchwork Mon Jul 18 15:59:32 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 105310 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 23BB1B6F77 for ; Tue, 19 Jul 2011 01:59:39 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751666Ab1GRP7f (ORCPT ); Mon, 18 Jul 2011 11:59:35 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38714 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751115Ab1GRP7e (ORCPT ); Mon, 18 Jul 2011 11:59:34 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p6IFxXFM019770 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 18 Jul 2011 11:59:33 -0400 Received: from localhost.localdomain.com (vpn-9-43.rdu.redhat.com [10.11.9.43]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id p6IFxWNH018106; Mon, 18 Jul 2011 11:59:33 -0400 From: Josef Bacik To: linux-ext4@vger.kernel.org, tytso@mit.edu Subject: [PATCH] ext4: hold page lock when checking mapping in ext4_page_mkwrite Date: Mon, 18 Jul 2011 11:59:32 -0400 Message-Id: <1311004772-14675-1-git-send-email-josef@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org 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 --- fs/ext4/inode.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) 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);