fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods
Subsystems (3)
PATCH v3 1/1 fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods
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.
---
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(-)
fs/ext4/ext4fs.c +6 -5
@@ -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; }
fs/fat/fat_write.c +6 -4
@@ -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 ; }
fs/fs.c +4 -2
@@ -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" );
Signature · 1 line
1.7.9.5
PATCH v3 1/1 fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods
Quoted 8 lines · Tom Rini
The changes to introduce
loff_tinto 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 <[email protected]>Cc Suriyan Ramasami <[email protected]>Cc Simon Glass <[email protected]>Signed-off-by Tom Rini <[email protected]>
Quoted 131 lines
---
Changes in v3:
- Fix bug Simon pointed out infs/fs.cChanges in v2:
- Correctfs/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(-)fs/ext4/ext4fs.c +6
-5@@ -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; }fs/fat/fat_write.c +6
-4@@ -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 ; }fs/fs.c +4
-3@@ -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
PATCH v3 1/1 fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods
In reply to Tom RiniHi,
Tested on an iMX6 SabreSD board. Issue is fixed. There's just a warning about trailing whitespaces at line 75 of the patch.
Thanks
Pierre
Tom Rini wrote
Quoted 166 lines
The changes to introduce
loff_tinto 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 infs/fs.cChanges in v2:
- Correctfs/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(-)fs/ext4/ext4fs.c +0
-0@@ -25,6 +25,7 @@ #include<
ext_common.h>
#include
<ext4fs.h>
#include "ext4_common.h"
+#include
<div64.h>int
ext4fs_symlinknest;
structext_filesystemext_fs;fs/ext4/ext4fs.c +3
-3@@ -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 ;fs/ext4/ext4fs.c +1
-1blknr =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. */ fs/ext4/ext4fs.c +1
-1if (!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;fs/ext4/ext4fs.c +0
-0}fs/fat/fat_write.c +0
-0@@ -13,6 +13,8 @@ #include <asm/byteorder.h> #include<
part.h>
#include <linux/ctype.h>
+#include
<div64.h>fs/fat/fat_write.c +2
-1+#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 ) {fs/fat/fat_write.c +3
-3startsect = 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 ; }fs/fs.c +0
-0@@ -23,6 +23,8 @@ #include<
fs.h>
#include
<sandboxfs.h>
#include <asm/io.h>
+#include
<div64.h>fs/fs.c +2
-1+#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 (")" ); }fs/fs.c +1
-1puts ("\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 (")" ); }
Quoted 10 lines
puts("\n");Signature · 8 lines
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.
PATCH v3 1/1 fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods
In reply to Tom RiniQuoted 9 lines · Tom Rini
The changes to introduce
loff_tinto 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 <[email protected]>Cc Suriyan Ramasami <[email protected]>Cc Simon Glass <[email protected]>Signed-off-by Tom Rini <[email protected]>Tested-by Pierre Aubert <[email protected]>
With the whitespace problem fixed, applied to u-boot/master, thanks!
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141201/300b98d6/attachment.pgp>