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