Re: IS_ERR Threshold Value

From: Randy.Dunlap
Date: Wed Jun 28 2006 - 17:04:24 EST


On Wed, 28 Jun 2006 14:57:07 -0600 Erik Frederiksen wrote:

>
> from include/asm-mips/errno.h
> #define EDQUOT 1133 /* Quota exceeded */
>
> I noticed that the errno value for EDQUOT on MIPS is considerably larger
> than all others. This can lead to a situation where functions using
> 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 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
> haven't done a thorough investigation.
>
> 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.
> Perhaps permanently raising the threshold value to something >1133 is
> sufficient.
>
> Looking forward to your feedback.
>
> Erik Frederiksen
> Firmware Design Engineer Co-op
> PMC-Sierra Saskatoon

Hi,
Peter Anvin mentioned just a few days ago that this threshold value
should be 4095 for all arches. I think we need to get that patch
done & submitted to Andrew for -mm.


> 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)
> {
>
>
> -

---
~Randy
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/