1cfa460adSWilliam Juul #ifndef _LINUX_ERR_H 2cfa460adSWilliam Juul #define _LINUX_ERR_H 3cfa460adSWilliam Juul 4cfa460adSWilliam Juul #include <linux/compiler.h> 57b15e2bbSMike Frysinger #include <linux/compat.h> 6cfa460adSWilliam Juul 7cfa460adSWilliam Juul #include <asm/errno.h> 8cfa460adSWilliam Juul 9cfa460adSWilliam Juul 10cfa460adSWilliam Juul /* 11cfa460adSWilliam Juul * Kernel pointers have redundant information, so we can use a 12cfa460adSWilliam Juul * scheme where we can return either an error code or a dentry 13cfa460adSWilliam Juul * pointer with the same return value. 14cfa460adSWilliam Juul * 15cfa460adSWilliam Juul * This should be a per-architecture thing, to allow different 16cfa460adSWilliam Juul * error and pointer decisions. 17cfa460adSWilliam Juul */ 18cfa460adSWilliam Juul #define MAX_ERRNO 4095 19cfa460adSWilliam Juul 20cfa460adSWilliam Juul #ifndef __ASSEMBLY__ 21cfa460adSWilliam Juul 22cfa460adSWilliam Juul #define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO) 23cfa460adSWilliam Juul 24cfa460adSWilliam Juul static inline void *ERR_PTR(long error) 25cfa460adSWilliam Juul { 26cfa460adSWilliam Juul return (void *) error; 27cfa460adSWilliam Juul } 28cfa460adSWilliam Juul 29cfa460adSWilliam Juul static inline long PTR_ERR(const void *ptr) 30cfa460adSWilliam Juul { 31cfa460adSWilliam Juul return (long) ptr; 32cfa460adSWilliam Juul } 33cfa460adSWilliam Juul 34cfa460adSWilliam Juul static inline long IS_ERR(const void *ptr) 35cfa460adSWilliam Juul { 36cfa460adSWilliam Juul return IS_ERR_VALUE((unsigned long)ptr); 37cfa460adSWilliam Juul } 38cfa460adSWilliam Juul 39*cc96c9a7SHeiko Schocher /** 40*cc96c9a7SHeiko Schocher * ERR_CAST - Explicitly cast an error-valued pointer to another pointer type 41*cc96c9a7SHeiko Schocher * @ptr: The pointer to cast. 42*cc96c9a7SHeiko Schocher * 43*cc96c9a7SHeiko Schocher * Explicitly cast an error-valued pointer to another pointer type in such a 44*cc96c9a7SHeiko Schocher * way as to make it clear that's what's going on. 45*cc96c9a7SHeiko Schocher */ 46*cc96c9a7SHeiko Schocher static inline void * __must_check ERR_CAST(__force const void *ptr) 47*cc96c9a7SHeiko Schocher { 48*cc96c9a7SHeiko Schocher /* cast away the const */ 49*cc96c9a7SHeiko Schocher return (void *) ptr; 50*cc96c9a7SHeiko Schocher } 51*cc96c9a7SHeiko Schocher 52cfa460adSWilliam Juul #endif 53cfa460adSWilliam Juul 54cfa460adSWilliam Juul #endif /* _LINUX_ERR_H */ 55