File Index
Files and directories
Sign in
FILE

string_table.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/ceph/string_table.h C
 1/* SPDX-License-Identifier: GPL-2.0 */
 2#ifndef _FS_CEPH_STRING_TABLE_H
 3#define _FS_CEPH_STRING_TABLE_H
 4
 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#endif
~/ Read-only file preview.