|
@@ -504,22 +504,16 @@ int cipso_v4_doi_add(struct cipso_v4_doi *doi_def)
|
|
|
INIT_RCU_HEAD(&doi_def->rcu);
|
|
|
INIT_LIST_HEAD(&doi_def->dom_list);
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
- if (cipso_v4_doi_search(doi_def->doi) != NULL)
|
|
|
- goto doi_add_failure_rlock;
|
|
|
spin_lock(&cipso_v4_doi_list_lock);
|
|
|
if (cipso_v4_doi_search(doi_def->doi) != NULL)
|
|
|
- goto doi_add_failure_slock;
|
|
|
+ goto doi_add_failure;
|
|
|
list_add_tail_rcu(&doi_def->list, &cipso_v4_doi_list);
|
|
|
spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
- rcu_read_unlock();
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
-doi_add_failure_slock:
|
|
|
+doi_add_failure:
|
|
|
spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
-doi_add_failure_rlock:
|
|
|
- rcu_read_unlock();
|
|
|
return -EEXIST;
|
|
|
}
|
|
|
|
|
@@ -543,29 +537,23 @@ int cipso_v4_doi_remove(u32 doi,
|
|
|
struct cipso_v4_doi *doi_def;
|
|
|
struct cipso_v4_domhsh_entry *dom_iter;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
- if (cipso_v4_doi_search(doi) != NULL) {
|
|
|
- spin_lock(&cipso_v4_doi_list_lock);
|
|
|
- doi_def = cipso_v4_doi_search(doi);
|
|
|
- if (doi_def == NULL) {
|
|
|
- spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
- rcu_read_unlock();
|
|
|
- return -ENOENT;
|
|
|
- }
|
|
|
+ spin_lock(&cipso_v4_doi_list_lock);
|
|
|
+ doi_def = cipso_v4_doi_search(doi);
|
|
|
+ if (doi_def != NULL) {
|
|
|
doi_def->valid = 0;
|
|
|
list_del_rcu(&doi_def->list);
|
|
|
spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
+ rcu_read_lock();
|
|
|
list_for_each_entry_rcu(dom_iter, &doi_def->dom_list, list)
|
|
|
if (dom_iter->valid)
|
|
|
netlbl_domhsh_remove(dom_iter->domain,
|
|
|
audit_info);
|
|
|
- cipso_v4_cache_invalidate();
|
|
|
rcu_read_unlock();
|
|
|
-
|
|
|
+ cipso_v4_cache_invalidate();
|
|
|
call_rcu(&doi_def->rcu, callback);
|
|
|
return 0;
|
|
|
}
|
|
|
- rcu_read_unlock();
|
|
|
+ spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
|
|
|
return -ENOENT;
|
|
|
}
|
|
@@ -653,22 +641,19 @@ int cipso_v4_doi_domhsh_add(struct cipso_v4_doi *doi_def, const char *domain)
|
|
|
new_dom->valid = 1;
|
|
|
INIT_RCU_HEAD(&new_dom->rcu);
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
spin_lock(&cipso_v4_doi_list_lock);
|
|
|
- list_for_each_entry_rcu(iter, &doi_def->dom_list, list)
|
|
|
+ list_for_each_entry(iter, &doi_def->dom_list, list)
|
|
|
if (iter->valid &&
|
|
|
((domain != NULL && iter->domain != NULL &&
|
|
|
strcmp(iter->domain, domain) == 0) ||
|
|
|
(domain == NULL && iter->domain == NULL))) {
|
|
|
spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
- rcu_read_unlock();
|
|
|
kfree(new_dom->domain);
|
|
|
kfree(new_dom);
|
|
|
return -EEXIST;
|
|
|
}
|
|
|
list_add_tail_rcu(&new_dom->list, &doi_def->dom_list);
|
|
|
spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
- rcu_read_unlock();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -689,9 +674,8 @@ int cipso_v4_doi_domhsh_remove(struct cipso_v4_doi *doi_def,
|
|
|
{
|
|
|
struct cipso_v4_domhsh_entry *iter;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
spin_lock(&cipso_v4_doi_list_lock);
|
|
|
- list_for_each_entry_rcu(iter, &doi_def->dom_list, list)
|
|
|
+ list_for_each_entry(iter, &doi_def->dom_list, list)
|
|
|
if (iter->valid &&
|
|
|
((domain != NULL && iter->domain != NULL &&
|
|
|
strcmp(iter->domain, domain) == 0) ||
|
|
@@ -699,13 +683,10 @@ int cipso_v4_doi_domhsh_remove(struct cipso_v4_doi *doi_def,
|
|
|
iter->valid = 0;
|
|
|
list_del_rcu(&iter->list);
|
|
|
spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
- rcu_read_unlock();
|
|
|
call_rcu(&iter->rcu, cipso_v4_doi_domhsh_free);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
spin_unlock(&cipso_v4_doi_list_lock);
|
|
|
- rcu_read_unlock();
|
|
|
|
|
|
return -ENOENT;
|
|
|
}
|