| 129 | } |
| 130 | |
| 131 | int |
| 132 | rangeset_remove_pred(struct rangeset *rs, uint64_t start, uint64_t end, |
| 133 | rs_pred_t pred) |
| 134 | { |
| 135 | struct rs_el *r, *rn; |
| 136 | uint64_t *r1; |
| 137 | int error; |
| 138 | |
| 139 | rangeset_check(rs); |
| 140 | error = 0; |
| 141 | for (; end > 0 && start < end;) { |
| 142 | r1 = pctrie_lookup_le(&rs->rs_trie, end - 1); |
| 143 | if (r1 == NULL) |
| 144 | break; |
| 145 | r = __containerof(r1, struct rs_el, re_start); |
| 146 | |
| 147 | /* |
| 148 | * ------============================--|-------|---- |
| 149 | * rs re s e |
| 150 | */ |
| 151 | if (r->re_end <= start) |
| 152 | break; |
| 153 | |
| 154 | if (r->re_end <= end) { |
| 155 | if (r->re_start < start) { |
| 156 | /* |
| 157 | * ------========|==============-------|---- |
| 158 | * rs s re e |
| 159 | */ |
| 160 | if (pred(rs->rs_data_ctx, r)) |
| 161 | r->re_end = start; |
| 162 | break; |
| 163 | } |
| 164 | |
| 165 | /* |
| 166 | * ------|--------===================----------|---- |
| 167 | * s rs re e |
| 168 | */ |
| 169 | end = r->re_start; |
| 170 | if (pred(rs->rs_data_ctx, r)) { |
| 171 | pctrie_remove(&rs->rs_trie, r->re_start, |
| 172 | rs_node_free); |
| 173 | rs->rs_free_data(rs->rs_data_ctx, r); |
| 174 | } |
| 175 | continue; |
| 176 | } |
| 177 | |
| 178 | /* |
| 179 | * ------|--------====================|==========---- |
| 180 | * s rs e re |
| 181 | */ |
| 182 | if (r->re_start >= start) { |
| 183 | if (pred(rs->rs_data_ctx, r)) { |
| 184 | pctrie_remove(&rs->rs_trie, r->re_start, |
| 185 | rs_node_free); |
| 186 | r->re_start = end; |
| 187 | error = pctrie_insert(&rs->rs_trie, |
| 188 | &r->re_start, rs_node_alloc); |
no test coverage detected