linux/fs/btrfs/rcu-string.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 Red Hat.  All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public
   6 * License v2 as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11 * General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public
  14 * License along with this program; if not, write to the
  15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  16 * Boston, MA 021110-1307, USA.
  17 */
  18
  19struct rcu_string {
  20        struct rcu_head rcu;
  21        char str[0];
  22};
  23
  24static inline struct rcu_string *rcu_string_strdup(const char *src, gfp_t mask)
  25{
  26        size_t len = strlen(src) + 1;
  27        struct rcu_string *ret = kzalloc(sizeof(struct rcu_string) +
  28                                         (len * sizeof(char)), mask);
  29        if (!ret)
  30                return ret;
  31        strncpy(ret->str, src, len);
  32        return ret;
  33}
  34
  35static inline void rcu_string_free(struct rcu_string *str)
  36{
  37        if (str)
  38                kfree_rcu(str, rcu);
  39}
  40
  41#define printk_in_rcu(fmt, ...) do {    \
  42        rcu_read_lock();                \
  43        printk(fmt, __VA_ARGS__);       \
  44        rcu_read_unlock();              \
  45} while (0)
  46
  47#define printk_ratelimited_in_rcu(fmt, ...) do {        \
  48        rcu_read_lock();                                \
  49        printk_ratelimited(fmt, __VA_ARGS__);           \
  50        rcu_read_unlock();                              \
  51} while (0)
  52
  53#define rcu_str_deref(rcu_str) ({                               \
  54        struct rcu_string *__str = rcu_dereference(rcu_str);    \
  55        __str->str;                                             \
  56})
  57