static int insert_attr(struct rb_root *root, unsigned long update_id, void *key, struct ib_sa_iterator *iter) { struct ib_sa_attr_list *attr_list; void *err; write_lock_irq(&rwlock); attr_list = find_attr_list(root, key); if (!attr_list) { write_unlock_irq(&rwlock); attr_list = kmalloc(sizeof *attr_list, GFP_KERNEL); if (!attr_list) return -ENOMEM; attr_list->iter.next = NULL; attr_list->tail = &attr_list->iter; attr_list->update_id = update_id; memcpy(attr_list->gid.raw, key, sizeof attr_list->gid); write_lock_irq(&rwlock); err = insert_attr_list(root, attr_list); if (err) { write_unlock_irq(&rwlock); kfree(attr_list); return PTR_ERR(err); } } else if (attr_list->update_id != update_id) { free_attr_list(attr_list); attr_list->update_id = update_id; } attr_list->tail->next = iter; iter->next = NULL; attr_list->tail = iter; write_unlock_irq(&rwlock); return 0; }
int main(int argc, char **argv) { char *test_only = NULL; int i = 1; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-v") == 0) { verbose++; } else if (strcmp(argv[i], "-test_only") == 0){ test_only = argv[++i]; } else { printf("Unknown argument %s\n", argv[i]); } } if (!test_only || (strcmp(test_only, "paramattr") == 0)) { static char extern_string[] = "int printf(string format, ...);"; #ifndef PRINTF_DEFINED extern int printf(); #endif static cod_extern_entry externs[] = { {"printf", (void*)(long)printf}, {(void*)0, (void*)0} }; /* test external call */ static char code[] = "{\ if (attr_set(l, \"test_value\")) {\n\ return attr_ivalue(l, \"test_value\");\n\ }\n\ return 0;\n\ }"; cod_parse_context context = new_cod_parse_context(); cod_parse_context context2; cod_code gen_code; int (*func)(attr_list l); attr_list l; cod_assoc_externs(context, externs); cod_parse_for_context(extern_string, context); context2 = cod_copy_context(context); l = create_attr_list(); set_attr(l, attr_atom_from_string("test_value"), Attr_Int4, (attr_value)15); cod_subroutine_declaration("int proc(attr_list l)", context); gen_code = cod_code_gen(code, context); func = (int (*)(attr_list))(long)gen_code->func; if ((func)(l) != 15) { printf("Function didn't return 15\n"); } cod_code_free(gen_code); cod_free_parse_context(context); cod_subroutine_declaration("int proc(attr_list l)", context2); gen_code = cod_code_gen(code, context2); func = (int (*)(attr_list))(long)gen_code->func; if ((func)(l) != 15) { printf("Function didn't return 15\n"); } free_attr_list(l); cod_code_free(gen_code); cod_free_parse_context(context2); }
static void remove_attr(struct rb_root *root, struct ib_sa_attr_list *attr_list) { rb_erase(&attr_list->node, root); free_attr_list(attr_list); kfree(attr_list); }