1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 23d14c5d2SYehuda Sadeh #ifdef __KERNEL__ 33d14c5d2SYehuda Sadeh # include <linux/slab.h> 43d14c5d2SYehuda Sadeh # include <linux/crush/crush.h> 5b459be73SIlya Dryomov #else 6b459be73SIlya Dryomov # include "crush_compat.h" 7b459be73SIlya Dryomov # include "crush.h" 8b459be73SIlya Dryomov #endif 93d14c5d2SYehuda Sadeh crush_bucket_alg_name(int alg)103d14c5d2SYehuda Sadehconst char *crush_bucket_alg_name(int alg) 113d14c5d2SYehuda Sadeh { 123d14c5d2SYehuda Sadeh switch (alg) { 133d14c5d2SYehuda Sadeh case CRUSH_BUCKET_UNIFORM: return "uniform"; 143d14c5d2SYehuda Sadeh case CRUSH_BUCKET_LIST: return "list"; 153d14c5d2SYehuda Sadeh case CRUSH_BUCKET_TREE: return "tree"; 163d14c5d2SYehuda Sadeh case CRUSH_BUCKET_STRAW: return "straw"; 17958a2765SIlya Dryomov case CRUSH_BUCKET_STRAW2: return "straw2"; 183d14c5d2SYehuda Sadeh default: return "unknown"; 193d14c5d2SYehuda Sadeh } 203d14c5d2SYehuda Sadeh } 213d14c5d2SYehuda Sadeh 223d14c5d2SYehuda Sadeh /** 233d14c5d2SYehuda Sadeh * crush_get_bucket_item_weight - Get weight of an item in given bucket 243d14c5d2SYehuda Sadeh * @b: bucket pointer 253d14c5d2SYehuda Sadeh * @p: item index in bucket 263d14c5d2SYehuda Sadeh */ crush_get_bucket_item_weight(const struct crush_bucket * b,int p)278b12d47bSSage Weilint crush_get_bucket_item_weight(const struct crush_bucket *b, int p) 283d14c5d2SYehuda Sadeh { 298b12d47bSSage Weil if ((__u32)p >= b->size) 303d14c5d2SYehuda Sadeh return 0; 313d14c5d2SYehuda Sadeh 323d14c5d2SYehuda Sadeh switch (b->alg) { 333d14c5d2SYehuda Sadeh case CRUSH_BUCKET_UNIFORM: 343d14c5d2SYehuda Sadeh return ((struct crush_bucket_uniform *)b)->item_weight; 353d14c5d2SYehuda Sadeh case CRUSH_BUCKET_LIST: 363d14c5d2SYehuda Sadeh return ((struct crush_bucket_list *)b)->item_weights[p]; 373d14c5d2SYehuda Sadeh case CRUSH_BUCKET_TREE: 38f671d4cdSSage Weil return ((struct crush_bucket_tree *)b)->node_weights[crush_calc_tree_node(p)]; 393d14c5d2SYehuda Sadeh case CRUSH_BUCKET_STRAW: 403d14c5d2SYehuda Sadeh return ((struct crush_bucket_straw *)b)->item_weights[p]; 41958a2765SIlya Dryomov case CRUSH_BUCKET_STRAW2: 42958a2765SIlya Dryomov return ((struct crush_bucket_straw2 *)b)->item_weights[p]; 433d14c5d2SYehuda Sadeh } 443d14c5d2SYehuda Sadeh return 0; 453d14c5d2SYehuda Sadeh } 463d14c5d2SYehuda Sadeh crush_destroy_bucket_uniform(struct crush_bucket_uniform * b)473d14c5d2SYehuda Sadehvoid crush_destroy_bucket_uniform(struct crush_bucket_uniform *b) 483d14c5d2SYehuda Sadeh { 493d14c5d2SYehuda Sadeh kfree(b->h.items); 503d14c5d2SYehuda Sadeh kfree(b); 513d14c5d2SYehuda Sadeh } 523d14c5d2SYehuda Sadeh crush_destroy_bucket_list(struct crush_bucket_list * b)533d14c5d2SYehuda Sadehvoid crush_destroy_bucket_list(struct crush_bucket_list *b) 543d14c5d2SYehuda Sadeh { 553d14c5d2SYehuda Sadeh kfree(b->item_weights); 563d14c5d2SYehuda Sadeh kfree(b->sum_weights); 573d14c5d2SYehuda Sadeh kfree(b->h.items); 583d14c5d2SYehuda Sadeh kfree(b); 593d14c5d2SYehuda Sadeh } 603d14c5d2SYehuda Sadeh crush_destroy_bucket_tree(struct crush_bucket_tree * b)613d14c5d2SYehuda Sadehvoid crush_destroy_bucket_tree(struct crush_bucket_tree *b) 623d14c5d2SYehuda Sadeh { 636eb43f4bSSage Weil kfree(b->h.items); 643d14c5d2SYehuda Sadeh kfree(b->node_weights); 653d14c5d2SYehuda Sadeh kfree(b); 663d14c5d2SYehuda Sadeh } 673d14c5d2SYehuda Sadeh crush_destroy_bucket_straw(struct crush_bucket_straw * b)683d14c5d2SYehuda Sadehvoid crush_destroy_bucket_straw(struct crush_bucket_straw *b) 693d14c5d2SYehuda Sadeh { 703d14c5d2SYehuda Sadeh kfree(b->straws); 713d14c5d2SYehuda Sadeh kfree(b->item_weights); 723d14c5d2SYehuda Sadeh kfree(b->h.items); 733d14c5d2SYehuda Sadeh kfree(b); 743d14c5d2SYehuda Sadeh } 753d14c5d2SYehuda Sadeh crush_destroy_bucket_straw2(struct crush_bucket_straw2 * b)76958a2765SIlya Dryomovvoid crush_destroy_bucket_straw2(struct crush_bucket_straw2 *b) 77958a2765SIlya Dryomov { 78958a2765SIlya Dryomov kfree(b->item_weights); 79958a2765SIlya Dryomov kfree(b->h.items); 80958a2765SIlya Dryomov kfree(b); 81958a2765SIlya Dryomov } 82958a2765SIlya Dryomov crush_destroy_bucket(struct crush_bucket * b)833d14c5d2SYehuda Sadehvoid crush_destroy_bucket(struct crush_bucket *b) 843d14c5d2SYehuda Sadeh { 853d14c5d2SYehuda Sadeh switch (b->alg) { 863d14c5d2SYehuda Sadeh case CRUSH_BUCKET_UNIFORM: 873d14c5d2SYehuda Sadeh crush_destroy_bucket_uniform((struct crush_bucket_uniform *)b); 883d14c5d2SYehuda Sadeh break; 893d14c5d2SYehuda Sadeh case CRUSH_BUCKET_LIST: 903d14c5d2SYehuda Sadeh crush_destroy_bucket_list((struct crush_bucket_list *)b); 913d14c5d2SYehuda Sadeh break; 923d14c5d2SYehuda Sadeh case CRUSH_BUCKET_TREE: 933d14c5d2SYehuda Sadeh crush_destroy_bucket_tree((struct crush_bucket_tree *)b); 943d14c5d2SYehuda Sadeh break; 953d14c5d2SYehuda Sadeh case CRUSH_BUCKET_STRAW: 963d14c5d2SYehuda Sadeh crush_destroy_bucket_straw((struct crush_bucket_straw *)b); 973d14c5d2SYehuda Sadeh break; 98958a2765SIlya Dryomov case CRUSH_BUCKET_STRAW2: 99958a2765SIlya Dryomov crush_destroy_bucket_straw2((struct crush_bucket_straw2 *)b); 100958a2765SIlya Dryomov break; 1013d14c5d2SYehuda Sadeh } 1023d14c5d2SYehuda Sadeh } 1033d14c5d2SYehuda Sadeh 1043d14c5d2SYehuda Sadeh /** 1053d14c5d2SYehuda Sadeh * crush_destroy - Destroy a crush_map 1063d14c5d2SYehuda Sadeh * @map: crush_map pointer 1073d14c5d2SYehuda Sadeh */ crush_destroy(struct crush_map * map)1083d14c5d2SYehuda Sadehvoid crush_destroy(struct crush_map *map) 1093d14c5d2SYehuda Sadeh { 1103d14c5d2SYehuda Sadeh /* buckets */ 1113d14c5d2SYehuda Sadeh if (map->buckets) { 1128b12d47bSSage Weil __s32 b; 1133d14c5d2SYehuda Sadeh for (b = 0; b < map->max_buckets; b++) { 1143d14c5d2SYehuda Sadeh if (map->buckets[b] == NULL) 1153d14c5d2SYehuda Sadeh continue; 1163d14c5d2SYehuda Sadeh crush_destroy_bucket(map->buckets[b]); 1173d14c5d2SYehuda Sadeh } 1183d14c5d2SYehuda Sadeh kfree(map->buckets); 1193d14c5d2SYehuda Sadeh } 1203d14c5d2SYehuda Sadeh 1213d14c5d2SYehuda Sadeh /* rules */ 1223d14c5d2SYehuda Sadeh if (map->rules) { 1238b12d47bSSage Weil __u32 b; 1243d14c5d2SYehuda Sadeh for (b = 0; b < map->max_rules; b++) 125bfb16d7dSIlya Dryomov crush_destroy_rule(map->rules[b]); 1263d14c5d2SYehuda Sadeh kfree(map->rules); 1273d14c5d2SYehuda Sadeh } 1283d14c5d2SYehuda Sadeh 129b459be73SIlya Dryomov #ifndef __KERNEL__ 130b459be73SIlya Dryomov kfree(map->choose_tries); 1315cf9c4a9SIlya Dryomov #else 132*86403a92SIlya Dryomov clear_crush_names(&map->type_names); 133*86403a92SIlya Dryomov clear_crush_names(&map->names); 1345cf9c4a9SIlya Dryomov clear_choose_args(map); 135b459be73SIlya Dryomov #endif 1363d14c5d2SYehuda Sadeh kfree(map); 1373d14c5d2SYehuda Sadeh } 1383d14c5d2SYehuda Sadeh crush_destroy_rule(struct crush_rule * rule)139bfb16d7dSIlya Dryomovvoid crush_destroy_rule(struct crush_rule *rule) 140bfb16d7dSIlya Dryomov { 141bfb16d7dSIlya Dryomov kfree(rule); 142bfb16d7dSIlya Dryomov } 143