from include/asm-mips/errno.h #define EDQUOT 1133 /* Quota exceeded */ Hi everyone. I'm kind of confused as to why the value for EDQUOT is so large on MIPS. It seems like no other architectures have errnos that go that high. The reason I'm interested is that functions that use ERR_PTR() to return error codes in pointers cannot return this error code without IS_ERR() thinking that the pointer is valid. In my case, it caused an alignment exception in the XFS open call when quota has been exceeded. This takes place in the linux-mips 2.6.14 kernel. I think that the XFS code has changed enough that this bug isn't in newer versions, though I'm not sure about that. I've supplied a patch that addresses this situation by changing the threshold used by IS_ERR if EMAXERRNO is defined and greater than 1000. Looking forward to your feedback. Erik Frederiksen Firmware Design Engineer Co-op PMC-Sierra Saskatoon diff -Nau [ab]/include/linux/err.h --- a/include/linux/err.h 2005-10-30 13:14:22.000000000 -0600 +++ b/include/linux/err.h 2006-06-28 10:38:43.000000000 -0600 @@ -12,8 +12,23 @@ * * This should be a per-architecture thing, to allow different * error and pointer decisions. + * + * Updated by Erik Frederiksen (erik_frederiksen@xxxxxxxxxxxxxx) + * errno values on MIPS go up to 1133 for EDQUOT. The threshold + * is adjusted so that returning large errnos in a pointer + * does not result in a valid pointer according to IS_ERR. */ -#define IS_ERR_VALUE(x) unlikely((x) > (unsigned long)-1000L) + +#define ERR_PTR_THRESHOLD 1000 +#define IS_ERR_VALUE(x) \ + unlikely((x) > (unsigned long)-(long)ERR_PTR_THRESHOLD ) +#ifdef EMAXERRNO +# if EMAXERRNO >= ERR_PTR_THRESHOLD +# undef IS_ERR_VALUE +# define IS_ERR_VALUE(x) \ + unlikely((x) >= (unsigned long)-(long)EMAXERRNO ) +# endif +#endif static inline void *ERR_PTR(long error) {