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 71221ce45SMasahiro Yamada #include <linux/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 ERR_PTR(long error)24cfa460adSWilliam Juulstatic inline void *ERR_PTR(long error) 25cfa460adSWilliam Juul { 26cfa460adSWilliam Juul return (void *) error; 27cfa460adSWilliam Juul } 28cfa460adSWilliam Juul PTR_ERR(const void * ptr)29cfa460adSWilliam Juulstatic inline long PTR_ERR(const void *ptr) 30cfa460adSWilliam Juul { 31cfa460adSWilliam Juul return (long) ptr; 32cfa460adSWilliam Juul } 33cfa460adSWilliam Juul IS_ERR(const void * ptr)34cfa460adSWilliam Juulstatic inline long IS_ERR(const void *ptr) 35cfa460adSWilliam Juul { 36cfa460adSWilliam Juul return IS_ERR_VALUE((unsigned long)ptr); 37cfa460adSWilliam Juul } 38cfa460adSWilliam Juul IS_ERR_OR_NULL(const void * ptr)39*f790ca7cSJagan Tekistatic inline bool IS_ERR_OR_NULL(const void *ptr) 40*f790ca7cSJagan Teki { 41*f790ca7cSJagan Teki return !ptr || IS_ERR_VALUE((unsigned long)ptr); 42*f790ca7cSJagan Teki } 43*f790ca7cSJagan Teki 44cc96c9a7SHeiko Schocher /** 45cc96c9a7SHeiko Schocher * ERR_CAST - Explicitly cast an error-valued pointer to another pointer type 46cc96c9a7SHeiko Schocher * @ptr: The pointer to cast. 47cc96c9a7SHeiko Schocher * 48cc96c9a7SHeiko Schocher * Explicitly cast an error-valued pointer to another pointer type in such a 49cc96c9a7SHeiko Schocher * way as to make it clear that's what's going on. 50cc96c9a7SHeiko Schocher */ ERR_CAST(__force const void * ptr)51cc96c9a7SHeiko Schocherstatic inline void * __must_check ERR_CAST(__force const void *ptr) 52cc96c9a7SHeiko Schocher { 53cc96c9a7SHeiko Schocher /* cast away the const */ 54cc96c9a7SHeiko Schocher return (void *) ptr; 55cc96c9a7SHeiko Schocher } 56cc96c9a7SHeiko Schocher 57cfa460adSWilliam Juul #endif 58cfa460adSWilliam Juul 59cfa460adSWilliam Juul #endif /* _LINUX_ERR_H */ 60