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