From patchwork Fri Jun 10 12:57:11 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arne Jansen X-Patchwork-Id: 869242 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p5ACvQCG018044 for ; Fri, 10 Jun 2011 12:57:27 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757183Ab1FJM5V (ORCPT ); Fri, 10 Jun 2011 08:57:21 -0400 Received: from mort.rzone.de ([81.169.144.234]:26611 "EHLO mort.rzone.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756156Ab1FJM5U (ORCPT ); Fri, 10 Jun 2011 08:57:20 -0400 Received: from gargravarr.store (gargravarr.store [192.168.42.236]) by mort.rzone.de (Postfix) with ESMTP id 23CEDC92; Fri, 10 Jun 2011 14:57:19 +0200 (MEST) Received: by gargravarr.store (Postfix, from userid 32466) id F21A3C01F; Fri, 10 Jun 2011 14:57:16 +0200 (CEST) From: Arne Jansen To: chris.mason@oracle.com, linux-btrfs@vger.kernel.org Subject: [PATCH v2 1/6] btrfs: add an extra wait mode to read_extent_buffer_pages Date: Fri, 10 Jun 2011 14:57:11 +0200 Message-Id: <2c7792461e8fea061b340bd149db2856eb345c27.1307710254.git.sensille@gmx.net> X-Mailer: git-send-email 1.7.3.4 In-Reply-To: References: In-Reply-To: References: 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.6 (demeter2.kernel.org [140.211.167.43]); Fri, 10 Jun 2011 12:57:27 +0000 (UTC) read_extent_buffer_pages currently has two modes, either trigger a read without waiting for anything, or wait for the I/O to finish. The former also bails when it's unable to lock the page. This patch now adds an additional parameter to allow it to block on page lock, but don't wait for completion. Signed-off-by: Arne Jansen --- fs/btrfs/disk-io.c | 4 ++-- fs/btrfs/extent_io.c | 6 +++--- fs/btrfs/extent_io.h | 3 ++- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 7bbbfeb..0339cc0 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -325,7 +325,7 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root, clear_bit(EXTENT_BUFFER_CORRUPT, &eb->bflags); io_tree = &BTRFS_I(root->fs_info->btree_inode)->io_tree; while (1) { - ret = read_extent_buffer_pages(io_tree, eb, start, 1, + ret = read_extent_buffer_pages(io_tree, eb, start, 1, 1, btree_get_extent, mirror_num); if (!ret && !verify_parent_transid(io_tree, eb, parent_transid)) @@ -940,7 +940,7 @@ int readahead_tree_block(struct btrfs_root *root, u64 bytenr, u32 blocksize, if (!buf) return 0; read_extent_buffer_pages(&BTRFS_I(btree_inode)->io_tree, - buf, 0, 0, btree_get_extent, 0); + buf, 0, 0, 0, btree_get_extent, 0); free_extent_buffer(buf); return ret; } diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index b181a94..b7f0b9b 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3358,7 +3358,7 @@ int extent_buffer_uptodate(struct extent_io_tree *tree, int read_extent_buffer_pages(struct extent_io_tree *tree, struct extent_buffer *eb, - u64 start, int wait, + u64 start, int wait_lock, int wait_complete, get_extent_t *get_extent, int mirror_num) { unsigned long i; @@ -3392,7 +3392,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, num_pages = num_extent_pages(eb->start, eb->len); for (i = start_i; i < num_pages; i++) { page = extent_buffer_page(eb, i); - if (!wait) { + if (!wait_lock) { if (!trylock_page(page)) goto unlock_exit; } else { @@ -3436,7 +3436,7 @@ int read_extent_buffer_pages(struct extent_io_tree *tree, if (bio) submit_one_bio(READ, bio, mirror_num, bio_flags); - if (ret || !wait) + if (ret || !wait_complete) return ret; for (i = start_i; i < num_pages; i++) { diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h index 4e8445a..118c30b 100644 --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -241,7 +241,8 @@ struct extent_buffer *find_extent_buffer(struct extent_io_tree *tree, u64 start, unsigned long len); void free_extent_buffer(struct extent_buffer *eb); int read_extent_buffer_pages(struct extent_io_tree *tree, - struct extent_buffer *eb, u64 start, int wait, + struct extent_buffer *eb, u64 start, + int wait_lock, int wait_complete, get_extent_t *get_extent, int mirror_num); static inline void extent_buffer_get(struct extent_buffer *eb)