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 : static inline void * __must_check ERR_PTR(long error) 25 : { 26 36 : return (void *) error; 27 : } 28 : 29 : static inline long __must_check PTR_ERR(__force const void *ptr) 30 : { 31 29 : return (long) ptr; 32 : } 33 : 34 : static inline bool __must_check IS_ERR(__force const void *ptr) 35 : { 36 201448 : return IS_ERR_VALUE((unsigned long)ptr); 37 : } 38 : 39 : static inline bool __must_check IS_ERR_OR_NULL(__force const void *ptr) 40 : { 41 305 : 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 1 : if (IS_ERR(ptr)) 60 0 : return PTR_ERR(ptr); 61 : else 62 : return 0; 63 : } 64 : 65 : #endif 66 : 67 : #endif /* _LINUX_ERR_H */