btrfs: delayed-ref: Use list to replace the ref_root in ref_head.
This patch replace the rbtree used in ref_head to list. This has the following advantage: 1) Easier merge logic. With the new list implement, we only need to care merging the tail ref_node with the new ref_node. And this can be done quite easy at insert time, no need to do a indicated merge at run_delayed_refs(). Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
@@ -24,9 +24,25 @@
|
||||
#define BTRFS_ADD_DELAYED_EXTENT 3 /* record a full extent allocation */
|
||||
#define BTRFS_UPDATE_DELAYED_HEAD 4 /* not changing ref count on head ref */
|
||||
|
||||
/*
|
||||
* XXX: Qu: I really hate the design that ref_head and tree/data ref shares the
|
||||
* same ref_node structure.
|
||||
* Ref_head is in a higher logic level than tree/data ref, and duplicated
|
||||
* bytenr/num_bytes in ref_node is really a waste or memory, they should be
|
||||
* referred from ref_head.
|
||||
* This gets more disgusting after we use list to store tree/data ref in
|
||||
* ref_head. Must clean this mess up later.
|
||||
*/
|
||||
struct btrfs_delayed_ref_node {
|
||||
/*
|
||||
* ref_head use rb tree, stored in ref_root->href.
|
||||
* indexed by bytenr
|
||||
*/
|
||||
struct rb_node rb_node;
|
||||
|
||||
/*data/tree ref use list, stored in ref_head->ref_list. */
|
||||
struct list_head list;
|
||||
|
||||
/* the starting bytenr of the extent */
|
||||
u64 bytenr;
|
||||
|
||||
@@ -83,7 +99,7 @@ struct btrfs_delayed_ref_head {
|
||||
struct mutex mutex;
|
||||
|
||||
spinlock_t lock;
|
||||
struct rb_root ref_root;
|
||||
struct list_head ref_list;
|
||||
|
||||
struct rb_node href_node;
|
||||
|
||||
|
Reference in New Issue
Block a user