Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _LINUX_ERR_H 3 : : #define _LINUX_ERR_H 4 : : 5 : : #include <linux/compiler.h> 6 : : #include <linux/types.h> 7 : : 8 : : #include <asm/errno.h> 9 : : 10 : : /* 11 : : * Kernel pointers have redundant information, so we can use a 12 : : * scheme where we can return either an error code or a normal 13 : : * pointer with the same return value. 14 : : * 15 : : * This should be a per-architecture thing, to allow different 16 : : * error and pointer decisions. 17 : : */ 18 : : #define MAX_ERRNO 4095 19 : : 20 : : #ifndef __ASSEMBLY__ 21 : : 22 : : #define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO) 23 : : 24 : 3 : static inline void * __must_check ERR_PTR(long error) 25 : : { 26 : 3 : return (void *) error; 27 : : } 28 : : 29 : 0 : static inline long __must_check PTR_ERR(__force const void *ptr) 30 : : { 31 : 3 : return (long) ptr; 32 : : } 33 : : 34 : 0 : static inline bool __must_check IS_ERR(__force const void *ptr) 35 : : { 36 : 3 : return IS_ERR_VALUE((unsigned long)ptr); 37 : : } 38 : : 39 : 3 : static inline bool __must_check IS_ERR_OR_NULL(__force const void *ptr) 40 : : { 41 : 3 : return unlikely(!ptr) || IS_ERR_VALUE((unsigned long)ptr); 42 : : } 43 : : 44 : : /** 45 : : * ERR_CAST - Explicitly cast an error-valued pointer to another pointer type 46 : : * @ptr: The pointer to cast. 47 : : * 48 : : * Explicitly cast an error-valued pointer to another pointer type in such a 49 : : * way as to make it clear that's what's going on. 50 : : */ 51 : : static inline void * __must_check ERR_CAST(__force const void *ptr) 52 : : { 53 : : /* cast away the const */ 54 : : return (void *) ptr; 55 : : } 56 : : 57 : : static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr) 58 : : { 59 : 3 : if (IS_ERR(ptr)) 60 : : return PTR_ERR(ptr); 61 : : else 62 : : return 0; 63 : : } 64 : : 65 : : /* Deprecated */ 66 : : #define PTR_RET(p) PTR_ERR_OR_ZERO(p) 67 : : 68 : : #endif 69 : : 70 : : #endif /* _LINUX_ERR_H */