On Sat, Aug 11, 2018 at 03:34:20PM +0200, Heinrich Schuchardt wrote: > On 07/20/2018 04:57 AM, AKASHI Takahiro wrote: > > Directory iterator was introduced in major re-work of read operation by > > Rob. We want to use it for write operation extensively as well. > > This patch makes relevant functions, as well as iterator defition, visible > > outside of fat.c. > > > > Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org> > > --- > > fs/fat/fat.c | 39 ++++++--------------------------------- > > include/fat.h | 32 ++++++++++++++++++++++++++++++++ > > 2 files changed, 38 insertions(+), 33 deletions(-) > > > > diff --git a/fs/fat/fat.c b/fs/fat/fat.c > > index fd6523c66b..0f82cbe1bd 100644 > > --- a/fs/fat/fat.c > > +++ b/fs/fat/fat.c > > @@ -634,25 +634,6 @@ static int get_fs_info(fsdata *mydata) > > * For more complete example, see fat_itr_resolve() > > */ > > > > -typedef struct { > > - fsdata *fsdata; /* filesystem parameters */ > > - unsigned clust; /* current cluster */ > > - int last_cluster; /* set once we've read last cluster */ > > - int is_root; /* is iterator at root directory */ > > - int remaining; /* remaining dent's in current cluster */ > > - > > - /* current iterator position values: */ > > - dir_entry *dent; /* current directory entry */ > > - char l_name[VFAT_MAXLEN_BYTES]; /* long (vfat) name */ > > - char s_name[14]; /* short 8.3 name */ > > - char *name; /* l_name if there is one, else s_name */ > > - > > - /* storage for current cluster in memory: */ > > - u8 block[MAX_CLUSTSIZE] __aligned(ARCH_DMA_MINALIGN); > > -} fat_itr; > > - > > -static int fat_itr_isdir(fat_itr *itr); > > - > > /** > > * fat_itr_root() - initialize an iterator to start at the root > > * directory > > @@ -661,7 +642,7 @@ static int fat_itr_isdir(fat_itr *itr); > > * @fsdata: filesystem data for the partition > > * @return 0 on success, else -errno > > */ > > -static int fat_itr_root(fat_itr *itr, fsdata *fsdata) > > +int fat_itr_root(fat_itr *itr, fsdata *fsdata) > > { > > if (get_fs_info(fsdata)) > > return -ENXIO; > > @@ -693,7 +674,7 @@ static int fat_itr_root(fat_itr *itr, fsdata *fsdata) > > * @parent: the iterator pointing at a directory entry in the > > * parent directory of the directory to iterate > > */ > > -static void fat_itr_child(fat_itr *itr, fat_itr *parent) > > +void fat_itr_child(fat_itr *itr, fat_itr *parent) > > { > > fsdata *mydata = parent->fsdata; /* for silly macros */ > > unsigned clustnum = START(parent->dent); > > @@ -713,7 +694,7 @@ static void fat_itr_child(fat_itr *itr, fat_itr *parent) > > itr->last_cluster = 0; > > } > > > > -static void *next_cluster(fat_itr *itr) > > +void *next_cluster(fat_itr *itr) > > { > > fsdata *mydata = itr->fsdata; /* for silly macros */ > > int ret; > > @@ -834,7 +815,7 @@ static dir_entry *extract_vfat_name(fat_itr *itr) > > * @return boolean, 1 if success or 0 if no more entries in the > > * current directory > > */ > > -static int fat_itr_next(fat_itr *itr) > > +int fat_itr_next(fat_itr *itr) > > { > > dir_entry *dent; > > > > @@ -879,19 +860,11 @@ static int fat_itr_next(fat_itr *itr) > > * @itr: the iterator > > * @return true if cursor is at a directory > > */ > > -static int fat_itr_isdir(fat_itr *itr) > > +int fat_itr_isdir(fat_itr *itr) > > { > > return !!(itr->dent->attr & ATTR_DIR); > > } > > > > -/* > > - * Helpers: > > - */ > > - > > -#define TYPE_FILE 0x1 > > -#define TYPE_DIR 0x2 > > -#define TYPE_ANY (TYPE_FILE | TYPE_DIR) > > - > > /** > > * fat_itr_resolve() - traverse directory structure to resolve the > > * requested path. > > @@ -907,7 +880,7 @@ static int fat_itr_isdir(fat_itr *itr) > > * @type: bitmask of allowable file types > > * @return 0 on success or -errno > > */ > > -static int fat_itr_resolve(fat_itr *itr, const char *path, unsigned type) > > +int fat_itr_resolve(fat_itr *itr, const char *path, unsigned type) > > { > > const char *next; > > > > diff --git a/include/fat.h b/include/fat.h > > index 0c88b59a4a..577e6b4592 100644 > > --- a/include/fat.h > > +++ b/include/fat.h > > @@ -187,6 +187,38 @@ static inline u32 sect_to_clust(fsdata *fsdata, int > > sect) > > return (sect - fsdata->data_begin) / fsdata->clust_size; > > } > > > > +/* > > + * Directory iterator > > + */ > > + > > +#define TYPE_FILE 0x1 > > +#define TYPE_DIR 0x2 > > +#define TYPE_ANY (TYPE_FILE | TYPE_DIR) > > + > > +typedef struct { > > + fsdata *fsdata; /* filesystem parameters */ > > + unsigned clust; /* current cluster */ > > + int last_cluster; /* set once we've read last cluster */ > > + int is_root; /* is iterator at root directory */ > > + int remaining; /* remaining dent's in current cluster */ > > + > > + /* current iterator position values: */ > > + dir_entry *dent; /* current directory entry */ > > + char l_name[VFAT_MAXLEN_BYTES]; /* long (vfat) name */ > > + char s_name[14]; /* short 8.3 name */ > > + char *name; /* l_name if there is one, else s_name */ > > + > > + /* storage for current cluster in memory: */ > > + u8 block[MAX_CLUSTSIZE] __aligned(ARCH_DMA_MINALIGN); > > If CONFIG_FAT is not set, MAX_CLUSTSIZE is empty. And you get a build error: > > CC fs/fs.o > In file included from fs/fs.c:12:0: > include/fat.h:20:23: error: ‘CONFIG_FS_FAT_MAX_CLUSTSIZE’ undeclared > here (not in a function); did you mean ‘CONFIG_SYS_MAX_FLASH_SECT’? > #define MAX_CLUSTSIZE CONFIG_FS_FAT_MAX_CLUSTSIZE > ^ > include/fat.h:214:19: note: in expansion of macro ‘MAX_CLUSTSIZE’ > u8 block[MAX_CLUSTSIZE] __aligned(ARCH_DMA_MINALIGN); > ^~~~~~~~~~~~~ > make[1]: *** [scripts/Makefile.build:279: fs/fs.o] Error 1
Thank you for catching this. > We should not assume that every board uses FAT. The contents of include/fat.h is totally private to fat implementation. So I'd like to guard this include file like: #ifndef _FAT_H #define _FAT_H #ifdef CONFIG_FS_FAT <fat definitions>... #endif /* CONFIG_FS_FAT */ #endif /* _FAT_H */ -Takahiro AKASHI > Best regards > > Heinrich > > > +} fat_itr; > > + > > +int fat_itr_root(fat_itr *itr, fsdata *fsdata); > > +void fat_itr_child(fat_itr *itr, fat_itr *parent); > > +void *next_cluster(fat_itr *itr); > > +int fat_itr_next(fat_itr *itr); > > +int fat_itr_isdir(fat_itr *itr); > > +int fat_itr_resolve(fat_itr *itr, const char *path, unsigned type); > > + > > int file_fat_detectfs(void); > > int fat_exists(const char *filename); > > int fat_size(const char *filename, loff_t *size); > > > _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot