diff --git a/mysql-test/main/flush_logs_not_windows.result b/mysql-test/main/flush_logs_not_windows.result
new file mode 100644
index 00000000000..920fddb8f97
--- /dev/null
+++ b/mysql-test/main/flush_logs_not_windows.result
@@ -0,0 +1,3 @@
+flush logs;
+ERROR HY000: Can't create file 'MYSQLTEST_VARDIR/log/mysqld.1.err' (errno: 13 "Permission denied")
+flush logs;
diff --git a/mysql-test/main/flush_logs_not_windows.test b/mysql-test/main/flush_logs_not_windows.test
new file mode 100644
index 00000000000..af50e4bb9e8
--- /dev/null
+++ b/mysql-test/main/flush_logs_not_windows.test
@@ -0,0 +1,13 @@
+source include/not_windows.inc;
+source include/not_embedded.inc;
+#
+# MDEV-17710 "unknown error" with FLUSH LOGS if log directory is not writeable
+#
+move_file $MYSQLTEST_VARDIR/log/mysqld.1.err $MYSQLTEST_VARDIR/log/mysqld.1.err-bak;
+system chmod u-w $MYSQLTEST_VARDIR/log;
+replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR;
+error ER_CANT_CREATE_FILE;
+flush logs;
+system chmod u+w $MYSQLTEST_VARDIR/log;
+move_file $MYSQLTEST_VARDIR/log/mysqld.1.err-bak $MYSQLTEST_VARDIR/log/mysqld.1.err;
+flush logs;
diff --git a/sql/log.cc b/sql/log.cc
index ac885746c62..819ece8f98f 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -8644,14 +8644,14 @@ void sql_perror(const char *message)
   redirect stdout and stderr to a file. The streams are reopened
   only for appending (writing at end of file).
 */
-extern "C" my_bool reopen_fstreams(const char *filename,
-                                   FILE *outstream, FILE *errstream)
+bool reopen_fstreams(const char *filename, FILE *outstream, FILE *errstream)
 {
-  if (outstream && !my_freopen(filename, "a", outstream))
-    return TRUE;
-
-  if (errstream && !my_freopen(filename, "a", errstream))
+  if ((outstream && !my_freopen(filename, "a", outstream)) ||
+      (errstream && !my_freopen(filename, "a", errstream)))
+  {
+    my_error(ER_CANT_CREATE_FILE, MYF(0), filename, errno);
     return TRUE;
+  }
 
   /* The error stream must be unbuffered. */
   if (errstream)
diff --git a/sql/log.h b/sql/log.h
index 7dfdb36c442..91a7dcd80ab 100644
--- a/sql/log.h
+++ b/sql/log.h
@@ -26,6 +26,7 @@ class Relay_log_info;
 
 class Format_description_log_event;
 
+bool reopen_fstreams(const char *filename, FILE *outstream, FILE *errstream);
 void setup_log_handling();
 bool trans_has_updated_trans_table(const THD* thd);
 bool stmt_has_updated_trans_table(const THD *thd);
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 1c948f4563f..a824d0898d6 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -209,9 +209,6 @@ typedef fp_except fp_except_t;
 #define fcntl(X,Y,Z) 0
 #endif
 
-extern "C" my_bool reopen_fstreams(const char *filename,
-                                   FILE *outstream, FILE *errstream);
-
 inline void setup_fpu()
 {
 #if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H) && !defined(HAVE_FEDISABLEEXCEPT)
diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc
index abdf9d76d15..bb8b5e94173 100644
--- a/sql/sql_reload.cc
+++ b/sql/sql_reload.cc
@@ -124,14 +124,7 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options,
 
   if (options & REFRESH_ERROR_LOG)
     if (unlikely(flush_error_log()))
-    {
-      /*
-        When flush_error_log() failed, my_error() has not been called.
-        So, we have to do it here to keep the protocol.
-      */
-      my_error(ER_UNKNOWN_ERROR, MYF(0));
       result= 1;
-    }
 
   if ((options & REFRESH_SLOW_LOG) && global_system_variables.sql_log_slow)
     logger.flush_slow_log();