From patchwork Thu Dec 17 21:42:41 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: jim owens X-Patchwork-Id: 68555 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.2) with ESMTP id nBI4ixwJ005715 for ; Fri, 18 Dec 2009 04:47:57 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1765411AbZLQVmw (ORCPT ); Thu, 17 Dec 2009 16:42:52 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1765407AbZLQVmw (ORCPT ); Thu, 17 Dec 2009 16:42:52 -0500 Received: from g1t0029.austin.hp.com ([15.216.28.36]:23838 "EHLO g1t0029.austin.hp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759996AbZLQVmv (ORCPT ); Thu, 17 Dec 2009 16:42:51 -0500 Received: from g1t0038.austin.hp.com (g1t0038.austin.hp.com [16.236.32.44]) by g1t0029.austin.hp.com (Postfix) with ESMTP id D94E63817B; Thu, 17 Dec 2009 21:42:42 +0000 (UTC) Received: from ldl (linux.corp.hp.com [15.11.146.101]) by g1t0038.austin.hp.com (Postfix) with ESMTP id BFA2B300EF; Thu, 17 Dec 2009 21:42:42 +0000 (UTC) Received: from localhost (ldl.fc.hp.com [127.0.0.1]) by ldl (Postfix) with ESMTP id 9965ECF002A; Thu, 17 Dec 2009 14:42:42 -0700 (MST) Received: from ldl ([127.0.0.1]) by localhost (ldl.fc.hp.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id itGBgRib-Je8; Thu, 17 Dec 2009 14:42:42 -0700 (MST) Received: from [192.168.0.99] (squirrel.fc.hp.com [15.11.146.57]) (Authenticated sender: owens@fc.hp.com) by ldl (Postfix) with ESMTPA id 0A825CF0007; Thu, 17 Dec 2009 14:42:41 -0700 (MST) Message-ID: <4B2AA5D1.7090607@hp.com> Date: Thu, 17 Dec 2009 16:42:41 -0500 From: jim owens User-Agent: Thunderbird 2.0.0.23 (X11/20090817) MIME-Version: 1.0 To: linux-btrfs CC: Chris Mason Subject: [PATCH] __btrfs_map_block should not set length more than input length. Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 8d1fd6d..86bc625 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1591,9 +1591,6 @@ static int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, struct btrfs_bio_stripe *stripe = multi->stripes; int i; - if (map_length > num_bytes) - map_length = num_bytes; - for (i = 0; i < multi->num_stripes; i++, stripe++) { btrfs_issue_discard(stripe->dev->bdev, stripe->physical, diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index ee92801..87bb76f 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -1386,20 +1386,19 @@ int btrfs_merge_bio_hook(struct page *page, unsigned long offset, struct btrfs_root *root = BTRFS_I(page->mapping->host)->root; struct btrfs_mapping_tree *map_tree; u64 logical = (u64)bio->bi_sector << 9; - u64 length = 0; + u64 length = bio->bi_size + size; u64 map_length; int ret; if (bio_flags & EXTENT_BIO_COMPRESSED) return 0; - length = bio->bi_size; map_tree = &root->fs_info->mapping_tree; map_length = length; ret = btrfs_map_block(map_tree, READ, logical, &map_length, NULL, 0); - if (map_length < length + size) + if (ret || map_length < length) return 1; return 0; } diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 4a0c8e5..e555408 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -2697,14 +2697,15 @@ again: /* stripe_offset is the offset of this block in its stripe*/ stripe_offset = offset - stripe_offset; + /* return smaller of input length or remaining contiguous length */ if (map->type & (BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID10)) { - /* we limit the length of each bio to what fits in a stripe */ - *length = min_t(u64, em->len - offset, - map->stripe_len - stripe_offset); + /* only the length that fits in one stripe is contiguous */ + *length = min(*length, min_t(u64, em->len - offset, + map->stripe_len - stripe_offset)); } else { /* RAID1, DUP, and simple disk stripes are all contiguous */ - *length = em->len - offset; + *length = min(*length, em->len - offset); } if (!multi_ret && !unplug_page)