From patchwork Mon Aug 15 19:50:44 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Mahoney X-Patchwork-Id: 1068862 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p7FJrCUv005956 for ; Mon, 15 Aug 2011 19:53:13 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752637Ab1HOTxK (ORCPT ); Mon, 15 Aug 2011 15:53:10 -0400 Received: from cantor2.suse.de ([195.135.220.15]:48607 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752430Ab1HOTxI (ORCPT ); Mon, 15 Aug 2011 15:53:08 -0400 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 661978BB22 for ; Mon, 15 Aug 2011 21:53:06 +0200 (CEST) Message-Id: <20110815195232.162552691@suse.com> User-Agent: quilt/0.48-18.3 Date: Mon, 15 Aug 2011 15:50:44 -0400 From: Jeff Mahoney To: Btrfs Development List Subject: [patch v2 2/9] btrfs: Catch locking failures in {set, clear}_extent_bit References: <20110815195042.559654068@suse.com> Content-Disposition: inline; filename=btrfs-catch-locking-failures-in-set-clear-extent_bit 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 (demeter1.kernel.org [140.211.167.41]); Mon, 15 Aug 2011 19:53:13 +0000 (UTC) The *_state functions can only return 0 or -EEXIST. This patch addresses the cases where those functions return -EEXIST, representing a locking failure. It handles them by panicking with an appropriate error message. Signed-off-by: Jeff Mahoney --- fs/btrfs/extent_io.c | 36 +++++++++++++++++++++++++----------- fs/btrfs/extent_io.h | 6 ++++++ 2 files changed, 31 insertions(+), 11 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -531,7 +531,10 @@ hit_next: prealloc = alloc_extent_state_atomic(prealloc); BUG_ON(!prealloc); err = split_state(tree, state, prealloc, start); - BUG_ON(err == -EEXIST); + if (err) + btrfs_panic(tree_fs_info(tree), err, "Locking error: " + "Extent tree was modified by another " + "thread while locked."); prealloc = NULL; if (err) goto out; @@ -553,7 +556,10 @@ hit_next: prealloc = alloc_extent_state_atomic(prealloc); BUG_ON(!prealloc); err = split_state(tree, state, prealloc, end + 1); - BUG_ON(err == -EEXIST); + if (err) + btrfs_panic(tree_fs_info(tree), err, "Locking error: " + "Extent tree was modified by another " + "thread while locked."); if (wake) wake_up(&state->wq); @@ -736,8 +742,11 @@ again: prealloc = alloc_extent_state_atomic(prealloc); BUG_ON(!prealloc); err = insert_state(tree, prealloc, start, end, &bits); + if (err) + btrfs_panic(tree_fs_info(tree), err, "Locking error: " + "Extent tree was modified by another " + "thread while locked."); prealloc = NULL; - BUG_ON(err == -EEXIST); goto out; } state = rb_entry(node, struct extent_state, rb_node); @@ -803,7 +812,10 @@ hit_next: prealloc = alloc_extent_state_atomic(prealloc); BUG_ON(!prealloc); err = split_state(tree, state, prealloc, start); - BUG_ON(err == -EEXIST); + if (err) + btrfs_panic(tree_fs_info(tree), err, "Locking error: " + "Extent tree was modified by another " + "thread while locked."); prealloc = NULL; if (err) goto out; @@ -840,12 +852,11 @@ hit_next: */ err = insert_state(tree, prealloc, start, this_end, &bits); - BUG_ON(err == -EEXIST); - if (err) { - free_extent_state(prealloc); - prealloc = NULL; - goto out; - } + if (err) + btrfs_panic(tree_fs_info(tree), err, "Locking error: " + "Extent tree was modified by another " + "thread while locked."); + cache_state(prealloc, cached_state); prealloc = NULL; start = this_end + 1; @@ -867,7 +878,10 @@ hit_next: prealloc = alloc_extent_state_atomic(prealloc); BUG_ON(!prealloc); err = split_state(tree, state, prealloc, end + 1); - BUG_ON(err == -EEXIST); + if (err) + btrfs_panic(tree_fs_info(tree), err, "Locking error: " + "Extent tree was modified by another " + "thread while locked."); set_state_bits(tree, prealloc, &bits); cache_state(prealloc, cached_state); --- a/fs/btrfs/extent_io.h +++ b/fs/btrfs/extent_io.h @@ -159,6 +159,12 @@ static inline int extent_compress_type(u return bio_flags >> EXTENT_BIO_FLAG_SHIFT; } +static inline struct btrfs_fs_info * +tree_fs_info(struct extent_io_tree *tree) +{ + return btrfs_sb(tree->mapping->host->i_sb)->fs_info; +} + struct extent_map_tree; typedef struct extent_map *(get_extent_t)(struct inode *inode,