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