linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff Mahoney <jeffm@suse.com>
To: BtrFS List <linux-btrfs@vger.kernel.org>
Cc: Chris Mason <chris.mason@oracle.com>
Subject: [patch 02/65] btrfs: Catch locking failures in {set,clear}_extent_bit
Date: Mon, 03 Oct 2011 23:22:32 -0400	[thread overview]
Message-ID: <20111004032300.147032341@suse.com> (raw)
In-Reply-To: 20111004032230.458853274@suse.com

 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 <jeffm@suse.com>
---
 fs/btrfs/extent_io.c |   41 ++++++++++++++++++++++++++++++-----------
 1 file changed, 30 insertions(+), 11 deletions(-)

--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -51,6 +51,12 @@ struct extent_page_data {
 	unsigned int sync_io:1;
 };
 
+static inline struct btrfs_fs_info *
+tree_fs_info(struct extent_io_tree *tree)
+{
+	return btrfs_sb(tree->mapping->host->i_sb)->fs_info;
+}
+
 int __init extent_io_init(void)
 {
 	extent_state_cache = kmem_cache_create("extent_state",
@@ -437,6 +443,13 @@ alloc_extent_state_atomic(struct extent_
 	return prealloc;
 }
 
+NORET_TYPE void extent_io_tree_panic(struct extent_io_tree *tree, int err)
+{
+	btrfs_panic(tree_fs_info(tree), err, "Locking error: "
+		    "Extent tree was modified by another "
+		    "thread while locked.");
+}
+
 /*
  * clear some bits on a range in the tree.  This may require splitting
  * or inserting elements in the tree, so the gfp mask is used to
@@ -531,7 +544,9 @@ hit_next:
 		prealloc = alloc_extent_state_atomic(prealloc);
 		BUG_ON(!prealloc);
 		err = split_state(tree, state, prealloc, start);
-		BUG_ON(err == -EEXIST);
+		if (err)
+			extent_io_tree_panic(tree, err);
+
 		prealloc = NULL;
 		if (err)
 			goto out;
@@ -553,7 +568,9 @@ 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)
+			extent_io_tree_panic(tree, err);
+
 		if (wake)
 			wake_up(&state->wq);
 
@@ -736,8 +753,10 @@ again:
 		prealloc = alloc_extent_state_atomic(prealloc);
 		BUG_ON(!prealloc);
 		err = insert_state(tree, prealloc, start, end, &bits);
+		if (err)
+			extent_io_tree_panic(tree, err);
+
 		prealloc = NULL;
-		BUG_ON(err == -EEXIST);
 		goto out;
 	}
 	state = rb_entry(node, struct extent_state, rb_node);
@@ -803,7 +822,9 @@ hit_next:
 		prealloc = alloc_extent_state_atomic(prealloc);
 		BUG_ON(!prealloc);
 		err = split_state(tree, state, prealloc, start);
-		BUG_ON(err == -EEXIST);
+		if (err)
+			extent_io_tree_panic(tree, err);
+
 		prealloc = NULL;
 		if (err)
 			goto out;
@@ -840,12 +861,9 @@ 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)
+			extent_io_tree_panic(tree, err);
+
 		cache_state(prealloc, cached_state);
 		prealloc = NULL;
 		start = this_end + 1;
@@ -867,7 +885,8 @@ 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)
+			extent_io_tree_panic(tree, err);
 
 		set_state_bits(tree, prealloc, &bits);
 		cache_state(prealloc, cached_state);




  parent reply	other threads:[~2011-10-04  3:22 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-04  3:22 [patch 00/65] Error handling patchset v3 Jeff Mahoney
2011-10-04  3:22 ` [patch 01/65] btrfs: Add btrfs_panic() Jeff Mahoney
2011-10-10 16:35   ` David Sterba
2011-10-10 16:42   ` David Sterba
2011-10-10 16:54     ` Jeff Mahoney
2011-10-04  3:22 ` Jeff Mahoney [this message]
2011-10-04  3:22 ` [patch 03/65] btrfs: Panic on bad rbtree operations Jeff Mahoney
2011-10-04  3:22 ` [patch 04/65] btrfs: Simplify btrfs_insert_root Jeff Mahoney
2011-10-04  3:22 ` [patch 05/65] btrfs: set_extent_bit error push-up Jeff Mahoney
2011-10-04  3:22 ` [patch 06/65] btrfs: lock_extent " Jeff Mahoney
2011-10-04  3:22 ` [patch 07/65] btrfs: clear_extent_bit " Jeff Mahoney
2011-10-04  3:22 ` [patch 08/65] btrfs: unlock_extent " Jeff Mahoney
2011-10-04  3:22 ` [patch 09/65] btrfs: pin_down_extent should return void Jeff Mahoney
2011-10-04  3:22 ` [patch 10/65] btrfs: btrfs_pin_extent error push-up Jeff Mahoney
2011-10-04  3:22 ` [patch 11/65] btrfs: btrfs_drop_snapshot should return int Jeff Mahoney
2011-10-04  3:22 ` [patch 12/65] btrfs: btrfs_start_transaction non-looped error push-up Jeff Mahoney
2011-10-04  3:22 ` [patch 13/65] btrfs: find_and_setup_root " Jeff Mahoney
2011-10-04  3:22 ` [patch 14/65] btrfs: btrfs_update_root " Jeff Mahoney
2011-10-04  3:22 ` [patch 15/65] btrfs: set_range_writeback should return void Jeff Mahoney
2011-10-04  3:22 ` [patch 16/65] btrfs: wait_on_state " Jeff Mahoney
2011-10-04  3:22 ` [patch 17/65] btrfs: wait_extent_bit " Jeff Mahoney
2011-10-04  3:22 ` [patch 18/65] btrfs: __unlock_for_delalloc " Jeff Mahoney
2011-10-04  3:22 ` [patch 19/65] btrfs: check_page_uptodate " Jeff Mahoney
2011-10-04  3:22 ` [patch 20/65] btrfs: check_page_locked " Jeff Mahoney
2011-10-04  3:22 ` [patch 21/65] btrfs: check_page_writeback " Jeff Mahoney
2011-10-04  3:22 ` [patch 22/65] btrfs: clear_extent_buffer_dirty " Jeff Mahoney
2011-10-04  3:22 ` [patch 23/65] btrfs: btrfs_cleanup_fs_uuids " Jeff Mahoney
2011-10-04  3:22 ` [patch 24/65] btrfs: run_scheduled_bios " Jeff Mahoney
2011-10-04  3:22 ` [patch 25/65] btrfs: btrfs_close_extra_devices " Jeff Mahoney
2011-10-04  3:22 ` [patch 26/65] btrfs: schedule_bio " Jeff Mahoney
2011-10-04  3:22 ` [patch 27/65] btrfs: fill_device_from_item " Jeff Mahoney
2011-10-04  3:22 ` [patch 28/65] btrfs: btrfs_queue_worker " Jeff Mahoney
2011-10-04  3:22 ` [patch 29/65] btrfs: run_ordered_completions " Jeff Mahoney
2011-10-04  3:23 ` [patch 30/65] btrfs: btrfs_stop_workers " Jeff Mahoney
2011-10-04  3:23 ` [patch 31/65] btrfs: btrfs_requeue_work " Jeff Mahoney
2011-10-04  3:23 ` [patch 32/65] btrfs: tree-log: btrfs_end_log_trans " Jeff Mahoney
2011-10-04  3:23 ` [patch 33/65] btrfs: tree-log: wait_for_writer " Jeff Mahoney
2011-10-04  3:23 ` [patch 34/65] btrfs: btrfs_init_compress " Jeff Mahoney
2011-10-04  3:23 ` [patch 35/65] btrfs: btrfs_invalidate_inodes " Jeff Mahoney
2011-10-04  3:23 ` [patch 36/65] btrfs: __setup_root " Jeff Mahoney
2011-10-04  3:23 ` [patch 37/65] btrfs: btrfs_destroy_delalloc_inodes " Jeff Mahoney
2011-10-04  3:23 ` [patch 38/65] btrfs: btrfs_prepare_extent_commit " Jeff Mahoney
2011-10-04  3:23 ` [patch 39/65] btrfs: btrfs_set_block_group_rw " Jeff Mahoney
2011-10-04  3:23 ` [patch 40/65] btrfs: setup_inline_extent_backref " Jeff Mahoney
2011-10-04  3:23 ` [patch 41/65] btrfs: btrfs_run_defrag_inodes " Jeff Mahoney
2011-10-04  3:23 ` [patch 42/65] btrfs: Simplify btrfs_submit_bio_hook Jeff Mahoney
2011-10-04  3:23 ` [patch 43/65] btrfs: Factor out tree->ops->merge_bio_hook call Jeff Mahoney
2011-10-04  3:23 ` [patch 44/65] btrfs: ->submit_bio_hook error push-up Jeff Mahoney
2011-10-04  3:23 ` [patch 45/65] btrfs: __add_reloc_root " Jeff Mahoney
2011-10-04  3:23 ` [patch 46/65] btrfs: fixup_low_keys should return void Jeff Mahoney
2011-10-04  3:23 ` [patch 47/65] btrfs: setup_items_for_insert " Jeff Mahoney
2011-10-04  3:23 ` [patch 48/65] btrfs: del_ptr " Jeff Mahoney
2011-10-04  3:23 ` [patch 49/65] btrfs: insert_ptr " Jeff Mahoney
2011-10-04  3:23 ` [patch 50/65] btrfs: add_delayed_ref_head " Jeff Mahoney
2011-10-04  3:23 ` [patch 51/65] btrfs: add_delayed_tree_ref " Jeff Mahoney
2011-10-04  3:23 ` [patch 52/65] btrfs: add_delayed_data_ref " Jeff Mahoney
2011-10-04  3:23 ` [patch 53/65] btrfs: Fix kfree of member instead of structure Jeff Mahoney
2011-10-04  3:23 ` [patch 54/65] btrfs: Use mempools for delayed refs Jeff Mahoney
2011-10-04  3:23 ` [patch 55/65] btrfs: Delayed ref mempool functions should return void Jeff Mahoney
2011-10-04  3:23 ` [patch 56/65] btrfs: btrfs_inc_extent_ref void return prep Jeff Mahoney
2011-10-04  3:23 ` [patch 57/65] btrfs: btrfs_free_extent " Jeff Mahoney
2011-10-04  3:23 ` [patch 58/65] btrfs: __btrfs_mod_refs process_func should return void Jeff Mahoney
2011-10-04  3:23 ` [patch 59/65] btrfs: __btrfs_mod_ref " Jeff Mahoney
2011-10-04  3:23 ` [patch 60/65] btrfs: clean_tree_block " Jeff Mahoney
2011-10-04  3:23 ` [patch 61/65] btrfs: btrfs_truncate_item " Jeff Mahoney
2011-10-04  3:23 ` [patch 62/65] btrfs: btrfs_extend_item " Jeff Mahoney
2011-10-04  3:23 ` [patch 63/65] btrfs: end_compressed_writeback " Jeff Mahoney
2011-10-04  3:23 ` [patch 64/65] btrfs: copy_for_split " Jeff Mahoney
2011-10-04  3:23 ` [patch 65/65] btrfs: update_inline_extent_backref " Jeff Mahoney

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111004032300.147032341@suse.com \
    --to=jeffm@suse.com \
    --cc=chris.mason@oracle.com \
    --cc=linux-btrfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).