lkml.org 
[lkml]   [2006]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
SubjectIS_ERR Threshold Value
From
Date

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




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

-
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/

\
 
 \ /
  Last update: 2006-06-28 22:59    [W:0.101 / U:1.212 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site