The error detection code in FileIO.close() could fail to reflect the `errno` value, and report it as -1 instead.
diff --git a/Lib/test/test_fileio.py b/Lib/test/test_fileio.py
index 498d3fc..9f94053 100644
--- a/Lib/test/test_fileio.py
+++ b/Lib/test/test_fileio.py
@@ -2,6 +2,7 @@
 
 import sys
 import os
+import errno
 import unittest
 from array import array
 from weakref import proxy
@@ -113,6 +114,20 @@
         else:
             self.fail("Should have raised IOError")
 
+    def testErrnoOnClose(self):
+        # Test that the IOError's `errno` attribute is correctly set when
+        # close() fails. Here we first close the file descriptor ourselves so
+        # that close() fails with EBADF ('Bad file descriptor').
+        f = self.f
+        os.close(f.fileno())
+        self.f = None
+        try:
+            f.close()
+        except IOError as e:
+            self.assertEqual(e.errno, errno.EBADF)
+        else:
+            self.fail("Should have raised IOError")
+
 
 class OtherFileTests(unittest.TestCase):
 
diff --git a/Misc/NEWS b/Misc/NEWS
index 4468df6..21b4a9b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,9 @@
 Library
 -------
 
+- The error detection code in FileIO.close() could fail to reflect the `errno`
+  value, and report it as -1 instead.
+
 
 What's New in Python 3.1 alpha 1
 ================================
diff --git a/Modules/_fileio.c b/Modules/_fileio.c
index fd35d69..32f6790 100644
--- a/Modules/_fileio.c
+++ b/Modules/_fileio.c
@@ -97,10 +97,8 @@
 		Py_RETURN_NONE;
 	}
 	errno = internal_close(self);
-	if (errno < 0) {
-		PyErr_SetFromErrno(PyExc_IOError);
+	if (errno < 0)
 		return NULL;
-	}
 
 	return PyObject_CallMethod((PyObject*)&PyRawIOBase_Type,
 				   "close", "O", self);