linux-mips
[Top] [All Lists]

errno value for EDQUOT on MIPS

To: linux-mips@linux-mips.org
Subject: errno value for EDQUOT on MIPS
From: Erik Frederiksen <erik_frederiksen@pmc-sierra.com>
Date: Wed, 28 Jun 2006 10:40:07 -0600
Organization: PMC-Sierra
Original-recipient: rfc822;linux-mips@linux-mips.org
Sender: linux-mips-bounce@linux-mips.org
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@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)
 {





<Prev in Thread] Current Thread [Next in Thread>