diff --git a/cbits/HsUnix.c b/cbits/HsUnix.c
index bdd1e804defc517e7af090af6864950381b7df90..08cccd53453b9d32a4829ddd2b632f97b7a19be7 100644
--- a/cbits/HsUnix.c
+++ b/cbits/HsUnix.c
@@ -36,13 +36,30 @@ int __hsunix_push_module(int fd, const char *module)
 #endif
 }
 
+/*
+ * GNU glibc 2.23 and later deprecate `readdir_r` in favour of plain old
+ * `readdir` which in some upcoming POSIX standard is going to required to be
+ * re-entrant.
+ * Eventually we want to drop `readder_r` all together, but want to be
+ * compatible with older unixen which may not have a re-entrant `readdir`.
+ * Solution is to make systems with *known* re-entrant `readir` use that and use
+ * `readdir_r` whereever we have it and don't *know* that `readdir` is
+ * re-entrant.
+ */
+
+#if defined (__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 23)
+#define USE_READDIR_R 0
+#else
+#define USE_READDIR_R 1
+#endif
+
 /*
  * read an entry from the directory stream; opt for the
  * re-entrant friendly way of doing this, if available.
  */
 int __hscore_readdir( DIR *dirPtr, struct dirent **pDirEnt )
 {
-#if HAVE_READDIR_R
+#if HAVE_READDIR_R && USE_READDIR_R
   struct dirent* p;
   int res;
   static unsigned int nm_max = (unsigned int)-1;
diff --git a/changelog.md b/changelog.md
index eb429cb77c77194549303366a83d3b6dc5c90556..4bbeeb374a208bbd6f1a29d6e54a05009d26a876 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,9 @@
 # Changelog for [`unix` package](http://hackage.haskell.org/package/unix)
 
+## 2.7.2.1  *Sep 2016*
+
+  * Don't use `readdir_r` if its deprecated.
+
 ## 2.7.2.0  *Apr 2016*
 
   * Bundled with GHC 8.0.1