Messages in this thread | | | Date | Wed, 28 Jun 2006 14:08:25 -0700 | From | "Randy.Dunlap" <> | Subject | Re: IS_ERR Threshold Value |
| |
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@pmc-sierra.com) > + * 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@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |