diff options
author | Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> | 2012-06-26 04:52:50 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-07-09 14:31:16 -0400 |
commit | c666e636ac9915f33fe175c75bc01ab994e5afa6 (patch) | |
tree | 11a178be5ee53c9f91eb4be3eb002e4fae66c435 | |
parent | 08b0b50048cea27437e06a5544b4ecc443a32f7d (diff) |
staging: zcache: cleanup the code between tmem_obj_init and tmem_obj_find
tmem_obj_find and insertion tmem-obj have the some logic, we can integrate
the code
Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/zcache/tmem.c | 63 |
1 files changed, 33 insertions, 30 deletions
diff --git a/drivers/staging/zcache/tmem.c b/drivers/staging/zcache/tmem.c index 1ca66ea9b28..eaa90213457 100644 --- a/drivers/staging/zcache/tmem.c +++ b/drivers/staging/zcache/tmem.c | |||
@@ -72,33 +72,49 @@ void tmem_register_pamops(struct tmem_pamops *m) | |||
72 | * the hashbucket lock must be held. | 72 | * the hashbucket lock must be held. |
73 | */ | 73 | */ |
74 | 74 | ||
75 | /* searches for object==oid in pool, returns locked object if found */ | 75 | static struct tmem_obj |
76 | static struct tmem_obj *tmem_obj_find(struct tmem_hashbucket *hb, | 76 | *__tmem_obj_find(struct tmem_hashbucket*hb, struct tmem_oid *oidp, |
77 | struct tmem_oid *oidp) | 77 | struct rb_node **parent, struct rb_node ***link) |
78 | { | 78 | { |
79 | struct rb_node *rbnode; | 79 | struct rb_node *_parent = NULL, **rbnode; |
80 | struct tmem_obj *obj; | 80 | struct tmem_obj *obj = NULL; |
81 | 81 | ||
82 | rbnode = hb->obj_rb_root.rb_node; | 82 | rbnode = &hb->obj_rb_root.rb_node; |
83 | while (rbnode) { | 83 | while (*rbnode) { |
84 | BUG_ON(RB_EMPTY_NODE(rbnode)); | 84 | BUG_ON(RB_EMPTY_NODE(*rbnode)); |
85 | obj = rb_entry(rbnode, struct tmem_obj, rb_tree_node); | 85 | _parent = *rbnode; |
86 | obj = rb_entry(*rbnode, struct tmem_obj, | ||
87 | rb_tree_node); | ||
86 | switch (tmem_oid_compare(oidp, &obj->oid)) { | 88 | switch (tmem_oid_compare(oidp, &obj->oid)) { |
87 | case 0: /* equal */ | 89 | case 0: /* equal */ |
88 | goto out; | 90 | goto out; |
89 | case -1: | 91 | case -1: |
90 | rbnode = rbnode->rb_left; | 92 | rbnode = &(*rbnode)->rb_left; |
91 | break; | 93 | break; |
92 | case 1: | 94 | case 1: |
93 | rbnode = rbnode->rb_right; | 95 | rbnode = &(*rbnode)->rb_right; |
94 | break; | 96 | break; |
95 | } | 97 | } |
96 | } | 98 | } |
99 | |||
100 | if (parent) | ||
101 | *parent = _parent; | ||
102 | if (link) | ||
103 | *link = rbnode; | ||
104 | |||
97 | obj = NULL; | 105 | obj = NULL; |
98 | out: | 106 | out: |
99 | return obj; | 107 | return obj; |
100 | } | 108 | } |
101 | 109 | ||
110 | |||
111 | /* searches for object==oid in pool, returns locked object if found */ | ||
112 | static struct tmem_obj *tmem_obj_find(struct tmem_hashbucket *hb, | ||
113 | struct tmem_oid *oidp) | ||
114 | { | ||
115 | return __tmem_obj_find(hb, oidp, NULL, NULL); | ||
116 | } | ||
117 | |||
102 | static void tmem_pampd_destroy_all_in_obj(struct tmem_obj *); | 118 | static void tmem_pampd_destroy_all_in_obj(struct tmem_obj *); |
103 | 119 | ||
104 | /* free an object that has no more pampds in it */ | 120 | /* free an object that has no more pampds in it */ |
@@ -131,8 +147,7 @@ static void tmem_obj_init(struct tmem_obj *obj, struct tmem_hashbucket *hb, | |||
131 | struct tmem_oid *oidp) | 147 | struct tmem_oid *oidp) |
132 | { | 148 | { |
133 | struct rb_root *root = &hb->obj_rb_root; | 149 | struct rb_root *root = &hb->obj_rb_root; |
134 | struct rb_node **new = &(root->rb_node), *parent = NULL; | 150 | struct rb_node **new = NULL, *parent = NULL; |
135 | struct tmem_obj *this; | ||
136 | 151 | ||
137 | BUG_ON(pool == NULL); | 152 | BUG_ON(pool == NULL); |
138 | atomic_inc(&pool->obj_count); | 153 | atomic_inc(&pool->obj_count); |
@@ -144,22 +159,10 @@ static void tmem_obj_init(struct tmem_obj *obj, struct tmem_hashbucket *hb, | |||
144 | obj->pampd_count = 0; | 159 | obj->pampd_count = 0; |
145 | (*tmem_pamops.new_obj)(obj); | 160 | (*tmem_pamops.new_obj)(obj); |
146 | SET_SENTINEL(obj, OBJ); | 161 | SET_SENTINEL(obj, OBJ); |
147 | while (*new) { | 162 | |
148 | BUG_ON(RB_EMPTY_NODE(*new)); | 163 | if (__tmem_obj_find(hb, oidp, &parent, &new)) |
149 | this = rb_entry(*new, struct tmem_obj, rb_tree_node); | 164 | BUG(); |
150 | parent = *new; | 165 | |
151 | switch (tmem_oid_compare(oidp, &this->oid)) { | ||
152 | case 0: | ||
153 | BUG(); /* already present; should never happen! */ | ||
154 | break; | ||
155 | case -1: | ||
156 | new = &(*new)->rb_left; | ||
157 | break; | ||
158 | case 1: | ||
159 | new = &(*new)->rb_right; | ||
160 | break; | ||
161 | } | ||
162 | } | ||
163 | rb_link_node(&obj->rb_tree_node, parent, new); | 166 | rb_link_node(&obj->rb_tree_node, parent, new); |
164 | rb_insert_color(&obj->rb_tree_node, root); | 167 | rb_insert_color(&obj->rb_tree_node, root); |
165 | } | 168 | } |