aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>2012-06-26 04:52:50 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-07-09 14:31:16 -0400
commitc666e636ac9915f33fe175c75bc01ab994e5afa6 (patch)
tree11a178be5ee53c9f91eb4be3eb002e4fae66c435
parent08b0b50048cea27437e06a5544b4ecc443a32f7d (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.c63
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 */ 75static struct tmem_obj
76static 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;
98out: 106out:
99 return obj; 107 return obj;
100} 108}
101 109
110
111/* searches for object==oid in pool, returns locked object if found */
112static 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
102static void tmem_pampd_destroy_all_in_obj(struct tmem_obj *); 118static 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}