Skip to contentSkip to conversation

fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods

PATCH Superseded Tom Rini 3 participants 4 messages Nov 26, 2014 – Dec 1, 2014

Subsystems (3)
lore
Share & tools
lore

Tom Rini

author
#0 lore raw

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.

Cc Daniel Schwierzeck <[email protected]>
Cc Suriyan Ramasami <[email protected]>
Cc Simon Glass <[email protected]>

---
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
index 943b5bc..258b9379 100644
@@ -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
index 88dd495..473723b 100644
@@ -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
index 3da7860..ddd751c 100644
@@ -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
#1 lore raw

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_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 <[email protected]>
Cc Suriyan Ramasami <[email protected]>
Cc Simon Glass <[email protected]>
Quoted 131 lines

---
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
index 943b5bc..258b9379 100644
@@ -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
index 88dd495..473723b 100644
@@ -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
index 3da7860..ddd751c 100644
@@ -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

#2 lore raw

PATCH v3 1/1 fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods

In reply to Tom Rini

Hi,

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_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 &lt;

daniel.schwierzeck@

&gt;
Cc: Suriyan Ramasami &lt;

suriyan.r@

&gt;
Cc: Simon Glass &lt;

sjg@

&gt;
Signed-off-by: Tom Rini &lt;

trini@

&gt;

---
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 +0 -0
index 943b5bc..258b9379 100644
@@ -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;

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 -1
 		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. */
fs/ext4/ext4fs.c +1 -1
 			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/ext4/ext4fs.c +0 -0
 		}
fs/fat/fat_write.c +0 -0
index 88dd495..473723b 100644
@@ -13,6 +13,8 @@
 #include &lt;asm/byteorder.h&gt;
 #include 

<part.h>
#include &lt;linux/ctype.h&gt;
+#include
<div64.h>

fs/fat/fat_write.c +2 -1
+#include &lt;linux/math64.h&gt;
 #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 -3
 		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 +0 -0
index 3da7860..ddd751c 100644
@@ -23,6 +23,8 @@
 #include 

<fs.h>
#include
<sandboxfs.h>
#include &lt;asm/io.h&gt;
+#include
<div64.h>

fs/fs.c +2 -1
+#include &lt;linux/math64.h&gt;
 
 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 -1
 	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(")");
 	}
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.

author
#3 lore raw

PATCH v3 1/1 fs/ext4/ext4fs.c, fs/fs.c fs/fat/fat_write.c: Adjust 64bit math methods

In reply to Tom Rini
Quoted 9 lines · Tom Rini

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 <[email protected]>
Cc Suriyan Ramasami <[email protected]>
Cc Simon Glass <[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>