public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] btrfs: use RB_ROOT to intialize rb_trees instead of setting rb_node to NULL
@ 2010-02-23 19:43 Eric Paris
  2010-02-23 19:51 ` Pallipadi, Venkatesh
  0 siblings, 1 reply; 3+ messages in thread
From: Eric Paris @ 2010-02-23 19:43 UTC (permalink / raw)
  To: linux-btrfs, chris.mason
  Cc: venkatesh.pallipadi, mingo, hpa, tglx, wstrepp, suresh.b.siddha,
	linux-kernel

btrfs inialize rb trees in quite a number of places by settin rb_node =
NULL;  The problem with this is that 17d9ddc72fb8bba0d4f678 in the
linux-next tree adds a new field to that struct which needs to be NULL for
the new rbtree library code to work properly.  This patch uses RB_ROOT as
the intializer so all of the relevant fields will be NULL'd.  Without the
patch I get a panic like that shown below and after the patch my system
boots.

[    5.314627] general protection fault: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
[    5.315518] last sysfs file: /sys/kernel/uevent_seqnum
[    5.315518] CPU 0
[    5.315518] Modules linked in: [last unloaded: scsi_wait_scan]
[    5.315518]
[    5.315518] Pid: 1314, comm: mount Not tainted 2.6.33-rc8-next-20100223+ #21 /KVM
[    5.315518] RIP: 0010:[<ffffffff81296cc0>]  [<ffffffff81296cc0>] rb_insert_color+0x20/0x120
[    5.315518] RSP: 0018:ffff88003cc21a88  EFLAGS: 00010206
[    5.315518] RAX: 5a5a5a5a5a5a5a5a RBX: ffffea0000d5e5b8 RCX: 0000000000000000
[    5.315518] RDX: ffff88003d710080 RSI: ffff88003d710080 RDI: ffff88003d610058
[    5.315518] RBP: ffff88003cc21ab8 R08: 0000000000000002 R09: 0000000000000000
[    5.315518] R10: 0000000000000000 R11: 0000000000000001 R12: ffff88003d710070
[    5.315518] R13: 0000000000000010 R14: ffff88003d610058 R15: ffff88003d710080
[    5.315518] FS:  00007ffe37b197e0(0000) GS:ffff880004000000(0000) knlGS:0000000000000000
[    5.315518] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[    5.315518] CR2: 00007ffe36d7d010 CR3: 000000003cd94000 CR4: 00000000000006f0
[    5.315518] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[    5.315518] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[    5.315518] Process mount (pid: 1314, threadinfo ffff88003cc20000, task ffff88003d100000)
[    5.315518] Stack:
[    5.315518]  ffff88003cc21ab8 ffffea0000d5e5b8 ffff88003d710070 0000000000000010
[    5.315518] <0> ffff88003d7100e0 0000000000010000 ffff88003cc21b48 ffffffff812058b4
[    5.315518] <0> ffff88003cc2e060 ffff88003cc20000 0000000000000010 000000503cc2dff0
[    5.315518] Call Trace:
[    5.315518]  [<ffffffff812058b4>] alloc_extent_buffer+0x294/0x410
[    5.315518]  [<ffffffff811dfa28>] btrfs_find_create_tree_block+0x28/0x30
[    5.315518]  [<ffffffff81209cd1>] btrfs_read_sys_array+0x31/0x150
[    5.315518]  [<ffffffff811e429a>] open_ctree+0x109a/0x1710
[    5.315518]  [<ffffffff81133bc5>] ? sget+0x365/0x480
[    5.315518]  [<ffffffff812980af>] ? strlcpy+0x4f/0x70
[    5.315518]  [<ffffffff811c4f8c>] btrfs_get_sb+0x41c/0x510
[    5.315518]  [<ffffffff8114a846>] ? alloc_vfsmnt+0xc6/0x1a0
[    5.315518]  [<ffffffff81133249>] vfs_kern_mount+0x89/0x1a0
[    5.315518]  [<ffffffff811333ce>] do_kern_mount+0x4e/0x110
[    5.315518]  [<ffffffff8114cb47>] do_mount+0x547/0x800
[    5.315518]  [<ffffffff810fe660>] ? strndup_user+0x80/0xb0
[    5.315518]  [<ffffffff8114ce8a>] sys_mount+0x8a/0xd0
[    5.315518]  [<ffffffff8100ae02>] system_call_fastpath+0x16/0x1b

Signed-off-by: Eric Paris <eparis@redhat.com>
---

 fs/btrfs/disk-io.c          |    4 ++--
 fs/btrfs/extent_io.c        |    4 ++--
 fs/btrfs/extent_map.c       |    2 +-
 fs/btrfs/free-space-cache.c |    4 ++--
 fs/btrfs/ordered-data.h     |    2 +-
 fs/btrfs/ref-cache.h        |    2 +-
 fs/btrfs/relocation.c       |    4 ++--
 fs/btrfs/transaction.c      |    2 +-
 8 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 2b59201..0427183 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -901,7 +901,7 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
 	root->highest_objectid = 0;
 	root->name = NULL;
 	root->in_sysfs = 0;
-	root->inode_tree.rb_node = NULL;
+	root->inode_tree = RB_ROOT;
 
 	INIT_LIST_HEAD(&root->dirty_list);
 	INIT_LIST_HEAD(&root->orphan_list);
@@ -1673,7 +1673,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
 	insert_inode_hash(fs_info->btree_inode);
 
 	spin_lock_init(&fs_info->block_group_cache_lock);
-	fs_info->block_group_cache_tree.rb_node = NULL;
+	fs_info->block_group_cache_tree = RB_ROOT;
 
 	extent_io_tree_init(&fs_info->freed_extents[0],
 			     fs_info->btree_inode->i_mapping, GFP_NOFS);
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index b177ed3..7073cbb 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -104,8 +104,8 @@ void extent_io_exit(void)
 void extent_io_tree_init(struct extent_io_tree *tree,
 			  struct address_space *mapping, gfp_t mask)
 {
-	tree->state.rb_node = NULL;
-	tree->buffer.rb_node = NULL;
+	tree->state = RB_ROOT;
+	tree->buffer = RB_ROOT;
 	tree->ops = NULL;
 	tree->dirty_bytes = 0;
 	spin_lock_init(&tree->lock);
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
index 428fcac..28d87ba 100644
--- a/fs/btrfs/extent_map.c
+++ b/fs/btrfs/extent_map.c
@@ -35,7 +35,7 @@ void extent_map_exit(void)
  */
 void extent_map_tree_init(struct extent_map_tree *tree, gfp_t mask)
 {
-	tree->map.rb_node = NULL;
+	tree->map = RB_ROOT;
 	rwlock_init(&tree->lock);
 }
 
diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
index cb2849f..dd831ed 100644
--- a/fs/btrfs/free-space-cache.c
+++ b/fs/btrfs/free-space-cache.c
@@ -870,7 +870,7 @@ __btrfs_return_cluster_to_free_space(
 		tree_insert_offset(&block_group->free_space_offset,
 				   entry->offset, &entry->offset_index, 0);
 	}
-	cluster->root.rb_node = NULL;
+	cluster->root = RB_ROOT;
 
 out:
 	spin_unlock(&cluster->lock);
@@ -1355,7 +1355,7 @@ void btrfs_init_free_cluster(struct btrfs_free_cluster *cluster)
 {
 	spin_lock_init(&cluster->lock);
 	spin_lock_init(&cluster->refill_lock);
-	cluster->root.rb_node = NULL;
+	cluster->root = RB_ROOT;
 	cluster->max_size = 0;
 	cluster->points_to_bitmap = false;
 	INIT_LIST_HEAD(&cluster->block_group_list);
diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h
index 1fe1282..9116c6d 100644
--- a/fs/btrfs/ordered-data.h
+++ b/fs/btrfs/ordered-data.h
@@ -129,7 +129,7 @@ static inline void
 btrfs_ordered_inode_tree_init(struct btrfs_ordered_inode_tree *t)
 {
 	mutex_init(&t->mutex);
-	t->tree.rb_node = NULL;
+	t->tree = RB_ROOT;
 	t->last = NULL;
 }
 
diff --git a/fs/btrfs/ref-cache.h b/fs/btrfs/ref-cache.h
index bc283ad..e2a55cb 100644
--- a/fs/btrfs/ref-cache.h
+++ b/fs/btrfs/ref-cache.h
@@ -52,7 +52,7 @@ static inline size_t btrfs_leaf_ref_size(int nr_extents)
 
 static inline void btrfs_leaf_ref_tree_init(struct btrfs_leaf_ref_tree *tree)
 {
-	tree->root.rb_node = NULL;
+	tree->root = RB_ROOT;
 	INIT_LIST_HEAD(&tree->list);
 	spin_lock_init(&tree->lock);
 }
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index ab7ab53..0109e56 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -170,14 +170,14 @@ struct async_merge {
 
 static void mapping_tree_init(struct mapping_tree *tree)
 {
-	tree->rb_root.rb_node = NULL;
+	tree->rb_root = RB_ROOT;
 	spin_lock_init(&tree->lock);
 }
 
 static void backref_cache_init(struct backref_cache *cache)
 {
 	int i;
-	cache->rb_root.rb_node = NULL;
+	cache->rb_root = RB_ROOT;
 	for (i = 0; i < BTRFS_MAX_LEVEL; i++)
 		INIT_LIST_HEAD(&cache->pending[i]);
 	spin_lock_init(&cache->lock);
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
index b2acc79..2a36e23 100644
--- a/fs/btrfs/transaction.c
+++ b/fs/btrfs/transaction.c
@@ -69,7 +69,7 @@ static noinline int join_transaction(struct btrfs_root *root)
 		cur_trans->commit_done = 0;
 		cur_trans->start_time = get_seconds();
 
-		cur_trans->delayed_refs.root.rb_node = NULL;
+		cur_trans->delayed_refs.root = RB_ROOT;
 		cur_trans->delayed_refs.num_entries = 0;
 		cur_trans->delayed_refs.num_heads_ready = 0;
 		cur_trans->delayed_refs.num_heads = 0;


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] btrfs: use RB_ROOT to intialize rb_trees instead of setting rb_node to NULL
  2010-02-23 19:43 [PATCH] btrfs: use RB_ROOT to intialize rb_trees instead of setting rb_node to NULL Eric Paris
@ 2010-02-23 19:51 ` Pallipadi, Venkatesh
  2010-02-23 19:54   ` Eric Paris
  0 siblings, 1 reply; 3+ messages in thread
From: Pallipadi, Venkatesh @ 2010-02-23 19:51 UTC (permalink / raw)
  To: Eric Paris
  Cc: linux-btrfs@vger.kernel.org, chris.mason@oracle.com,
	mingo@elte.hu, hpa@zytor.com, tglx@linutronix.de, wstrepp@gmx.de,
	Siddha, Suresh B, linux-kernel@vger.kernel.org


Acked-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>

Quick grep also shows similar initializations in jffs2, ext4 and ext3.
Let me know if you already have patch for them, otherwise I can send in
the fix for those.

Thanks,
Venki

On Tue, 2010-02-23 at 11:43 -0800, Eric Paris wrote:
> btrfs inialize rb trees in quite a number of places by settin rb_node =
> NULL;  The problem with this is that 17d9ddc72fb8bba0d4f678 in the
> linux-next tree adds a new field to that struct which needs to be NULL for
> the new rbtree library code to work properly.  This patch uses RB_ROOT as
> the intializer so all of the relevant fields will be NULL'd.  Without the
> patch I get a panic like that shown below and after the patch my system
> boots.
> 
> [    5.314627] general protection fault: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
> [    5.315518] last sysfs file: /sys/kernel/uevent_seqnum
> [    5.315518] CPU 0
> [    5.315518] Modules linked in: [last unloaded: scsi_wait_scan]
> [    5.315518]
> [    5.315518] Pid: 1314, comm: mount Not tainted 2.6.33-rc8-next-20100223+ #21 /KVM
> [    5.315518] RIP: 0010:[<ffffffff81296cc0>]  [<ffffffff81296cc0>] rb_insert_color+0x20/0x120
> [    5.315518] RSP: 0018:ffff88003cc21a88  EFLAGS: 00010206
> [    5.315518] RAX: 5a5a5a5a5a5a5a5a RBX: ffffea0000d5e5b8 RCX: 0000000000000000
> [    5.315518] RDX: ffff88003d710080 RSI: ffff88003d710080 RDI: ffff88003d610058
> [    5.315518] RBP: ffff88003cc21ab8 R08: 0000000000000002 R09: 0000000000000000
> [    5.315518] R10: 0000000000000000 R11: 0000000000000001 R12: ffff88003d710070
> [    5.315518] R13: 0000000000000010 R14: ffff88003d610058 R15: ffff88003d710080
> [    5.315518] FS:  00007ffe37b197e0(0000) GS:ffff880004000000(0000) knlGS:0000000000000000
> [    5.315518] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> [    5.315518] CR2: 00007ffe36d7d010 CR3: 000000003cd94000 CR4: 00000000000006f0
> [    5.315518] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [    5.315518] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> [    5.315518] Process mount (pid: 1314, threadinfo ffff88003cc20000, task ffff88003d100000)
> [    5.315518] Stack:
> [    5.315518]  ffff88003cc21ab8 ffffea0000d5e5b8 ffff88003d710070 0000000000000010
> [    5.315518] <0> ffff88003d7100e0 0000000000010000 ffff88003cc21b48 ffffffff812058b4
> [    5.315518] <0> ffff88003cc2e060 ffff88003cc20000 0000000000000010 000000503cc2dff0
> [    5.315518] Call Trace:
> [    5.315518]  [<ffffffff812058b4>] alloc_extent_buffer+0x294/0x410
> [    5.315518]  [<ffffffff811dfa28>] btrfs_find_create_tree_block+0x28/0x30
> [    5.315518]  [<ffffffff81209cd1>] btrfs_read_sys_array+0x31/0x150
> [    5.315518]  [<ffffffff811e429a>] open_ctree+0x109a/0x1710
> [    5.315518]  [<ffffffff81133bc5>] ? sget+0x365/0x480
> [    5.315518]  [<ffffffff812980af>] ? strlcpy+0x4f/0x70
> [    5.315518]  [<ffffffff811c4f8c>] btrfs_get_sb+0x41c/0x510
> [    5.315518]  [<ffffffff8114a846>] ? alloc_vfsmnt+0xc6/0x1a0
> [    5.315518]  [<ffffffff81133249>] vfs_kern_mount+0x89/0x1a0
> [    5.315518]  [<ffffffff811333ce>] do_kern_mount+0x4e/0x110
> [    5.315518]  [<ffffffff8114cb47>] do_mount+0x547/0x800
> [    5.315518]  [<ffffffff810fe660>] ? strndup_user+0x80/0xb0
> [    5.315518]  [<ffffffff8114ce8a>] sys_mount+0x8a/0xd0
> [    5.315518]  [<ffffffff8100ae02>] system_call_fastpath+0x16/0x1b
> 
> Signed-off-by: Eric Paris <eparis@redhat.com>
> ---
> 
>  fs/btrfs/disk-io.c          |    4 ++--
>  fs/btrfs/extent_io.c        |    4 ++--
>  fs/btrfs/extent_map.c       |    2 +-
>  fs/btrfs/free-space-cache.c |    4 ++--
>  fs/btrfs/ordered-data.h     |    2 +-
>  fs/btrfs/ref-cache.h        |    2 +-
>  fs/btrfs/relocation.c       |    4 ++--
>  fs/btrfs/transaction.c      |    2 +-
>  8 files changed, 12 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 2b59201..0427183 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -901,7 +901,7 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
>  	root->highest_objectid = 0;
>  	root->name = NULL;
>  	root->in_sysfs = 0;
> -	root->inode_tree.rb_node = NULL;
> +	root->inode_tree = RB_ROOT;
>  
>  	INIT_LIST_HEAD(&root->dirty_list);
>  	INIT_LIST_HEAD(&root->orphan_list);
> @@ -1673,7 +1673,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
>  	insert_inode_hash(fs_info->btree_inode);
>  
>  	spin_lock_init(&fs_info->block_group_cache_lock);
> -	fs_info->block_group_cache_tree.rb_node = NULL;
> +	fs_info->block_group_cache_tree = RB_ROOT;
>  
>  	extent_io_tree_init(&fs_info->freed_extents[0],
>  			     fs_info->btree_inode->i_mapping, GFP_NOFS);
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index b177ed3..7073cbb 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -104,8 +104,8 @@ void extent_io_exit(void)
>  void extent_io_tree_init(struct extent_io_tree *tree,
>  			  struct address_space *mapping, gfp_t mask)
>  {
> -	tree->state.rb_node = NULL;
> -	tree->buffer.rb_node = NULL;
> +	tree->state = RB_ROOT;
> +	tree->buffer = RB_ROOT;
>  	tree->ops = NULL;
>  	tree->dirty_bytes = 0;
>  	spin_lock_init(&tree->lock);
> diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
> index 428fcac..28d87ba 100644
> --- a/fs/btrfs/extent_map.c
> +++ b/fs/btrfs/extent_map.c
> @@ -35,7 +35,7 @@ void extent_map_exit(void)
>   */
>  void extent_map_tree_init(struct extent_map_tree *tree, gfp_t mask)
>  {
> -	tree->map.rb_node = NULL;
> +	tree->map = RB_ROOT;
>  	rwlock_init(&tree->lock);
>  }
>  
> diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
> index cb2849f..dd831ed 100644
> --- a/fs/btrfs/free-space-cache.c
> +++ b/fs/btrfs/free-space-cache.c
> @@ -870,7 +870,7 @@ __btrfs_return_cluster_to_free_space(
>  		tree_insert_offset(&block_group->free_space_offset,
>  				   entry->offset, &entry->offset_index, 0);
>  	}
> -	cluster->root.rb_node = NULL;
> +	cluster->root = RB_ROOT;
>  
>  out:
>  	spin_unlock(&cluster->lock);
> @@ -1355,7 +1355,7 @@ void btrfs_init_free_cluster(struct btrfs_free_cluster *cluster)
>  {
>  	spin_lock_init(&cluster->lock);
>  	spin_lock_init(&cluster->refill_lock);
> -	cluster->root.rb_node = NULL;
> +	cluster->root = RB_ROOT;
>  	cluster->max_size = 0;
>  	cluster->points_to_bitmap = false;
>  	INIT_LIST_HEAD(&cluster->block_group_list);
> diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h
> index 1fe1282..9116c6d 100644
> --- a/fs/btrfs/ordered-data.h
> +++ b/fs/btrfs/ordered-data.h
> @@ -129,7 +129,7 @@ static inline void
>  btrfs_ordered_inode_tree_init(struct btrfs_ordered_inode_tree *t)
>  {
>  	mutex_init(&t->mutex);
> -	t->tree.rb_node = NULL;
> +	t->tree = RB_ROOT;
>  	t->last = NULL;
>  }
>  
> diff --git a/fs/btrfs/ref-cache.h b/fs/btrfs/ref-cache.h
> index bc283ad..e2a55cb 100644
> --- a/fs/btrfs/ref-cache.h
> +++ b/fs/btrfs/ref-cache.h
> @@ -52,7 +52,7 @@ static inline size_t btrfs_leaf_ref_size(int nr_extents)
>  
>  static inline void btrfs_leaf_ref_tree_init(struct btrfs_leaf_ref_tree *tree)
>  {
> -	tree->root.rb_node = NULL;
> +	tree->root = RB_ROOT;
>  	INIT_LIST_HEAD(&tree->list);
>  	spin_lock_init(&tree->lock);
>  }
> diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
> index ab7ab53..0109e56 100644
> --- a/fs/btrfs/relocation.c
> +++ b/fs/btrfs/relocation.c
> @@ -170,14 +170,14 @@ struct async_merge {
>  
>  static void mapping_tree_init(struct mapping_tree *tree)
>  {
> -	tree->rb_root.rb_node = NULL;
> +	tree->rb_root = RB_ROOT;
>  	spin_lock_init(&tree->lock);
>  }
>  
>  static void backref_cache_init(struct backref_cache *cache)
>  {
>  	int i;
> -	cache->rb_root.rb_node = NULL;
> +	cache->rb_root = RB_ROOT;
>  	for (i = 0; i < BTRFS_MAX_LEVEL; i++)
>  		INIT_LIST_HEAD(&cache->pending[i]);
>  	spin_lock_init(&cache->lock);
> diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
> index b2acc79..2a36e23 100644
> --- a/fs/btrfs/transaction.c
> +++ b/fs/btrfs/transaction.c
> @@ -69,7 +69,7 @@ static noinline int join_transaction(struct btrfs_root *root)
>  		cur_trans->commit_done = 0;
>  		cur_trans->start_time = get_seconds();
>  
> -		cur_trans->delayed_refs.root.rb_node = NULL;
> +		cur_trans->delayed_refs.root = RB_ROOT;
>  		cur_trans->delayed_refs.num_entries = 0;
>  		cur_trans->delayed_refs.num_heads_ready = 0;
>  		cur_trans->delayed_refs.num_heads = 0;
> 



^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] btrfs: use RB_ROOT to intialize rb_trees instead of setting rb_node to NULL
  2010-02-23 19:51 ` Pallipadi, Venkatesh
@ 2010-02-23 19:54   ` Eric Paris
  0 siblings, 0 replies; 3+ messages in thread
From: Eric Paris @ 2010-02-23 19:54 UTC (permalink / raw)
  To: Pallipadi, Venkatesh
  Cc: linux-btrfs@vger.kernel.org, chris.mason@oracle.com,
	mingo@elte.hu, hpa@zytor.com, tglx@linutronix.de, wstrepp@gmx.de,
	Siddha, Suresh B, linux-kernel@vger.kernel.org

On Tue, 2010-02-23 at 11:51 -0800, Pallipadi, Venkatesh wrote:
> Acked-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
> 
> Quick grep also shows similar initializations in jffs2, ext4 and ext3.
> Let me know if you already have patch for them, otherwise I can send in
> the fix for those.

I do not, so I think it would be best if you sent in fixes for them.

-Eric


> 
> Thanks,
> Venki
> 
> On Tue, 2010-02-23 at 11:43 -0800, Eric Paris wrote:
> > btrfs inialize rb trees in quite a number of places by settin rb_node =
> > NULL;  The problem with this is that 17d9ddc72fb8bba0d4f678 in the
> > linux-next tree adds a new field to that struct which needs to be NULL for
> > the new rbtree library code to work properly.  This patch uses RB_ROOT as
> > the intializer so all of the relevant fields will be NULL'd.  Without the
> > patch I get a panic like that shown below and after the patch my system
> > boots.
> > 
> > [    5.314627] general protection fault: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
> > [    5.315518] last sysfs file: /sys/kernel/uevent_seqnum
> > [    5.315518] CPU 0
> > [    5.315518] Modules linked in: [last unloaded: scsi_wait_scan]
> > [    5.315518]
> > [    5.315518] Pid: 1314, comm: mount Not tainted 2.6.33-rc8-next-20100223+ #21 /KVM
> > [    5.315518] RIP: 0010:[<ffffffff81296cc0>]  [<ffffffff81296cc0>] rb_insert_color+0x20/0x120
> > [    5.315518] RSP: 0018:ffff88003cc21a88  EFLAGS: 00010206
> > [    5.315518] RAX: 5a5a5a5a5a5a5a5a RBX: ffffea0000d5e5b8 RCX: 0000000000000000
> > [    5.315518] RDX: ffff88003d710080 RSI: ffff88003d710080 RDI: ffff88003d610058
> > [    5.315518] RBP: ffff88003cc21ab8 R08: 0000000000000002 R09: 0000000000000000
> > [    5.315518] R10: 0000000000000000 R11: 0000000000000001 R12: ffff88003d710070
> > [    5.315518] R13: 0000000000000010 R14: ffff88003d610058 R15: ffff88003d710080
> > [    5.315518] FS:  00007ffe37b197e0(0000) GS:ffff880004000000(0000) knlGS:0000000000000000
> > [    5.315518] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
> > [    5.315518] CR2: 00007ffe36d7d010 CR3: 000000003cd94000 CR4: 00000000000006f0
> > [    5.315518] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> > [    5.315518] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> > [    5.315518] Process mount (pid: 1314, threadinfo ffff88003cc20000, task ffff88003d100000)
> > [    5.315518] Stack:
> > [    5.315518]  ffff88003cc21ab8 ffffea0000d5e5b8 ffff88003d710070 0000000000000010
> > [    5.315518] <0> ffff88003d7100e0 0000000000010000 ffff88003cc21b48 ffffffff812058b4
> > [    5.315518] <0> ffff88003cc2e060 ffff88003cc20000 0000000000000010 000000503cc2dff0
> > [    5.315518] Call Trace:
> > [    5.315518]  [<ffffffff812058b4>] alloc_extent_buffer+0x294/0x410
> > [    5.315518]  [<ffffffff811dfa28>] btrfs_find_create_tree_block+0x28/0x30
> > [    5.315518]  [<ffffffff81209cd1>] btrfs_read_sys_array+0x31/0x150
> > [    5.315518]  [<ffffffff811e429a>] open_ctree+0x109a/0x1710
> > [    5.315518]  [<ffffffff81133bc5>] ? sget+0x365/0x480
> > [    5.315518]  [<ffffffff812980af>] ? strlcpy+0x4f/0x70
> > [    5.315518]  [<ffffffff811c4f8c>] btrfs_get_sb+0x41c/0x510
> > [    5.315518]  [<ffffffff8114a846>] ? alloc_vfsmnt+0xc6/0x1a0
> > [    5.315518]  [<ffffffff81133249>] vfs_kern_mount+0x89/0x1a0
> > [    5.315518]  [<ffffffff811333ce>] do_kern_mount+0x4e/0x110
> > [    5.315518]  [<ffffffff8114cb47>] do_mount+0x547/0x800
> > [    5.315518]  [<ffffffff810fe660>] ? strndup_user+0x80/0xb0
> > [    5.315518]  [<ffffffff8114ce8a>] sys_mount+0x8a/0xd0
> > [    5.315518]  [<ffffffff8100ae02>] system_call_fastpath+0x16/0x1b
> > 
> > Signed-off-by: Eric Paris <eparis@redhat.com>
> > ---
> > 
> >  fs/btrfs/disk-io.c          |    4 ++--
> >  fs/btrfs/extent_io.c        |    4 ++--
> >  fs/btrfs/extent_map.c       |    2 +-
> >  fs/btrfs/free-space-cache.c |    4 ++--
> >  fs/btrfs/ordered-data.h     |    2 +-
> >  fs/btrfs/ref-cache.h        |    2 +-
> >  fs/btrfs/relocation.c       |    4 ++--
> >  fs/btrfs/transaction.c      |    2 +-
> >  8 files changed, 12 insertions(+), 12 deletions(-)
> > 
> > diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> > index 2b59201..0427183 100644
> > --- a/fs/btrfs/disk-io.c
> > +++ b/fs/btrfs/disk-io.c
> > @@ -901,7 +901,7 @@ static int __setup_root(u32 nodesize, u32 leafsize, u32 sectorsize,
> >  	root->highest_objectid = 0;
> >  	root->name = NULL;
> >  	root->in_sysfs = 0;
> > -	root->inode_tree.rb_node = NULL;
> > +	root->inode_tree = RB_ROOT;
> >  
> >  	INIT_LIST_HEAD(&root->dirty_list);
> >  	INIT_LIST_HEAD(&root->orphan_list);
> > @@ -1673,7 +1673,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
> >  	insert_inode_hash(fs_info->btree_inode);
> >  
> >  	spin_lock_init(&fs_info->block_group_cache_lock);
> > -	fs_info->block_group_cache_tree.rb_node = NULL;
> > +	fs_info->block_group_cache_tree = RB_ROOT;
> >  
> >  	extent_io_tree_init(&fs_info->freed_extents[0],
> >  			     fs_info->btree_inode->i_mapping, GFP_NOFS);
> > diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> > index b177ed3..7073cbb 100644
> > --- a/fs/btrfs/extent_io.c
> > +++ b/fs/btrfs/extent_io.c
> > @@ -104,8 +104,8 @@ void extent_io_exit(void)
> >  void extent_io_tree_init(struct extent_io_tree *tree,
> >  			  struct address_space *mapping, gfp_t mask)
> >  {
> > -	tree->state.rb_node = NULL;
> > -	tree->buffer.rb_node = NULL;
> > +	tree->state = RB_ROOT;
> > +	tree->buffer = RB_ROOT;
> >  	tree->ops = NULL;
> >  	tree->dirty_bytes = 0;
> >  	spin_lock_init(&tree->lock);
> > diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
> > index 428fcac..28d87ba 100644
> > --- a/fs/btrfs/extent_map.c
> > +++ b/fs/btrfs/extent_map.c
> > @@ -35,7 +35,7 @@ void extent_map_exit(void)
> >   */
> >  void extent_map_tree_init(struct extent_map_tree *tree, gfp_t mask)
> >  {
> > -	tree->map.rb_node = NULL;
> > +	tree->map = RB_ROOT;
> >  	rwlock_init(&tree->lock);
> >  }
> >  
> > diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c
> > index cb2849f..dd831ed 100644
> > --- a/fs/btrfs/free-space-cache.c
> > +++ b/fs/btrfs/free-space-cache.c
> > @@ -870,7 +870,7 @@ __btrfs_return_cluster_to_free_space(
> >  		tree_insert_offset(&block_group->free_space_offset,
> >  				   entry->offset, &entry->offset_index, 0);
> >  	}
> > -	cluster->root.rb_node = NULL;
> > +	cluster->root = RB_ROOT;
> >  
> >  out:
> >  	spin_unlock(&cluster->lock);
> > @@ -1355,7 +1355,7 @@ void btrfs_init_free_cluster(struct btrfs_free_cluster *cluster)
> >  {
> >  	spin_lock_init(&cluster->lock);
> >  	spin_lock_init(&cluster->refill_lock);
> > -	cluster->root.rb_node = NULL;
> > +	cluster->root = RB_ROOT;
> >  	cluster->max_size = 0;
> >  	cluster->points_to_bitmap = false;
> >  	INIT_LIST_HEAD(&cluster->block_group_list);
> > diff --git a/fs/btrfs/ordered-data.h b/fs/btrfs/ordered-data.h
> > index 1fe1282..9116c6d 100644
> > --- a/fs/btrfs/ordered-data.h
> > +++ b/fs/btrfs/ordered-data.h
> > @@ -129,7 +129,7 @@ static inline void
> >  btrfs_ordered_inode_tree_init(struct btrfs_ordered_inode_tree *t)
> >  {
> >  	mutex_init(&t->mutex);
> > -	t->tree.rb_node = NULL;
> > +	t->tree = RB_ROOT;
> >  	t->last = NULL;
> >  }
> >  
> > diff --git a/fs/btrfs/ref-cache.h b/fs/btrfs/ref-cache.h
> > index bc283ad..e2a55cb 100644
> > --- a/fs/btrfs/ref-cache.h
> > +++ b/fs/btrfs/ref-cache.h
> > @@ -52,7 +52,7 @@ static inline size_t btrfs_leaf_ref_size(int nr_extents)
> >  
> >  static inline void btrfs_leaf_ref_tree_init(struct btrfs_leaf_ref_tree *tree)
> >  {
> > -	tree->root.rb_node = NULL;
> > +	tree->root = RB_ROOT;
> >  	INIT_LIST_HEAD(&tree->list);
> >  	spin_lock_init(&tree->lock);
> >  }
> > diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
> > index ab7ab53..0109e56 100644
> > --- a/fs/btrfs/relocation.c
> > +++ b/fs/btrfs/relocation.c
> > @@ -170,14 +170,14 @@ struct async_merge {
> >  
> >  static void mapping_tree_init(struct mapping_tree *tree)
> >  {
> > -	tree->rb_root.rb_node = NULL;
> > +	tree->rb_root = RB_ROOT;
> >  	spin_lock_init(&tree->lock);
> >  }
> >  
> >  static void backref_cache_init(struct backref_cache *cache)
> >  {
> >  	int i;
> > -	cache->rb_root.rb_node = NULL;
> > +	cache->rb_root = RB_ROOT;
> >  	for (i = 0; i < BTRFS_MAX_LEVEL; i++)
> >  		INIT_LIST_HEAD(&cache->pending[i]);
> >  	spin_lock_init(&cache->lock);
> > diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
> > index b2acc79..2a36e23 100644
> > --- a/fs/btrfs/transaction.c
> > +++ b/fs/btrfs/transaction.c
> > @@ -69,7 +69,7 @@ static noinline int join_transaction(struct btrfs_root *root)
> >  		cur_trans->commit_done = 0;
> >  		cur_trans->start_time = get_seconds();
> >  
> > -		cur_trans->delayed_refs.root.rb_node = NULL;
> > +		cur_trans->delayed_refs.root = RB_ROOT;
> >  		cur_trans->delayed_refs.num_entries = 0;
> >  		cur_trans->delayed_refs.num_heads_ready = 0;
> >  		cur_trans->delayed_refs.num_heads = 0;
> > 
> 
> 



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-02-23 19:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-23 19:43 [PATCH] btrfs: use RB_ROOT to intialize rb_trees instead of setting rb_node to NULL Eric Paris
2010-02-23 19:51 ` Pallipadi, Venkatesh
2010-02-23 19:54   ` Eric Paris

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox