1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun #ifdef __KERNEL__ 3*4882a593Smuzhiyun # include <linux/slab.h> 4*4882a593Smuzhiyun # include <linux/crush/crush.h> 5*4882a593Smuzhiyun #else 6*4882a593Smuzhiyun # include "crush_compat.h" 7*4882a593Smuzhiyun # include "crush.h" 8*4882a593Smuzhiyun #endif 9*4882a593Smuzhiyun crush_bucket_alg_name(int alg)10*4882a593Smuzhiyunconst char *crush_bucket_alg_name(int alg) 11*4882a593Smuzhiyun { 12*4882a593Smuzhiyun switch (alg) { 13*4882a593Smuzhiyun case CRUSH_BUCKET_UNIFORM: return "uniform"; 14*4882a593Smuzhiyun case CRUSH_BUCKET_LIST: return "list"; 15*4882a593Smuzhiyun case CRUSH_BUCKET_TREE: return "tree"; 16*4882a593Smuzhiyun case CRUSH_BUCKET_STRAW: return "straw"; 17*4882a593Smuzhiyun case CRUSH_BUCKET_STRAW2: return "straw2"; 18*4882a593Smuzhiyun default: return "unknown"; 19*4882a593Smuzhiyun } 20*4882a593Smuzhiyun } 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /** 23*4882a593Smuzhiyun * crush_get_bucket_item_weight - Get weight of an item in given bucket 24*4882a593Smuzhiyun * @b: bucket pointer 25*4882a593Smuzhiyun * @p: item index in bucket 26*4882a593Smuzhiyun */ crush_get_bucket_item_weight(const struct crush_bucket * b,int p)27*4882a593Smuzhiyunint crush_get_bucket_item_weight(const struct crush_bucket *b, int p) 28*4882a593Smuzhiyun { 29*4882a593Smuzhiyun if ((__u32)p >= b->size) 30*4882a593Smuzhiyun return 0; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun switch (b->alg) { 33*4882a593Smuzhiyun case CRUSH_BUCKET_UNIFORM: 34*4882a593Smuzhiyun return ((struct crush_bucket_uniform *)b)->item_weight; 35*4882a593Smuzhiyun case CRUSH_BUCKET_LIST: 36*4882a593Smuzhiyun return ((struct crush_bucket_list *)b)->item_weights[p]; 37*4882a593Smuzhiyun case CRUSH_BUCKET_TREE: 38*4882a593Smuzhiyun return ((struct crush_bucket_tree *)b)->node_weights[crush_calc_tree_node(p)]; 39*4882a593Smuzhiyun case CRUSH_BUCKET_STRAW: 40*4882a593Smuzhiyun return ((struct crush_bucket_straw *)b)->item_weights[p]; 41*4882a593Smuzhiyun case CRUSH_BUCKET_STRAW2: 42*4882a593Smuzhiyun return ((struct crush_bucket_straw2 *)b)->item_weights[p]; 43*4882a593Smuzhiyun } 44*4882a593Smuzhiyun return 0; 45*4882a593Smuzhiyun } 46*4882a593Smuzhiyun crush_destroy_bucket_uniform(struct crush_bucket_uniform * b)47*4882a593Smuzhiyunvoid crush_destroy_bucket_uniform(struct crush_bucket_uniform *b) 48*4882a593Smuzhiyun { 49*4882a593Smuzhiyun kfree(b->h.items); 50*4882a593Smuzhiyun kfree(b); 51*4882a593Smuzhiyun } 52*4882a593Smuzhiyun crush_destroy_bucket_list(struct crush_bucket_list * b)53*4882a593Smuzhiyunvoid crush_destroy_bucket_list(struct crush_bucket_list *b) 54*4882a593Smuzhiyun { 55*4882a593Smuzhiyun kfree(b->item_weights); 56*4882a593Smuzhiyun kfree(b->sum_weights); 57*4882a593Smuzhiyun kfree(b->h.items); 58*4882a593Smuzhiyun kfree(b); 59*4882a593Smuzhiyun } 60*4882a593Smuzhiyun crush_destroy_bucket_tree(struct crush_bucket_tree * b)61*4882a593Smuzhiyunvoid crush_destroy_bucket_tree(struct crush_bucket_tree *b) 62*4882a593Smuzhiyun { 63*4882a593Smuzhiyun kfree(b->h.items); 64*4882a593Smuzhiyun kfree(b->node_weights); 65*4882a593Smuzhiyun kfree(b); 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun crush_destroy_bucket_straw(struct crush_bucket_straw * b)68*4882a593Smuzhiyunvoid crush_destroy_bucket_straw(struct crush_bucket_straw *b) 69*4882a593Smuzhiyun { 70*4882a593Smuzhiyun kfree(b->straws); 71*4882a593Smuzhiyun kfree(b->item_weights); 72*4882a593Smuzhiyun kfree(b->h.items); 73*4882a593Smuzhiyun kfree(b); 74*4882a593Smuzhiyun } 75*4882a593Smuzhiyun crush_destroy_bucket_straw2(struct crush_bucket_straw2 * b)76*4882a593Smuzhiyunvoid crush_destroy_bucket_straw2(struct crush_bucket_straw2 *b) 77*4882a593Smuzhiyun { 78*4882a593Smuzhiyun kfree(b->item_weights); 79*4882a593Smuzhiyun kfree(b->h.items); 80*4882a593Smuzhiyun kfree(b); 81*4882a593Smuzhiyun } 82*4882a593Smuzhiyun crush_destroy_bucket(struct crush_bucket * b)83*4882a593Smuzhiyunvoid crush_destroy_bucket(struct crush_bucket *b) 84*4882a593Smuzhiyun { 85*4882a593Smuzhiyun switch (b->alg) { 86*4882a593Smuzhiyun case CRUSH_BUCKET_UNIFORM: 87*4882a593Smuzhiyun crush_destroy_bucket_uniform((struct crush_bucket_uniform *)b); 88*4882a593Smuzhiyun break; 89*4882a593Smuzhiyun case CRUSH_BUCKET_LIST: 90*4882a593Smuzhiyun crush_destroy_bucket_list((struct crush_bucket_list *)b); 91*4882a593Smuzhiyun break; 92*4882a593Smuzhiyun case CRUSH_BUCKET_TREE: 93*4882a593Smuzhiyun crush_destroy_bucket_tree((struct crush_bucket_tree *)b); 94*4882a593Smuzhiyun break; 95*4882a593Smuzhiyun case CRUSH_BUCKET_STRAW: 96*4882a593Smuzhiyun crush_destroy_bucket_straw((struct crush_bucket_straw *)b); 97*4882a593Smuzhiyun break; 98*4882a593Smuzhiyun case CRUSH_BUCKET_STRAW2: 99*4882a593Smuzhiyun crush_destroy_bucket_straw2((struct crush_bucket_straw2 *)b); 100*4882a593Smuzhiyun break; 101*4882a593Smuzhiyun } 102*4882a593Smuzhiyun } 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /** 105*4882a593Smuzhiyun * crush_destroy - Destroy a crush_map 106*4882a593Smuzhiyun * @map: crush_map pointer 107*4882a593Smuzhiyun */ crush_destroy(struct crush_map * map)108*4882a593Smuzhiyunvoid crush_destroy(struct crush_map *map) 109*4882a593Smuzhiyun { 110*4882a593Smuzhiyun /* buckets */ 111*4882a593Smuzhiyun if (map->buckets) { 112*4882a593Smuzhiyun __s32 b; 113*4882a593Smuzhiyun for (b = 0; b < map->max_buckets; b++) { 114*4882a593Smuzhiyun if (map->buckets[b] == NULL) 115*4882a593Smuzhiyun continue; 116*4882a593Smuzhiyun crush_destroy_bucket(map->buckets[b]); 117*4882a593Smuzhiyun } 118*4882a593Smuzhiyun kfree(map->buckets); 119*4882a593Smuzhiyun } 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* rules */ 122*4882a593Smuzhiyun if (map->rules) { 123*4882a593Smuzhiyun __u32 b; 124*4882a593Smuzhiyun for (b = 0; b < map->max_rules; b++) 125*4882a593Smuzhiyun crush_destroy_rule(map->rules[b]); 126*4882a593Smuzhiyun kfree(map->rules); 127*4882a593Smuzhiyun } 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #ifndef __KERNEL__ 130*4882a593Smuzhiyun kfree(map->choose_tries); 131*4882a593Smuzhiyun #else 132*4882a593Smuzhiyun clear_crush_names(&map->type_names); 133*4882a593Smuzhiyun clear_crush_names(&map->names); 134*4882a593Smuzhiyun clear_choose_args(map); 135*4882a593Smuzhiyun #endif 136*4882a593Smuzhiyun kfree(map); 137*4882a593Smuzhiyun } 138*4882a593Smuzhiyun crush_destroy_rule(struct crush_rule * rule)139*4882a593Smuzhiyunvoid crush_destroy_rule(struct crush_rule *rule) 140*4882a593Smuzhiyun { 141*4882a593Smuzhiyun kfree(rule); 142*4882a593Smuzhiyun } 143