diff options
Diffstat (limited to 'include/linux/kernel.h')
| -rw-r--r-- | include/linux/kernel.h | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 6a1eb0b0aad9..58d6645b1425 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -964,6 +964,22 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }  			 "pointer type mismatch in container_of()");	\  	((type *)(__mptr - offsetof(type, member))); }) +/** + * container_of_safe - cast a member of a structure out to the containing structure + * @ptr:	the pointer to the member. + * @type:	the type of the container struct this is embedded in. + * @member:	the name of the member within the struct. + * + * If IS_ERR_OR_NULL(ptr), ptr is returned unchanged. + */ +#define container_of_safe(ptr, type, member) ({				\ +	void *__mptr = (void *)(ptr);					\ +	BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&	\ +			 !__same_type(*(ptr), void),			\ +			 "pointer type mismatch in container_of()");	\ +	IS_ERR_OR_NULL(ptr) ? ERR_CAST(ptr) :				\ +		((type *)(__mptr - offsetof(type, member))); }) +  /* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */  #ifdef CONFIG_FTRACE_MCOUNT_RECORD  # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD  | 
