* errno value for EDQUOT on MIPS
@ 2006-06-28 16:40 Erik Frederiksen
2006-06-28 18:12 ` Ralf Baechle
0 siblings, 1 reply; 2+ messages in thread
From: Erik Frederiksen @ 2006-06-28 16:40 UTC (permalink / raw)
To: linux-mips
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)
{
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: errno value for EDQUOT on MIPS
2006-06-28 16:40 errno value for EDQUOT on MIPS Erik Frederiksen
@ 2006-06-28 18:12 ` Ralf Baechle
0 siblings, 0 replies; 2+ messages in thread
From: Ralf Baechle @ 2006-06-28 18:12 UTC (permalink / raw)
To: Erik Frederiksen; +Cc: linux-mips
On Wed, Jun 28, 2006 at 10:40:07AM -0600, Erik Frederiksen wrote:
> 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.
History; the errno values were inheritted from earlier MIPS operating
systems at a time when that seemed to be a good idea because Linux was
the new kid in town.
> 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.
The value 1000 has been choosen pretty arbitrarily I think. Not sure if
a complicated solution is actually needed.
You may try raising that number to a higher value and posting the patch to
linux-kernel@vger.kernel.org to see if other have an issue with such a
change.
Ralf
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-06-28 18:12 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-28 16:40 errno value for EDQUOT on MIPS Erik Frederiksen
2006-06-28 18:12 ` Ralf Baechle
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox