diff options
Diffstat (limited to 'security')
-rw-r--r-- | security/keys/key.c | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/security/keys/key.c b/security/keys/key.c index ac9326c5f1da..700400d801dc 100644 --- a/security/keys/key.c +++ b/security/keys/key.c | |||
@@ -188,6 +188,7 @@ static inline void key_alloc_serial(struct key *key) | |||
188 | 188 | ||
189 | spin_lock(&key_serial_lock); | 189 | spin_lock(&key_serial_lock); |
190 | 190 | ||
191 | attempt_insertion: | ||
191 | parent = NULL; | 192 | parent = NULL; |
192 | p = &key_serial_tree.rb_node; | 193 | p = &key_serial_tree.rb_node; |
193 | 194 | ||
@@ -202,39 +203,33 @@ static inline void key_alloc_serial(struct key *key) | |||
202 | else | 203 | else |
203 | goto serial_exists; | 204 | goto serial_exists; |
204 | } | 205 | } |
205 | goto insert_here; | 206 | |
207 | /* we've found a suitable hole - arrange for this key to occupy it */ | ||
208 | rb_link_node(&key->serial_node, parent, p); | ||
209 | rb_insert_color(&key->serial_node, &key_serial_tree); | ||
210 | |||
211 | spin_unlock(&key_serial_lock); | ||
212 | return; | ||
206 | 213 | ||
207 | /* we found a key with the proposed serial number - walk the tree from | 214 | /* we found a key with the proposed serial number - walk the tree from |
208 | * that point looking for the next unused serial number */ | 215 | * that point looking for the next unused serial number */ |
209 | serial_exists: | 216 | serial_exists: |
210 | for (;;) { | 217 | for (;;) { |
211 | key->serial++; | 218 | key->serial++; |
212 | if (key->serial < 2) | 219 | if (key->serial < 3) { |
213 | key->serial = 2; | 220 | key->serial = 3; |
214 | 221 | goto attempt_insertion; | |
215 | if (!rb_parent(parent)) | 222 | } |
216 | p = &key_serial_tree.rb_node; | ||
217 | else if (rb_parent(parent)->rb_left == parent) | ||
218 | p = &(rb_parent(parent)->rb_left); | ||
219 | else | ||
220 | p = &(rb_parent(parent)->rb_right); | ||
221 | 223 | ||
222 | parent = rb_next(parent); | 224 | parent = rb_next(parent); |
223 | if (!parent) | 225 | if (!parent) |
224 | break; | 226 | goto attempt_insertion; |
225 | 227 | ||
226 | xkey = rb_entry(parent, struct key, serial_node); | 228 | xkey = rb_entry(parent, struct key, serial_node); |
227 | if (key->serial < xkey->serial) | 229 | if (key->serial < xkey->serial) |
228 | goto insert_here; | 230 | goto attempt_insertion; |
229 | } | 231 | } |
230 | 232 | ||
231 | /* we've found a suitable hole - arrange for this key to occupy it */ | ||
232 | insert_here: | ||
233 | rb_link_node(&key->serial_node, parent, p); | ||
234 | rb_insert_color(&key->serial_node, &key_serial_tree); | ||
235 | |||
236 | spin_unlock(&key_serial_lock); | ||
237 | |||
238 | } /* end key_alloc_serial() */ | 233 | } /* end key_alloc_serial() */ |
239 | 234 | ||
240 | /*****************************************************************************/ | 235 | /*****************************************************************************/ |