diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/netlabel/netlabel_domainhash.c | 30 |
1 files changed, 9 insertions, 21 deletions
diff --git a/net/netlabel/netlabel_domainhash.c b/net/netlabel/netlabel_domainhash.c index 1f8f7ace790e..9a8ea0195c4f 100644 --- a/net/netlabel/netlabel_domainhash.c +++ b/net/netlabel/netlabel_domainhash.c | |||
@@ -54,9 +54,6 @@ struct netlbl_domhsh_tbl { | |||
54 | * hash table should be okay */ | 54 | * hash table should be okay */ |
55 | static DEFINE_SPINLOCK(netlbl_domhsh_lock); | 55 | static DEFINE_SPINLOCK(netlbl_domhsh_lock); |
56 | static struct netlbl_domhsh_tbl *netlbl_domhsh = NULL; | 56 | static struct netlbl_domhsh_tbl *netlbl_domhsh = NULL; |
57 | |||
58 | /* Default domain mapping */ | ||
59 | static DEFINE_SPINLOCK(netlbl_domhsh_def_lock); | ||
60 | static struct netlbl_dom_map *netlbl_domhsh_def = NULL; | 57 | static struct netlbl_dom_map *netlbl_domhsh_def = NULL; |
61 | 58 | ||
62 | /* | 59 | /* |
@@ -239,24 +236,22 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry, | |||
239 | INIT_RCU_HEAD(&entry->rcu); | 236 | INIT_RCU_HEAD(&entry->rcu); |
240 | 237 | ||
241 | rcu_read_lock(); | 238 | rcu_read_lock(); |
239 | spin_lock(&netlbl_domhsh_lock); | ||
242 | if (entry->domain != NULL) { | 240 | if (entry->domain != NULL) { |
243 | bkt = netlbl_domhsh_hash(entry->domain); | 241 | bkt = netlbl_domhsh_hash(entry->domain); |
244 | spin_lock(&netlbl_domhsh_lock); | ||
245 | if (netlbl_domhsh_search(entry->domain) == NULL) | 242 | if (netlbl_domhsh_search(entry->domain) == NULL) |
246 | list_add_tail_rcu(&entry->list, | 243 | list_add_tail_rcu(&entry->list, |
247 | &rcu_dereference(netlbl_domhsh)->tbl[bkt]); | 244 | &rcu_dereference(netlbl_domhsh)->tbl[bkt]); |
248 | else | 245 | else |
249 | ret_val = -EEXIST; | 246 | ret_val = -EEXIST; |
250 | spin_unlock(&netlbl_domhsh_lock); | ||
251 | } else { | 247 | } else { |
252 | INIT_LIST_HEAD(&entry->list); | 248 | INIT_LIST_HEAD(&entry->list); |
253 | spin_lock(&netlbl_domhsh_def_lock); | ||
254 | if (rcu_dereference(netlbl_domhsh_def) == NULL) | 249 | if (rcu_dereference(netlbl_domhsh_def) == NULL) |
255 | rcu_assign_pointer(netlbl_domhsh_def, entry); | 250 | rcu_assign_pointer(netlbl_domhsh_def, entry); |
256 | else | 251 | else |
257 | ret_val = -EEXIST; | 252 | ret_val = -EEXIST; |
258 | spin_unlock(&netlbl_domhsh_def_lock); | ||
259 | } | 253 | } |
254 | spin_unlock(&netlbl_domhsh_lock); | ||
260 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_MAP_ADD, audit_info); | 255 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_MAP_ADD, audit_info); |
261 | if (audit_buf != NULL) { | 256 | if (audit_buf != NULL) { |
262 | audit_log_format(audit_buf, | 257 | audit_log_format(audit_buf, |
@@ -337,23 +332,16 @@ int netlbl_domhsh_remove(const char *domain, struct netlbl_audit *audit_info) | |||
337 | entry->domain); | 332 | entry->domain); |
338 | break; | 333 | break; |
339 | } | 334 | } |
340 | if (entry != rcu_dereference(netlbl_domhsh_def)) { | 335 | spin_lock(&netlbl_domhsh_lock); |
341 | spin_lock(&netlbl_domhsh_lock); | 336 | if (entry->valid) { |
342 | if (entry->valid) { | 337 | entry->valid = 0; |
343 | entry->valid = 0; | 338 | if (entry != rcu_dereference(netlbl_domhsh_def)) |
344 | list_del_rcu(&entry->list); | 339 | list_del_rcu(&entry->list); |
345 | ret_val = 0; | 340 | else |
346 | } | ||
347 | spin_unlock(&netlbl_domhsh_lock); | ||
348 | } else { | ||
349 | spin_lock(&netlbl_domhsh_def_lock); | ||
350 | if (entry->valid) { | ||
351 | entry->valid = 0; | ||
352 | rcu_assign_pointer(netlbl_domhsh_def, NULL); | 341 | rcu_assign_pointer(netlbl_domhsh_def, NULL); |
353 | ret_val = 0; | 342 | ret_val = 0; |
354 | } | ||
355 | spin_unlock(&netlbl_domhsh_def_lock); | ||
356 | } | 343 | } |
344 | spin_unlock(&netlbl_domhsh_lock); | ||
357 | 345 | ||
358 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_MAP_DEL, audit_info); | 346 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_MAP_DEL, audit_info); |
359 | if (audit_buf != NULL) { | 347 | if (audit_buf != NULL) { |