fs/fat: split out helper to init fsdata
authorRob Clark <robdclark@gmail.com>
Sat, 9 Sep 2017 17:15:52 +0000 (13:15 -0400)
committerTom Rini <trini@konsulko.com>
Fri, 15 Sep 2017 13:03:09 +0000 (09:03 -0400)
Want to re-use this in fat dirent iterator in next patch.

Signed-off-by: Rob Clark <robdclark@gmail.com>
Reviewed-by: Ɓukasz Majewski <lukma@denx.de>
Reviewed-by: Simon Glass <sjg@chromium.org>
fs/fat/fat.c
include/fat.h

index 465a6875edf509a17054adeefa6af73985543bdc..e1c0a15dc73f50160d086d270e66e9b5bcd5fbb9 100644 (file)
@@ -808,35 +808,17 @@ exit:
        return ret;
 }
 
-__u8 do_fat_read_at_block[MAX_CLUSTSIZE]
-       __aligned(ARCH_DMA_MINALIGN);
-
-int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
-                  loff_t maxsize, int dols, int dogetsize, loff_t *size)
+static int get_fs_info(fsdata *mydata)
 {
-       char fnamecopy[2048];
        boot_sector bs;
        volume_info volinfo;
-       fsdata datablock;
-       fsdata *mydata = &datablock;
-       dir_entry *dentptr = NULL;
-       __u16 prevcksum = 0xffff;
-       char *subname = "";
-       __u32 cursect;
-       int idx, isdir = 0;
-       int files = 0, dirs = 0;
-       int ret = -1;
-       int firsttime;
        __u32 root_cluster = 0;
-       __u32 read_blk;
-       int rootdir_size = 0;
-       int buffer_blk_cnt;
-       int do_read;
-       __u8 *dir_ptr;
+       int ret;
 
-       if (read_bootsectandvi(&bs, &volinfo, &mydata->fatsize)) {
+       ret = read_bootsectandvi(&bs, &volinfo, &mydata->fatsize);
+       if (ret) {
                debug("Error: reading boot sector\n");
-               return -1;
+               return ret;
        }
 
        if (mydata->fatsize == 32) {
@@ -848,8 +830,7 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
 
        mydata->fat_sect = bs.reserved;
 
-       cursect = mydata->rootdir_sect
-               = mydata->fat_sect + mydata->fatlength * bs.fats;
+       mydata->rootdir_sect = mydata->fat_sect + mydata->fatlength * bs.fats;
 
        mydata->sect_size = (bs.sector_size[1] << 8) + bs.sector_size[0];
        mydata->clust_size = bs.cluster_size;
@@ -863,12 +844,12 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
                mydata->data_begin = mydata->rootdir_sect -
                                        (mydata->clust_size * 2);
        } else {
-               rootdir_size = ((bs.dir_entries[1]  * (int)256 +
-                                bs.dir_entries[0]) *
-                                sizeof(dir_entry)) /
-                                mydata->sect_size;
+               mydata->rootdir_size = ((bs.dir_entries[1]  * (int)256 +
+                                        bs.dir_entries[0]) *
+                                        sizeof(dir_entry)) /
+                                        mydata->sect_size;
                mydata->data_begin = mydata->rootdir_sect +
-                                       rootdir_size -
+                                       mydata->rootdir_size -
                                        (mydata->clust_size * 2);
        }
 
@@ -893,6 +874,38 @@ int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
        debug("Sector size: %d, cluster size: %d\n", mydata->sect_size,
              mydata->clust_size);
 
+       return 0;
+}
+
+__u8 do_fat_read_at_block[MAX_CLUSTSIZE]
+       __aligned(ARCH_DMA_MINALIGN);
+
+int do_fat_read_at(const char *filename, loff_t pos, void *buffer,
+                  loff_t maxsize, int dols, int dogetsize, loff_t *size)
+{
+       char fnamecopy[2048];
+       fsdata datablock;
+       fsdata *mydata = &datablock;
+       dir_entry *dentptr = NULL;
+       __u16 prevcksum = 0xffff;
+       char *subname = "";
+       __u32 cursect;
+       int idx, isdir = 0;
+       int files = 0, dirs = 0;
+       int ret = -1;
+       int firsttime;
+       __u32 root_cluster = 0;
+       __u32 read_blk;
+       int rootdir_size = 0;
+       int buffer_blk_cnt;
+       int do_read;
+       __u8 *dir_ptr;
+
+       if (get_fs_info(mydata))
+               return -1;
+
+       cursect = mydata->rootdir_sect;
+
        /* "cwd" is always the root... */
        while (ISDIRDELIM(*filename))
                filename++;
index 71879f01cac159ece96d87418069869099375fc5..b671ee8f81ba1831bece4ef682015ad4d989f95d 100644 (file)
@@ -174,6 +174,7 @@ typedef struct {
        __u16   clust_size;     /* Size of clusters in sectors */
        int     data_begin;     /* The sector of the first cluster, can be negative */
        int     fatbufnum;      /* Used by get_fatent, init to -1 */
+       int     rootdir_size;   /* Size of root dir for non-FAT32 */
 } fsdata;
 
 typedef int    (file_detectfs_func)(void);