diff --git a/include/my_sys.h b/include/my_sys.h
index 5e56f0bdc2c8d2cfbd780468a84fba8b31347fad..79c7c8bd3c05a91c6281368ab76bacab0b97d58e 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -658,6 +658,7 @@ extern int init_io_cache(IO_CACHE *info,File file,uint cachesize,
 extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type,
 			       my_off_t seek_offset,pbool use_async_io,
 			       pbool clear_cache);
+extern void setup_io_cache(IO_CACHE* info);
 extern int _my_b_read(IO_CACHE *info,byte *Buffer,uint Count);
 #ifdef THREAD
 extern int _my_b_read_r(IO_CACHE *info,byte *Buffer,uint Count);
diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c
index f109df912f11eddddb3d86c0ce0e2cbba9863e30..d80de3101be0e052b2b9cf3a635cc08f41636abf 100644
--- a/mysys/mf_iocache.c
+++ b/mysys/mf_iocache.c
@@ -70,9 +70,40 @@ static void my_aiowait(my_aio_result *result);
 #define IO_ROUND_UP(X) (((X)+IO_SIZE-1) & ~(IO_SIZE-1))
 #define IO_ROUND_DN(X) ( (X)            & ~(IO_SIZE-1))
 
+
+/*
+  Setup internal pointers inside IO_CACHE
+
+  SYNOPSIS
+    setup_io_cache()
+    info		IO_CACHE handler
+
+  NOTES
+    This is called on automaticly on init or reinit of IO_CACHE
+    It must be called externally if one moves or copies an IO_CACHE
+    object.
+*/
+
+void setup_io_cache(IO_CACHE* info)
+{
+  /* Ensure that my_b_tell() and my_b_bytes_in_cache works */
+  if (info->type == WRITE_CACHE)
+  {
+    info->current_pos= &info->write_pos;
+    info->current_end= &info->write_end;
+  }
+  else
+  {
+    info->current_pos= &info->read_pos;
+    info->current_end= &info->read_end;
+  }
+}
+
+
 static void
-init_functions(IO_CACHE* info, enum cache_type type)
+init_functions(IO_CACHE* info)
 {
+  enum cache_type type= info->type;
   switch (type) {
   case READ_NET:
     /*
@@ -96,17 +127,7 @@ init_functions(IO_CACHE* info, enum cache_type type)
     info->write_function = _my_b_write;
   }
 
-  /* Ensure that my_b_tell() and my_b_bytes_in_cache works */
-  if (type == WRITE_CACHE)
-  {
-    info->current_pos= &info->write_pos;
-    info->current_end= &info->write_end;
-  }
-  else
-  {
-    info->current_pos= &info->read_pos;
-    info->current_end= &info->read_end;
-  }
+  setup_io_cache(info);
 }
 
 
@@ -236,7 +257,7 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
   info->end_of_file= end_of_file;
   info->error=0;
   info->type= type;
-  init_functions(info,type);
+  init_functions(info);
 #ifdef HAVE_AIOWAIT
   if (use_async_io && ! my_disable_async_io)
   {
@@ -358,7 +379,7 @@ my_bool reinit_io_cache(IO_CACHE *info, enum cache_type type,
   }
   info->type=type;
   info->error=0;
-  init_functions(info,type);
+  init_functions(info);
 
 #ifdef HAVE_AIOWAIT
   if (use_async_io && ! my_disable_async_io &&
diff --git a/sql/filesort.cc b/sql/filesort.cc
index cb377070aaa5cc25dfd00f6cdcd374bb88c38dc3..45478b436a591bdc063786adf2dc2abf9ce49073 100644
--- a/sql/filesort.cc
+++ b/sql/filesort.cc
@@ -803,6 +803,8 @@ int merge_many_buff(SORTPARAM *param, uchar *sort_buffer,
     if (flush_io_cache(to_file))
       break;					/* purecov: inspected */
     temp=from_file; from_file=to_file; to_file=temp;
+    setup_io_cache(from_file);
+    setup_io_cache(to_file);
     *maxbuffer= (uint) (lastbuff-buffpek)-1;
   }
   close_cached_file(to_file);			// This holds old result