1 #define __for_each_sorted_set(_init, start, _i, b) \
2 for (_init = b->data + start; \
3 sorted_set_checks(_i, b); \
4 _i += next_set(_i))
5
6 #define for_each_sorted_set(i, b) \
7 __for_each_sorted_set(i, 0, i, b)
8
9 #define for_each_key(b, iter) \
10 __for_each_sorted_set(struct bkey **_i, 0, _i, b) \
11 for (int _j = 1; iter = node(_i, _j), _j < keys(_i) + 1; _j++)
12
13 #define __for_good_keys(b, i, iter, start, end) \
14 for (int _j = start; \
15 ({ _j = next_good_key(i, _j, b); iter = node(i, _j); \
16 _j <= end; }); \
17 _j++)
18
19 #define for_each_good_key(b, iter) \
20 __for_each_sorted_set(struct bkey **_i, 0, _i, b) \
21 __for_good_keys(b, _i, iter, 1, keys(_i))
22
23 #define for_good_keys_after(b, i, iter, _search) \
24 __for_good_keys(b, i, iter, btree_bsearch(i, _search), keys(i))
25
26 #define for_each_good_key_after(b, iter, _search) \
27 __for_each_sorted_set(struct bkey **_i, 0, _i, b) \
28 for_good_keys_after(b, _i, iter, _search)
29
1 #define STRTO_H(name, type) \
2 int name ## _h(const char *cp, type *res) \
3 { \
4 int u = 0; \
5 char *e; \
6 type i = simple_ ## name(cp, &e, 10); \
7 \
8 switch (tolower(*e)) { \
9 default: \
10 return -EINVAL; \
11 case 'y': \
12 case 'z': \
13 u++; \
14 case 'e': \
15 u++; \
16 case 'p': \
17 u++; \
18 case 't': \
19 u++; \
20 case 'g': \
21 u++; \
22 case 'm': \
23 u++; \
24 case 'k': \
25 u++; \
26 if (e++ == cp) \
27 return -EINVAL; \
28 case '\n': \
29 case '\0': \
30 if (*e == '\n') \
31 e++; \
32 } \
33 \
34 if (*e) \
35 return -EINVAL; \
36 \
37 while (u--) { \
38 if ((type) ~0 > 0 && \
39 (type) ~0 / 1024 <= i) \
40 return -EINVAL; \
41 if ((i > 0 && ANYSINT_MAX(type) / 1024 < i) || \
42 (i < 0 && -ANYSINT_MAX(type) / 1024 > i)) \
43 return -EINVAL; \
44 i *= 1024; \
45 } \
46 \
47 *res = i; \
48 return 0; \
49 } \
50 EXPORT_SYMBOL_GPL(name ## _h);
51
52 STRTO_H(strtol, long)
53 STRTO_H(strtoll, long long)
54 STRTO_H(strtoul, unsigned long)
55 STRTO_H(strtoull, unsigned long long)