#include "string-table.h"
#include "string-util.h"
+static SRIOV* sr_iov_detach_impl(SRIOV *sr_iov) {
+ assert(sr_iov);
+
+ if (!sr_iov->sr_iov_by_section)
+ return NULL;
+
+ assert(sr_iov->section);
+ ordered_hashmap_remove(sr_iov->sr_iov_by_section, sr_iov->section);
+ sr_iov->sr_iov_by_section = NULL;
+
+ return sr_iov;
+}
+
static SRIOV* sr_iov_free(SRIOV *sr_iov) {
if (!sr_iov)
return NULL;
- if (sr_iov->sr_iov_by_section && sr_iov->section)
- ordered_hashmap_remove(sr_iov->sr_iov_by_section, sr_iov->section);
+ sr_iov_detach_impl(sr_iov);
config_section_free(sr_iov->section);
return mfree(sr_iov);
}
-DEFINE_SECTION_CLEANUP_FUNCTIONS(SRIOV, sr_iov_free);
+DEFINE_TRIVIAL_REF_UNREF_FUNC(SRIOV, sr_iov, sr_iov_free);
+DEFINE_SECTION_CLEANUP_FUNCTIONS(SRIOV, sr_iov_unref);
+
+static void sr_iov_detach(SRIOV *sr_iov) {
+ assert(sr_iov);
+ sr_iov_unref(sr_iov_detach_impl(sr_iov));
+}
DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
sr_iov_hash_ops_by_section,
ConfigSection, config_section_hash_func, config_section_compare_func,
- SRIOV, sr_iov_free);
+ SRIOV, sr_iov_detach);
static int sr_iov_new(SRIOV **ret) {
SRIOV *sr_iov;
return -ENOMEM;
*sr_iov = (SRIOV) {
+ .n_ref = 1,
.vf = UINT32_MAX,
.vlan_proto = ETH_P_8021Q,
.vf_spoof_check_setting = -1,
static int sr_iov_new_static(OrderedHashmap **sr_iov_by_section, const char *filename, unsigned section_line, SRIOV **ret) {
_cleanup_(config_section_freep) ConfigSection *n = NULL;
- _cleanup_(sr_iov_freep) SRIOV *sr_iov = NULL;
+ _cleanup_(sr_iov_unrefp) SRIOV *sr_iov = NULL;
SRIOV *existing = NULL;
int r;
SRIOV *dup;
if (sr_iov_section_verify(num_vfs, sr_iov) < 0) {
- sr_iov_free(sr_iov);
+ sr_iov_detach(sr_iov);
continue;
}
"dropping the [SR-IOV] section specified at line %u.",
dup->section->filename, sr_iov->section->line,
dup->section->line, dup->section->line);
- sr_iov_free(dup);
+ sr_iov_detach(dup);
}
r = set_ensure_put(&set, &sr_iov_hash_ops, sr_iov);
void *data,
void *userdata) {
- _cleanup_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+ _cleanup_(sr_iov_unref_or_set_invalidp) SRIOV *sr_iov = NULL;
OrderedHashmap **sr_iov_by_section = ASSERT_PTR(data);
uint32_t k;
int r;
void *data,
void *userdata) {
- _cleanup_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+ _cleanup_(sr_iov_unref_or_set_invalidp) SRIOV *sr_iov = NULL;
OrderedHashmap **sr_iov_by_section = ASSERT_PTR(data);
int r;
void *data,
void *userdata) {
- _cleanup_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+ _cleanup_(sr_iov_unref_or_set_invalidp) SRIOV *sr_iov = NULL;
OrderedHashmap **sr_iov_by_section = ASSERT_PTR(data);
int r;
void *data,
void *userdata) {
- _cleanup_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+ _cleanup_(sr_iov_unref_or_set_invalidp) SRIOV *sr_iov = NULL;
OrderedHashmap **sr_iov_by_section = ASSERT_PTR(data);
int r;
void *data,
void *userdata) {
- _cleanup_(sr_iov_free_or_set_invalidp) SRIOV *sr_iov = NULL;
+ _cleanup_(sr_iov_unref_or_set_invalidp) SRIOV *sr_iov = NULL;
OrderedHashmap **sr_iov_by_section = ASSERT_PTR(data);
int r;