at v4.11-rc3 1.3 kB view raw
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 9struct 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 19extern void ceph_release_string(struct kref *ref); 20extern struct ceph_string *ceph_find_or_create_string(const char *str, 21 size_t len); 22extern bool ceph_strings_empty(void); 23 24static inline struct ceph_string *ceph_get_string(struct ceph_string *str) 25{ 26 kref_get(&str->kref); 27 return str; 28} 29 30static 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 37static 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