]> git.sur5r.net Git - u-boot/blobdiff - fs/fat/fat.c
rockchip: dts: Enable SARADC for rk3399-evb
[u-boot] / fs / fat / fat.c
index 65873a2c2a86c8738d6157c93f3921e017b9b2c5..36a309c73c2713f73a8f7f4f873b6e0d7ae21d68 100644 (file)
@@ -257,8 +257,7 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
        int ret;
 
        if (clustnum > 0) {
-               startsect = mydata->data_begin +
-                               clustnum * mydata->clust_size;
+               startsect = clust_to_sect(mydata, clustnum);
        } else {
                startsect = mydata->rootdir_sect;
        }
@@ -594,9 +593,8 @@ static int get_fs_info(fsdata *mydata)
                mydata->data_begin = mydata->rootdir_sect +
                                        mydata->rootdir_size -
                                        (mydata->clust_size * 2);
-               mydata->root_cluster = (mydata->rootdir_sect -
-                                       mydata->data_begin) /
-                                       mydata->clust_size;
+               mydata->root_cluster =
+                       sect_to_clust(mydata, mydata->rootdir_sect);
        }
 
        mydata->fatbufnum = -1;
@@ -1036,23 +1034,27 @@ int file_fat_detectfs(void)
 int fat_exists(const char *filename)
 {
        fsdata fsdata;
-       fat_itr itrblock, *itr = &itrblock;
+       fat_itr *itr;
        int ret;
 
+       itr = malloc(sizeof(fat_itr));
        ret = fat_itr_root(itr, &fsdata);
        if (ret)
                return 0;
 
        ret = fat_itr_resolve(itr, filename, TYPE_ANY);
+       free(fsdata.fatbuf);
+       free(itr);
        return ret == 0;
 }
 
 int fat_size(const char *filename, loff_t *size)
 {
        fsdata fsdata;
-       fat_itr itrblock, *itr = &itrblock;
+       fat_itr *itr;
        int ret;
 
+       itr = malloc(sizeof(fat_itr));
        ret = fat_itr_root(itr, &fsdata);
        if (ret)
                return ret;
@@ -1063,36 +1065,45 @@ int fat_size(const char *filename, loff_t *size)
                 * Directories don't have size, but fs_size() is not
                 * expected to fail if passed a directory path:
                 */
+               free(fsdata.fatbuf);
                fat_itr_root(itr, &fsdata);
                if (!fat_itr_resolve(itr, filename, TYPE_DIR)) {
                        *size = 0;
-                       return 0;
+                       ret = 0;
                }
-               return ret;
+               goto out;
        }
 
        *size = FAT2CPU32(itr->dent->size);
-
-       return 0;
+       free(fsdata.fatbuf);
+out:
+       free(itr);
+       return ret;
 }
 
 int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
                     loff_t maxsize, loff_t *actread)
 {
        fsdata fsdata;
-       fat_itr itrblock, *itr = &itrblock;
+       fat_itr *itr;
        int ret;
 
+       itr = malloc(sizeof(fat_itr));
        ret = fat_itr_root(itr, &fsdata);
        if (ret)
                return ret;
 
        ret = fat_itr_resolve(itr, filename, TYPE_FILE);
        if (ret)
-               return ret;
+               goto out;
 
        printf("reading %s\n", filename);
-       return get_contents(&fsdata, itr->dent, pos, buffer, maxsize, actread);
+       ret = get_contents(&fsdata, itr->dent, pos, buffer, maxsize, actread);
+
+out:
+       free(fsdata.fatbuf);
+       free(itr);
+       return ret;
 }
 
 int file_fat_read(const char *filename, void *buffer, int maxsize)
@@ -1128,7 +1139,7 @@ typedef struct {
 
 int fat_opendir(const char *filename, struct fs_dir_stream **dirsp)
 {
-       fat_dir *dir = malloc(sizeof(*dir));
+       fat_dir *dir = calloc(1, sizeof(*dir));
        int ret;
 
        if (!dir)
@@ -1146,6 +1157,7 @@ int fat_opendir(const char *filename, struct fs_dir_stream **dirsp)
        return 0;
 
 fail:
+       free(dir->fsdata.fatbuf);
        free(dir);
        return ret;
 }
@@ -1176,6 +1188,7 @@ int fat_readdir(struct fs_dir_stream *dirs, struct fs_dirent **dentp)
 void fat_closedir(struct fs_dir_stream *dirs)
 {
        fat_dir *dir = (fat_dir *)dirs;
+       free(dir->fsdata.fatbuf);
        free(dir);
 }