From patchwork Tue Dec 7 07:59:35 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Zhong X-Patchwork-Id: 381942 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oB77xjLA023114 for ; Tue, 7 Dec 2010 07:59:46 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751588Ab0LGH7n (ORCPT ); Tue, 7 Dec 2010 02:59:43 -0500 Received: from mga01.intel.com ([192.55.52.88]:21677 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750985Ab0LGH7m (ORCPT ); Tue, 7 Dec 2010 02:59:42 -0500 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga101.fm.intel.com with ESMTP; 06 Dec 2010 23:59:42 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,310,1288594800"; d="scan'208";a="633854456" Received: from unknown (HELO localhost.localdomain) ([10.238.135.222]) by fmsmga002.fm.intel.com with ESMTP; 06 Dec 2010 23:59:41 -0800 From: Xin Zhong To: linux-btrfs@vger.kernel.org Cc: xin.zhong@intel.com Subject: [PATCH] Btrfs: pwrite blocked when writing from the mmaped buffer of the same page Date: Tue, 7 Dec 2010 15:59:35 +0800 Message-Id: <1291708775-4484-1-git-send-email-xin.zhong@intel.com> X-Mailer: git-send-email 1.6.2.2 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Tue, 07 Dec 2010 07:59:46 +0000 (UTC) diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index dfe15dc..c1faded 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -57,15 +57,11 @@ static noinline int btrfs_copy_from_user(loff_t pos, int num_pages, PAGE_CACHE_SIZE - offset, write_bytes); struct page *page = prepared_pages[pg]; again: - /* - * Copy data from userspace to the current page - * - * Disable pagefault to avoid recursive lock since the pages - * are already locked - */ - pagefault_disable(); - copied = iov_iter_copy_from_user_atomic(page, i, offset, count); - pagefault_enable(); + if (unlikely(iov_iter_fault_in_readable(i, count))) + return -EFAULT; + + /* Copy data from userspace to the current page */ + copied = iov_iter_copy_from_user(page, i, offset, count); /* Flush processor's dcache for this page */ flush_dcache_page(page); @@ -978,15 +974,6 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, if (ret) goto out; - /* - * fault pages before locking them in prepare_pages - * to avoid recursive lock - */ - if (unlikely(iov_iter_fault_in_readable(&i, write_bytes))) { - ret = -EFAULT; - goto out; - } - ret = prepare_pages(root, file, pages, num_pages, pos, first_index, last_index, write_bytes);