[U-Boot] [PATCH v3] fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods

Pierre Aubert p.aubert at staubli.com
Mon Dec 1 16:52:03 CET 2014


Hi,

Tested on an iMX6 SabreSD board. Issue is fixed. There's just a warning
about  trailing whitespaces at line 75 of the patch.

Tested-by: Pierre Aubert <p.aubert at staubli.com>

Thanks
Pierre


Tom Rini wrote
> The changes to introduce loff_t into filesize means that we need to do
> 64bit math on 32bit platforms.  Make sure we use the right wrappers for
> these operations.
> 
> Cc: Daniel Schwierzeck <

> daniel.schwierzeck@

> >
> Cc: Suriyan Ramasami <

> suriyan.r@

> >
> Cc: Simon Glass <

> sjg@

> >
> Signed-off-by: Tom Rini <

> trini@

> >
> 
> ---
> Changes in v3:
> - Fix bug Simon pointed out in fs/fs.c
> 
> Changes in v2:
> - Correct fs/fat/fat_write.c
> ---
>  fs/ext4/ext4fs.c   |   11 ++++++-----
>  fs/fat/fat_write.c |   10 ++++++----
>  fs/fs.c            |    6 ++++--
>  3 files changed, 16 insertions(+), 11 deletions(-)
> 
> diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
> index 943b5bc..258b9379 100644
> --- a/fs/ext4/ext4fs.c
> +++ b/fs/ext4/ext4fs.c
> @@ -25,6 +25,7 @@
>  #include 
> <ext_common.h>
>  #include 
> <ext4fs.h>
>  #include "ext4_common.h"
> +#include 
> <div64.h>
>  
>  int ext4fs_symlinknest;
>  struct ext_filesystem ext_fs;
> @@ -67,11 +68,11 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t
> pos,
>  	if (len > filesize)
>  		len = filesize;
>  
> -	blockcnt = ((len + pos) + blocksize - 1) / blocksize;
> +	blockcnt = lldiv(((len + pos) + blocksize - 1), blocksize);
>  
> -	for (i = pos / blocksize; i < blockcnt; i++) {
> +	for (i = lldiv(pos, blocksize); i < blockcnt; i++) {
>  		lbaint_t blknr;
> -		int blockoff = pos % blocksize;
> +		int blockoff = pos - (blocksize * i);
>  		int blockend = blocksize;
>  		int skipfirst = 0;
>  		blknr = read_allocated_block(&(node->inode), i);
> @@ -82,7 +83,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t
> pos,
>  
>  		/* Last block.  */
>  		if (i == blockcnt - 1) {
> -			blockend = (len + pos) % blocksize;
> +			blockend = (len + pos) - (blocksize * i);
>  
>  			/* The last portion is exactly blocksize. */
>  			if (!blockend)
> @@ -90,7 +91,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t
> pos,
>  		}
>  
>  		/* First block. */
> -		if (i == pos / blocksize) {
> +		if (i == lldiv(pos, blocksize)) {
>  			skipfirst = blockoff;
>  			blockend -= skipfirst;
>  		}
> diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
> index 88dd495..473723b 100644
> --- a/fs/fat/fat_write.c
> +++ b/fs/fat/fat_write.c
> @@ -13,6 +13,8 @@
>  #include <asm/byteorder.h>
>  #include 
> <part.h>
>  #include <linux/ctype.h>
> +#include 
> <div64.h>
> +#include <linux/math64.h>
>  #include "fat.c"
>  
>  static void uppercase(char *str, int len)
> @@ -770,7 +772,7 @@ static void fill_dentry(fsdata *mydata, dir_entry
> *dentptr,
>   */
>  static int check_overflow(fsdata *mydata, __u32 clustnum, loff_t size)
>  {
> -	__u32 startsect, sect_num;
> +	__u32 startsect, sect_num, offset;
>  
>  	if (clustnum > 0) {
>  		startsect = mydata->data_begin +
> @@ -779,13 +781,13 @@ static int check_overflow(fsdata *mydata, __u32
> clustnum, loff_t size)
>  		startsect = mydata->rootdir_sect;
>  	}
>  
> -	sect_num = size / mydata->sect_size;
> -	if (size % mydata->sect_size)
> +	sect_num = div_u64_rem(size, mydata->sect_size, &offset);
> +	
> +	if (offset != 0)
>  		sect_num++;
>  
>  	if (startsect + sect_num > cur_part_info.start + total_sector)
>  		return -1;
> -
>  	return 0;
>  }
>  
> diff --git a/fs/fs.c b/fs/fs.c
> index 3da7860..ddd751c 100644
> --- a/fs/fs.c
> +++ b/fs/fs.c
> @@ -23,6 +23,8 @@
>  #include 
> <fs.h>
>  #include 
> <sandboxfs.h>
>  #include <asm/io.h>
> +#include 
> <div64.h>
> +#include <linux/math64.h>
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -399,7 +401,7 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char
> * const argv[],
>  	printf("%llu bytes read in %lu ms", len_read, time);
>  	if (time > 0) {
>  		puts(" (");
> -		print_size(len_read / time * 1000, "/s");
> +		print_size(div_u64(len_read, time) * 1000, "/s");
>  		puts(")");
>  	}
>  	puts("\n");
> @@ -469,7 +471,7 @@ int do_save(cmd_tbl_t *cmdtp, int flag, int argc, char
> * const argv[],
>  	printf("%llu bytes written in %lu ms", len, time);
>  	if (time > 0) {
>  		puts(" (");
> -		print_size(len / time * 1000, "/s");
> +		print_size(div_u64(len, time) * 1000, "/s");
>  		puts(")");
>  	}
>  	puts("\n");
> -- 
> 1.7.9.5
> 
> _______________________________________________
> U-Boot mailing list

> U-Boot at .denx

> http://lists.denx.de/mailman/listinfo/u-boot






--
View this message in context: http://u-boot.10912.n7.nabble.com/PATCH-v3-fs-ext4-ext4fs-c-fs-fs-c-fs-fat-fat-write-c-Adjust-64bit-math-methods-tp197647p197896.html
Sent from the U-Boot mailing list archive at Nabble.com.


More information about the U-Boot mailing list