Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */ 2 : /* 3 : * Copyright (C) 2012 Red Hat. All rights reserved. 4 : */ 5 : 6 : #ifndef BTRFS_RCU_STRING_H 7 : #define BTRFS_RCU_STRING_H 8 : 9 : struct rcu_string { 10 : struct rcu_head rcu; 11 : char str[]; 12 : }; 13 : 14 4489 : static inline struct rcu_string *rcu_string_strdup(const char *src, gfp_t mask) 15 : { 16 4489 : size_t len = strlen(src) + 1; 17 4489 : struct rcu_string *ret = kzalloc(sizeof(struct rcu_string) + 18 : (len * sizeof(char)), mask); 19 4489 : if (!ret) 20 : return ret; 21 : /* Warn if the source got unexpectedly truncated. */ 22 8978 : if (WARN_ON(strscpy(ret->str, src, len) < 0)) { 23 0 : kfree(ret); 24 0 : return NULL; 25 : } 26 : return ret; 27 : } 28 : 29 : static inline void rcu_string_free(struct rcu_string *str) 30 : { 31 4477 : if (str) 32 4477 : kfree_rcu(str, rcu); 33 : } 34 : 35 : #define printk_in_rcu(fmt, ...) do { \ 36 : rcu_read_lock(); \ 37 : printk(fmt, __VA_ARGS__); \ 38 : rcu_read_unlock(); \ 39 : } while (0) 40 : 41 : #define printk_ratelimited_in_rcu(fmt, ...) do { \ 42 : rcu_read_lock(); \ 43 : printk_ratelimited(fmt, __VA_ARGS__); \ 44 : rcu_read_unlock(); \ 45 : } while (0) 46 : 47 : #define rcu_str_deref(rcu_str) ({ \ 48 : struct rcu_string *__str = rcu_dereference(rcu_str); \ 49 : __str->str; \ 50 : }) 51 : 52 : #endif