tbuf_size = vol->usable_leb_size;
        if (size < tbuf_size)
                tbuf_size = ALIGN(size, ubi->min_io_size);
-       tbuf = malloc(tbuf_size);
+       tbuf = malloc_cache_aligned(tbuf_size);
        if (!tbuf) {
                printf("NO MEM\n");
                return ENOMEM;
 
 
        patt_count = ARRAY_SIZE(patterns);
 
-       buf = malloc(nand->erasesize);
+       buf = malloc_cache_aligned(nand->erasesize);
        if (buf == NULL) {
                puts("Out of memory for erase block buffer\n");
                return -ENOMEM;
 
 {
        struct inode *inode;
 
-       inode = (struct inode *)malloc(sizeof(struct ubifs_inode));
+       inode = (struct inode *)malloc_cache_aligned(
+                       sizeof(struct ubifs_inode));
        if (inode) {
                inode->i_ino = ino;
                inode->i_sb = sb;
        /*
         * Allocate and use new inode
         */
-       ino = (struct inode *)malloc(sizeof(struct ubifs_inode));
+       ino = (struct inode *)malloc_cache_aligned(sizeof(struct ubifs_inode));
        memcpy(ino, inode, sizeof(struct ubifs_inode));
 
        /*
 
        struct crypto_comp *ptr;
        int i = 0;
 
-       ptr = malloc(sizeof(struct crypto_comp));
+       ptr = malloc_cache_aligned(sizeof(struct crypto_comp));
        while (i < UBIFS_COMPR_TYPES_CNT) {
                comp = ubifs_compressors[i];
                if (!comp) {
                                 * destination area to a multiple of
                                 * UBIFS_BLOCK_SIZE.
                                 */
-                               buff = malloc(UBIFS_BLOCK_SIZE);
+                               buff = malloc_cache_aligned(UBIFS_BLOCK_SIZE);
                                if (!buff) {
                                        printf("%s: Error, malloc fails!\n",
                                               __func__);
 
 #define DEFINE_CACHE_ALIGN_BUFFER(type, name, size)                    \
        DEFINE_ALIGN_BUFFER(type, name, size, ARCH_DMA_MINALIGN)
 
+#ifndef __ASSEMBLY__
+#include <malloc.h>
+
+static inline void *malloc_cache_aligned(size_t size)
+{
+       return memalign(ARCH_DMA_MINALIGN, ALIGN(size, ARCH_DMA_MINALIGN));
+}
+#endif
+
 /*
  * check_member() - Check the offset of a structure member
  *
 
        size *= items;
        size = (size + ZALLOC_ALIGNMENT - 1) & ~(ZALLOC_ALIGNMENT - 1);
 
-       p = malloc (size);
+       p = malloc_cache_aligned(size);
 
        return (p);
 }
 
  */
 #ifndef MY_ZCALLOC /* Any system without a special alloc function */
 
+#ifndef __UBOOT__
 #ifndef STDC
 extern voidp    malloc OF((uInt size));
 extern voidp    calloc OF((uInt items, uInt size));
 extern void     free   OF((voidpf ptr));
 #endif
+#endif
 
 voidpf zcalloc(voidpf opaque, unsigned items, unsigned size)
 {