diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c
index d458bf528d05fb87019c48208adde6fc0f3210f9..fc81f0bad0374fe8bc800c44f08377251e977c6c 100644
--- a/mysys/mf_iocache.c
+++ b/mysys/mf_iocache.c
@@ -200,11 +200,11 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
   if (type != READ_NET && type != WRITE_NET)
   {
     /* Retry allocating memory in smaller blocks until we get one */
+    cachesize=(uint) ((ulong) (cachesize + min_cache-1) &
+			(ulong) ~(min_cache-1));
     for (;;)
     {
       uint buffer_block;
-      cachesize=(uint) ((ulong) (cachesize + min_cache-1) &
-			(ulong) ~(min_cache-1));
       if (cachesize < min_cache)
 	cachesize = min_cache;
       buffer_block = cachesize;
@@ -223,7 +223,8 @@ int init_io_cache(IO_CACHE *info, File file, uint cachesize,
       }
       if (cachesize == min_cache)
 	DBUG_RETURN(2);				/* Can't alloc cache */
-      cachesize= (uint) ((long) cachesize*3/4); /* Try with less memory */
+      /* Try with less memory */
+      cachesize= (uint) ((ulong) cachesize*3/4 & (ulong)~(min_cache-1));
     }
   }