Current fat.c have three 64KB static array, it makes
the BSS section larger.
Change the static to dynamic allocation.

Signed-off-by: Dave Liu <[EMAIL PROTECTED]>
---
 fs/fat/fat.c |   38 +++++++++++++++++++++++++++++++++++---
 1 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 49c78ed..8e054a6 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -28,6 +28,7 @@
 #include <common.h>
 #include <config.h>
 #include <fat.h>
+#include <malloc.h>
 #include <asm/byteorder.h>
 #include <part.h>
 
@@ -65,6 +66,37 @@ int disk_read (__u32 startblock, __u32 getsize, __u8 * 
bufptr)
        return -1;
 }
 
+__u8 *get_vfatname_block;
+__u8 *get_dentfromdir_block;
+__u8 *do_fat_read_block;
+static int fat_mem_done = 0;
+static int fat_memory_alloc(void)
+{
+       if (fat_mem_done)
+               return 0;
+
+       get_vfatname_block = (__u8 *)malloc(MAX_CLUSTSIZE);
+       if (!get_vfatname_block) {
+               printf("alloc get_vfatname_block failed\n\r");
+               return -1;
+       }
+
+       get_dentfromdir_block = (__u8 *)malloc(MAX_CLUSTSIZE);
+       if (!get_dentfromdir_block) {
+               printf("alloc get_dentfromdir_block failed\n\r");
+               return -1;
+       }
+
+       do_fat_read_block = (__u8 *)malloc(MAX_CLUSTSIZE);
+       if (!do_fat_read_block) {
+               printf("alloc do_fat_read_block failed\n\r");
+               return -1;
+       }
+
+       fat_mem_done = 1;
+
+       return 0;
+}
 
 int
 fat_register_device(block_dev_desc_t *dev_desc, int part_no)
@@ -72,6 +104,9 @@ fat_register_device(block_dev_desc_t *dev_desc, int part_no)
        unsigned char buffer[SECTOR_SIZE];
        disk_partition_t info;
 
+       if (fat_memory_alloc())
+               printf("fat memory alloc failed\n\r");
+
        if (!dev_desc->block_read)
                return -1;
        cur_dev = dev_desc;
@@ -435,7 +470,6 @@ slot2str(dir_slot *slotptr, char *l_name, int *idx)
  * into 'retdent'
  * Return 0 on success, -1 otherwise.
  */
-__u8    get_vfatname_block[MAX_CLUSTSIZE];
 static int
 get_vfatname(fsdata *mydata, int curclust, __u8 *cluster,
             dir_entry *retdent, char *l_name)
@@ -521,7 +555,6 @@ mkcksum(const char *str)
  * Get the directory entry associated with 'filename' from the directory
  * starting at 'startsect'
  */
-__u8 get_dentfromdir_block[MAX_CLUSTSIZE];
 static dir_entry *get_dentfromdir (fsdata * mydata, int startsect,
                                   char *filename, dir_entry * retdent,
                                   int dols)
@@ -727,7 +760,6 @@ read_bootsectandvi(boot_sector *bs, volume_info *volinfo, 
int *fatsize)
 }
 
 
-__u8 do_fat_read_block[MAX_CLUSTSIZE];  /* Block buffer */
 long
 do_fat_read (const char *filename, void *buffer, unsigned long maxsize,
             int dols)
-- 
1.5.4.1


-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to