Merge tag 'gfs2-4.8.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2...
[cascardo/linux.git] / include / linux / ceph / string_table.h
1 #ifndef _FS_CEPH_STRING_TABLE_H
2 #define _FS_CEPH_STRING_TABLE_H
3
4 #include <linux/types.h>
5 #include <linux/kref.h>
6 #include <linux/rbtree.h>
7 #include <linux/rcupdate.h>
8
9 struct ceph_string {
10         struct kref kref;
11         union {
12                 struct rb_node node;
13                 struct rcu_head rcu;
14         };
15         size_t len;
16         char str[];
17 };
18
19 extern void ceph_release_string(struct kref *ref);
20 extern struct ceph_string *ceph_find_or_create_string(const char *str,
21                                                       size_t len);
22 extern bool ceph_strings_empty(void);
23
24 static inline struct ceph_string *ceph_get_string(struct ceph_string *str)
25 {
26         kref_get(&str->kref);
27         return str;
28 }
29
30 static inline void ceph_put_string(struct ceph_string *str)
31 {
32         if (!str)
33                 return;
34         kref_put(&str->kref, ceph_release_string);
35 }
36
37 static inline int ceph_compare_string(struct ceph_string *cs,
38                                       const char* str, size_t len)
39 {
40         size_t cs_len = cs ? cs->len : 0;
41         if (cs_len != len)
42                 return cs_len - len;
43         if (len == 0)
44                 return 0;
45         return strncmp(cs->str, str, len);
46 }
47
48 #define ceph_try_get_string(x)                                  \
49 ({                                                              \
50         struct ceph_string *___str;                             \
51         rcu_read_lock();                                        \
52         for (;;) {                                              \
53                 ___str = rcu_dereference(x);                    \
54                 if (!___str ||                                  \
55                     kref_get_unless_zero(&___str->kref))        \
56                         break;                                  \
57         }                                                       \
58         rcu_read_unlock();                                      \
59         (___str);                                               \
60 })
61
62 #endif