diff options
Diffstat (limited to 'fs/btrfs/rcu-string.h')
| -rw-r--r-- | fs/btrfs/rcu-string.h | 56 | 
1 files changed, 56 insertions, 0 deletions
| diff --git a/fs/btrfs/rcu-string.h b/fs/btrfs/rcu-string.h new file mode 100644 index 000000000000..9e111e4576d4 --- /dev/null +++ b/fs/btrfs/rcu-string.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2012 Red Hat.  All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + */ + +struct rcu_string { +	struct rcu_head rcu; +	char str[0]; +}; + +static inline struct rcu_string *rcu_string_strdup(const char *src, gfp_t mask) +{ +	size_t len = strlen(src) + 1; +	struct rcu_string *ret = kzalloc(sizeof(struct rcu_string) + +					 (len * sizeof(char)), mask); +	if (!ret) +		return ret; +	strncpy(ret->str, src, len); +	return ret; +} + +static inline void rcu_string_free(struct rcu_string *str) +{ +	if (str) +		kfree_rcu(str, rcu); +} + +#define printk_in_rcu(fmt, ...) do {	\ +	rcu_read_lock();		\ +	printk(fmt, __VA_ARGS__);	\ +	rcu_read_unlock();		\ +} while (0) + +#define printk_ratelimited_in_rcu(fmt, ...) do {	\ +	rcu_read_lock();				\ +	printk_ratelimited(fmt, __VA_ARGS__);		\ +	rcu_read_unlock();				\ +} while (0) + +#define rcu_str_deref(rcu_str) ({				\ +	struct rcu_string *__str = rcu_dereference(rcu_str);	\ +	__str->str;						\ +}) | 
