static errcode_t revoke_insert(struct rb_root *root, uint64_t block, uint32_t seq) { struct rb_node ** p = &root->rb_node; struct rb_node * parent = NULL; struct revoke_entry *re; while (*p) { parent = *p; re = rb_entry(parent, struct revoke_entry, r_node); if (block < re->r_block) p = &(*p)->rb_left; else if (block > re->r_block) p = &(*p)->rb_right; else { if (seq_gt(seq, re->r_seq)) re->r_seq = seq; return 0; } } re = malloc(sizeof(struct revoke_entry)); if (re == NULL) return OCFS2_ET_NO_MEMORY; re->r_block = block; re->r_seq = seq; rb_link_node(&re->r_node, parent, p); rb_insert_color(&re->r_node, root); return 0; }
static int revoke_this_block(struct rb_root *root, uint64_t block, uint32_t seq) { struct rb_node *node = root->rb_node; struct revoke_entry *re; while (node) { re = rb_entry(node, struct revoke_entry, r_node); if (block < re->r_block) node = node->rb_left; else if (block > re->r_block) node = node->rb_right; else { /* only revoke if we've recorded a revoke entry for * this block that is <= the seq that we're interested * in */ if (re && !seq_gt(seq, re->r_seq)) { verbosef("%"PRIu64" is revoked\n", block); return 1; } } } return 0; }
int seq_ge(int a, int b) { if (a == b) { return 1; } return seq_gt(a, b); }