linux/include/linux/ceph/string_table.h
<<
>>
Prefs
   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
  64