[U-Boot] [PATCH v7 2/6] fat: prepare for API change for files greater than 2GB
Simon Glass
sjg at chromium.org
Wed Nov 12 01:27:00 CET 2014
Hi,
On 10 November 2014 13:17, Suriyan Ramasami <suriyan.r at gmail.com> wrote:
> Change the internal fat functions to use loff_t for offsets.
>
> Signed-off-by: Suriyan Ramasami <suriyan.r at gmail.com>
>
> ---
>
> Changes in v7:
> * Split it so that its bisectable.
A few bits below but with these fixed:
Acked-by: Simon Glass <sjg at chromium.org>
>
> common/cmd_fat.c | 9 ++--
> common/env_fat.c | 4 +-
> fs/fat/fat.c | 133 +++++++++++++++++++++++++++++++----------------------
> fs/fat/fat_write.c | 61 +++++++++++++-----------
> fs/fat/file.c | 4 +-
> include/fat.h | 13 +++---
> 6 files changed, 128 insertions(+), 96 deletions(-)
>
> diff --git a/common/cmd_fat.c b/common/cmd_fat.c
> index 633fbf1..c00fb28 100644
> --- a/common/cmd_fat.c
> +++ b/common/cmd_fat.c
> @@ -100,7 +100,8 @@ U_BOOT_CMD(
> static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
> int argc, char * const argv[])
> {
> - long size;
> + loff_t size;
> + int ret;
> unsigned long addr;
> unsigned long count;
> block_dev_desc_t *dev_desc = NULL;
> @@ -127,15 +128,15 @@ static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
> count = simple_strtoul(argv[5], NULL, 16);
>
> buf = map_sysmem(addr, count);
> - size = file_fat_write(argv[4], buf, count);
> + ret = file_fat_write(argv[4], buf, 0, count, &size);
> unmap_sysmem(buf);
> - if (size == -1) {
> + if (ret < 0) {
> printf("\n** Unable to write \"%s\" from %s %d:%d **\n",
> argv[4], argv[1], dev, part);
> return 1;
> }
>
> - printf("%ld bytes written\n", size);
> + printf("%llu bytes written\n", size);
>
> return 0;
> }
> diff --git a/common/env_fat.c b/common/env_fat.c
> index 8db0160..9a6ce63 100644
> --- a/common/env_fat.c
> +++ b/common/env_fat.c
> @@ -41,6 +41,7 @@ int saveenv(void)
> disk_partition_t info;
> int dev, part;
> int err;
> + loff_t size;
>
> err = env_export(&env_new);
> if (err)
> @@ -59,7 +60,8 @@ int saveenv(void)
> return 1;
> }
>
> - err = file_fat_write(FAT_ENV_FILE, (void *)&env_new, sizeof(env_t));
> + err = file_fat_write(FAT_ENV_FILE, (void *)&env_new, sizeof(env_t),
> + &size);
> if (err == -1) {
> printf("\n** Unable to write \"%s\" from %s%d:%d **\n",
> FAT_ENV_FILE, FAT_ENV_INTERFACE, dev, part);
> diff --git a/fs/fat/fat.c b/fs/fat/fat.c
> index 561921f..29d0825 100644
> --- a/fs/fat/fat.c
> +++ b/fs/fat/fat.c
> @@ -317,32 +317,33 @@ get_cluster(fsdata *mydata, __u32 clustnum, __u8 *buffer, unsigned long size)
> /*
> * Read at most 'maxsize' bytes from 'pos' in the file associated with 'dentptr'
> * into 'buffer'.
> - * Return the number of bytes read or -1 on fatal errors.
> + * Update the number of bytes read in *gotsize or return -1 on fatal errors.
> */
> __u8 get_contents_vfatname_block[MAX_CLUSTSIZE]
> __aligned(ARCH_DMA_MINALIGN);
>
> -static long
> -get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
> - __u8 *buffer, unsigned long maxsize)
> +static int
put this on the same line as the next
> +get_contents(fsdata *mydata, dir_entry *dentptr, loff_t pos,
> + __u8 *buffer, loff_t maxsize, loff_t *gotsize)
> {
> - unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
> + loff_t filesize = FAT2CPU32(dentptr->size);
> unsigned int bytesperclust = mydata->clust_size * mydata->sect_size;
> __u32 curclust = START(dentptr);
> __u32 endclust, newclust;
> - unsigned long actsize;
> + loff_t actsize;
>
> - debug("Filesize: %ld bytes\n", filesize);
> + *gotsize = 0;
> + debug("Filesize: %llu bytes\n", filesize);
>
> if (pos >= filesize) {
> - debug("Read position past EOF: %lu\n", pos);
> - return gotsize;
> + debug("Read position past EOF: %llu\n", pos);
> + return 0;
> }
>
> if (maxsize > 0 && filesize > pos + maxsize)
> filesize = pos + maxsize;
>
> - debug("%ld bytes\n", filesize);
> + debug("%llu bytes\n", filesize);
>
> actsize = bytesperclust;
>
> @@ -352,7 +353,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
> if (CHECK_CLUST(curclust, mydata->fatsize)) {
> debug("curclust: 0x%x\n", curclust);
> debug("Invalid FAT entry\n");
> - return gotsize;
> + return 0;
> }
> actsize += bytesperclust;
> }
> @@ -373,16 +374,16 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
> filesize -= actsize;
> actsize -= pos;
> memcpy(buffer, get_contents_vfatname_block + pos, actsize);
> - gotsize += actsize;
> + *gotsize += actsize;
> if (!filesize)
> - return gotsize;
> + return 0;
> buffer += actsize;
>
> curclust = get_fatent(mydata, curclust);
> if (CHECK_CLUST(curclust, mydata->fatsize)) {
> debug("curclust: 0x%x\n", curclust);
> debug("Invalid FAT entry\n");
> - return gotsize;
> + return 0;
> }
> }
>
> @@ -398,7 +399,7 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
> if (CHECK_CLUST(newclust, mydata->fatsize)) {
> debug("curclust: 0x%x\n", newclust);
> debug("Invalid FAT entry\n");
> - return gotsize;
> + return 0;
> }
> endclust = newclust;
> actsize += bytesperclust;
> @@ -410,14 +411,14 @@ get_contents(fsdata *mydata, dir_entry *dentptr, unsigned long pos,
> printf("Error reading cluster\n");
> return -1;
> }
> - gotsize += actsize;
> - return gotsize;
> + *gotsize += actsize;
> + return 0;
> getit:
> if (get_cluster(mydata, curclust, buffer, (int)actsize) != 0) {
> printf("Error reading cluster\n");
> return -1;
> }
> - gotsize += (int)actsize;
> + *gotsize += (int)actsize;
> filesize -= actsize;
> buffer += actsize;
>
> @@ -425,7 +426,7 @@ getit:
> if (CHECK_CLUST(curclust, mydata->fatsize)) {
> debug("curclust: 0x%x\n", curclust);
> printf("Invalid FAT entry\n");
> - return gotsize;
> + return 0;
> }
> actsize = bytesperclust;
> endclust = curclust;
> @@ -633,8 +634,8 @@ static dir_entry *get_dentfromdir(fsdata *mydata, int startsect,
> }
> if (doit) {
> if (dirc == ' ') {
> - printf(" %8ld %s%c\n",
> - (long)FAT2CPU32(dentptr->size),
> + printf(" %8u %s%c\n",
> + FAT2CPU32(dentptr->size),
> l_name,
> dirc);
> } else {
> @@ -690,8 +691,8 @@ static dir_entry *get_dentfromdir(fsdata *mydata, int startsect,
>
> if (doit) {
> if (dirc == ' ') {
> - printf(" %8ld %s%c\n",
> - (long)FAT2CPU32(dentptr->size),
> + printf(" %8u %s%c\n",
> + FAT2CPU32(dentptr->size),
> s_name, dirc);
> } else {
> printf(" %s%c\n",
> @@ -806,9 +807,8 @@ exit:
> __u8 do_fat_read_at_block[MAX_CLUSTSIZE]
> __aligned(ARCH_DMA_MINALIGN);
>
> -long
> -do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
> - unsigned long maxsize, int dols, int dogetsize)
> +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];
> boot_sector bs;
> @@ -821,7 +821,7 @@ do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
> __u32 cursect;
> int idx, isdir = 0;
> int files = 0, dirs = 0;
> - long ret = -1;
> + int ret = -1;
> int firsttime;
> __u32 root_cluster = 0;
> int rootdir_size = 0;
> @@ -974,8 +974,8 @@ do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
> }
> if (doit) {
> if (dirc == ' ') {
> - printf(" %8ld %s%c\n",
> - (long)FAT2CPU32(dentptr->size),
> + printf(" %8u %s%c\n",
> + FAT2CPU32(dentptr->size),
> l_name,
> dirc);
> } else {
> @@ -1032,8 +1032,8 @@ do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
> }
> if (doit) {
> if (dirc == ' ') {
> - printf(" %8ld %s%c\n",
> - (long)FAT2CPU32(dentptr->size),
> + printf(" %8u %s%c\n",
> + FAT2CPU32(dentptr->size),
> s_name, dirc);
> } else {
> printf(" %s%c\n",
> @@ -1102,7 +1102,7 @@ do_fat_read_at(const char *filename, unsigned long pos, void *buffer,
> if (dols == LS_ROOT) {
> printf("\n%d file(s), %d dir(s)\n\n",
> files, dirs);
> - ret = 0;
> + *size = 0;
> }
> goto exit;
> }
> @@ -1141,7 +1141,7 @@ rootdir_done:
> if (get_dentfromdir(mydata, startsect, subname, dentptr,
> isdir ? 0 : dols) == NULL) {
> if (dols && !isdir)
> - ret = 0;
> + *size = 0;
> goto exit;
> }
>
> @@ -1152,21 +1152,23 @@ rootdir_done:
> subname = nextname;
> }
>
> - if (dogetsize)
> - ret = FAT2CPU32(dentptr->size);
> - else
> - ret = get_contents(mydata, dentptr, pos, buffer, maxsize);
> - debug("Size: %d, got: %ld\n", FAT2CPU32(dentptr->size), ret);
> + if (dogetsize) {
> + *size = FAT2CPU32(dentptr->size);
> + ret = 0;
> + } else {
> + ret = get_contents(mydata, dentptr, pos, buffer, maxsize, size);
> + }
> + debug("Size: %u, got: %llu\n", FAT2CPU32(dentptr->size), *size);
>
> exit:
> free(mydata->fatbuf);
> return ret;
> }
>
> -long
> -do_fat_read(const char *filename, void *buffer, unsigned long maxsize, int dols)
> +int do_fat_read(const char *filename, void *buffer, loff_t maxsize, int dols,
> + loff_t *actread)
> {
> - return do_fat_read_at(filename, 0, buffer, maxsize, dols, 0);
> + return do_fat_read_at(filename, 0, buffer, maxsize, dols, 0, actread);
> }
>
> int file_fat_detectfs(void)
> @@ -1233,44 +1235,63 @@ int file_fat_detectfs(void)
>
> int file_fat_ls(const char *dir)
> {
> - return do_fat_read(dir, NULL, 0, LS_YES);
> + loff_t size;
> +
> + return do_fat_read(dir, NULL, 0, LS_YES, &size);
> }
>
> int fat_exists(const char *filename)
> {
> - int sz;
> - sz = do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1);
> - return sz >= 0;
> + int ret;
> + loff_t size;
blank line here
> + ret = do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1, &size);
> + return ret == 0;
> }
>
> int fat_size(const char *filename)
> {
> - return do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1);
> +loff_t size;
> +int ret;
indent those two lines
> +
> + ret = do_fat_read_at(filename, 0, NULL, 0, LS_NO, 1, &size);
> + if (ret)
> + return ret;
> + else
> + return size;
> }
>
> -long file_fat_read_at(const char *filename, unsigned long pos, void *buffer,
> - unsigned long maxsize)
> +int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
> + loff_t maxsize, loff_t *actread)
> {
> printf("reading %s\n", filename);
> - return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO, 0);
> + return do_fat_read_at(filename, pos, buffer, maxsize, LS_NO, 0,
> + actread);
> }
>
> -long file_fat_read(const char *filename, void *buffer, unsigned long maxsize)
> +int file_fat_read(const char *filename, void *buffer, int maxsize)
> {
> - return file_fat_read_at(filename, 0, buffer, maxsize);
> +loff_t actread;
> +int ret;
indent those two lines
> +
> + ret = file_fat_read_at(filename, 0, buffer, maxsize, &actread);
> + if (ret)
> + return ret;
> + else
> + return actread;
> }
>
> int fat_read_file(const char *filename, void *buf, int offset, int len)
> {
> - int len_read;
> + int ret;
> + loff_t actread;
>
> - len_read = file_fat_read_at(filename, offset, buf, len);
> - if (len_read == -1) {
> + ret = file_fat_read_at(filename, offset, buf, len, &actread);
> + if (ret) {
> printf("** Unable to read file %s **\n", filename);
> - return -1;
> + return ret;
> }
>
> - return len_read;
> + return actread;
> }
>
> void fat_close(void)
> diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
> index 24ed5d3..88dd495 100644
> --- a/fs/fat/fat_write.c
> +++ b/fs/fat/fat_write.c
> @@ -660,24 +660,26 @@ static int clear_fatent(fsdata *mydata, __u32 entry)
> /*
> * Write at most 'maxsize' bytes from 'buffer' into
> * the file associated with 'dentptr'
> - * Return the number of bytes read or -1 on fatal errors.
> + * Update the number of bytes written in *gotsize and return 0
> + * or return -1 on fatal errors.
> */
> static int
> set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
> - unsigned long maxsize)
> + loff_t maxsize, loff_t *gotsize)
> {
> - unsigned long filesize = FAT2CPU32(dentptr->size), gotsize = 0;
> + loff_t filesize = FAT2CPU32(dentptr->size);
> unsigned int bytesperclust = mydata->clust_size * mydata->sect_size;
> __u32 curclust = START(dentptr);
> __u32 endclust = 0, newclust = 0;
> - unsigned long actsize;
> + loff_t actsize;
>
> - debug("Filesize: %ld bytes\n", filesize);
> + *gotsize = 0;
> + debug("Filesize: %llu bytes\n", filesize);
>
> if (maxsize > 0 && filesize > maxsize)
> filesize = maxsize;
>
> - debug("%ld bytes\n", filesize);
> + debug("%llu bytes\n", filesize);
>
> actsize = bytesperclust;
> endclust = curclust;
> @@ -692,7 +694,7 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
> if (CHECK_CLUST(newclust, mydata->fatsize)) {
> debug("curclust: 0x%x\n", newclust);
> debug("Invalid FAT entry\n");
> - return gotsize;
> + return 0;
> }
> endclust = newclust;
> actsize += bytesperclust;
> @@ -706,7 +708,7 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
> }
>
> /* set remaining bytes */
> - gotsize += (int)actsize;
> + *gotsize += actsize;
> filesize -= actsize;
> buffer += actsize;
> actsize = filesize;
> @@ -715,7 +717,7 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
> debug("error: writing cluster\n");
> return -1;
> }
> - gotsize += actsize;
> + *gotsize += actsize;
>
> /* Mark end of file in FAT */
> if (mydata->fatsize == 16)
> @@ -724,20 +726,20 @@ set_contents(fsdata *mydata, dir_entry *dentptr, __u8 *buffer,
> newclust = 0xfffffff;
> set_fatent_value(mydata, endclust, newclust);
>
> - return gotsize;
> + return 0;
> getit:
> if (set_cluster(mydata, curclust, buffer, (int)actsize) != 0) {
> debug("error: writing cluster\n");
> return -1;
> }
> - gotsize += (int)actsize;
> + *gotsize += actsize;
> filesize -= actsize;
> buffer += actsize;
>
> if (CHECK_CLUST(curclust, mydata->fatsize)) {
> debug("curclust: 0x%x\n", curclust);
> debug("Invalid FAT entry\n");
> - return gotsize;
> + return 0;
> }
> actsize = bytesperclust;
> curclust = endclust = newclust;
> @@ -766,7 +768,7 @@ static void fill_dentry(fsdata *mydata, dir_entry *dentptr,
> * exceed the size of the block device
> * Return -1 when overflow occurs, otherwise return 0
> */
> -static int check_overflow(fsdata *mydata, __u32 clustnum, unsigned long size)
> +static int check_overflow(fsdata *mydata, __u32 clustnum, loff_t size)
> {
> __u32 startsect, sect_num;
>
> @@ -923,8 +925,8 @@ static dir_entry *find_directory_entry(fsdata *mydata, int startsect,
> return NULL;
> }
>
> -static int do_fat_write(const char *filename, void *buffer,
> - unsigned long size)
> +static int do_fat_write(const char *filename, void *buffer, loff_t size,
> + loff_t *actwrite)
> {
> dir_entry *dentptr, *retdent;
> __u32 startsect;
> @@ -936,8 +938,8 @@ static int do_fat_write(const char *filename, void *buffer,
> int cursect;
> int ret = -1, name_len;
> char l_filename[VFAT_MAXLEN_BYTES];
> - int write_size = size;
>
> + *actwrite = size;
> dir_curclust = 0;
>
> if (read_bootsectandvi(&bs, &volinfo, &mydata->fatsize)) {
> @@ -1015,7 +1017,7 @@ static int do_fat_write(const char *filename, void *buffer,
>
> ret = check_overflow(mydata, start_cluster, size);
> if (ret) {
> - printf("Error: %ld overflow\n", size);
> + printf("Error: %llu overflow\n", size);
> goto exit;
> }
>
> @@ -1025,13 +1027,12 @@ static int do_fat_write(const char *filename, void *buffer,
> goto exit;
> }
>
> - ret = set_contents(mydata, retdent, buffer, size);
> + ret = set_contents(mydata, retdent, buffer, size, actwrite);
> if (ret < 0) {
> printf("Error: writing contents\n");
> goto exit;
> }
> - write_size = ret;
> - debug("attempt to write 0x%x bytes\n", write_size);
> + debug("attempt to write 0x%llx bytes\n", *actwrite);
>
> /* Flush fat buffer */
> ret = flush_fat_buffer(mydata);
> @@ -1061,7 +1062,7 @@ static int do_fat_write(const char *filename, void *buffer,
>
> ret = check_overflow(mydata, start_cluster, size);
> if (ret) {
> - printf("Error: %ld overflow\n", size);
> + printf("Error: %llu overflow\n", size);
> goto exit;
> }
>
> @@ -1069,13 +1070,13 @@ static int do_fat_write(const char *filename, void *buffer,
> fill_dentry(mydata, empty_dentptr, filename,
> start_cluster, size, 0x20);
>
> - ret = set_contents(mydata, empty_dentptr, buffer, size);
> + ret = set_contents(mydata, empty_dentptr, buffer, size,
> + actwrite);
> if (ret < 0) {
> printf("Error: writing contents\n");
> goto exit;
> }
> - write_size = ret;
> - debug("attempt to write 0x%x bytes\n", write_size);
> + debug("attempt to write 0x%llx bytes\n", *actwrite);
>
> /* Flush fat buffer */
> ret = flush_fat_buffer(mydata);
> @@ -1096,11 +1097,17 @@ static int do_fat_write(const char *filename, void *buffer,
>
> exit:
> free(mydata->fatbuf);
> - return ret < 0 ? ret : write_size;
> + return ret;
> }
>
> -int file_fat_write(const char *filename, void *buffer, unsigned long maxsize)
> +int file_fat_write(const char *filename, void *buffer, loff_t offset,
> + loff_t maxsize, loff_t *actwrite)
> {
> + if (offset != 0) {
> + printf("Error: non zero offset is currently not suported.\n");
> + return -1;
> + }
> +
> printf("writing %s\n", filename);
> - return do_fat_write(filename, buffer, maxsize);
> + return do_fat_write(filename, buffer, maxsize, actwrite);
> }
> diff --git a/fs/fat/file.c b/fs/fat/file.c
> index d910c46..98559f2 100644
> --- a/fs/fat/file.c
> +++ b/fs/fat/file.c
> @@ -162,8 +162,8 @@ file_ls(const char *dir)
> return filesystems[current_filesystem].ls(arg);
> }
>
> -long
> -file_read(const char *filename, void *buffer, unsigned long maxsize)
> +int
put on next line
> +file_read(const char *filename, void *buffer, int maxsize)
> {
> char fullpath[1024];
> const char *arg;
> diff --git a/include/fat.h b/include/fat.h
> index 20ca3f3..99c6429 100644
> --- a/include/fat.h
> +++ b/include/fat.h
> @@ -178,8 +178,8 @@ typedef struct {
>
> typedef int (file_detectfs_func)(void);
> typedef int (file_ls_func)(const char *dir);
> -typedef long (file_read_func)(const char *filename, void *buffer,
> - unsigned long maxsize);
> +typedef int (file_read_func)(const char *filename, void *buffer,
> + int maxsize);
>
> struct filesystem {
> file_detectfs_func *detect;
> @@ -199,14 +199,15 @@ int file_fat_detectfs(void);
> int file_fat_ls(const char *dir);
> int fat_exists(const char *filename);
> int fat_size(const char *filename);
> -long file_fat_read_at(const char *filename, unsigned long pos, void *buffer,
> - unsigned long maxsize);
> -long file_fat_read(const char *filename, void *buffer, unsigned long maxsize);
> +int file_fat_read_at(const char *filename, loff_t pos, void *buffer,
> + loff_t maxsize, loff_t *actread);
> +int file_fat_read(const char *filename, void *buffer, int maxsize);
> const char *file_getfsname(int idx);
> int fat_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
> int fat_register_device(block_dev_desc_t *dev_desc, int part_no);
>
> -int file_fat_write(const char *filename, void *buffer, unsigned long maxsize);
> +int file_fat_write(const char *filename, void *buf, loff_t offset, loff_t len,
> + loff_t *actwrite);
> int fat_read_file(const char *filename, void *buf, int offset, int len);
> void fat_close(void);
> #endif /* _FAT_H_ */
> --
> 1.9.1
>
Regards,
Simon
More information about the U-Boot
mailing list