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 <daniel.schwierzeck@gmail.com>
Cc: Suriyan Ramasami <suriyan.r@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Tom Rini <trini@ti.com>
Tested-by: Pierre Aubert <p.aubert@staubli.com>
master
Tom Rini 10 years ago
parent e17e998d7f
commit 9e374e7b72
  1. 11
      fs/ext4/ext4fs.c
  2. 10
      fs/fat/fat_write.c
  3. 6
      fs/fs.c

@ -25,6 +25,7 @@
#include <ext_common.h> #include <ext_common.h>
#include <ext4fs.h> #include <ext4fs.h>
#include "ext4_common.h" #include "ext4_common.h"
#include <div64.h>
int ext4fs_symlinknest; int ext4fs_symlinknest;
struct ext_filesystem ext_fs; struct ext_filesystem ext_fs;
@ -67,11 +68,11 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
if (len > filesize) if (len > filesize)
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; lbaint_t blknr;
int blockoff = pos % blocksize; int blockoff = pos - (blocksize * i);
int blockend = blocksize; int blockend = blocksize;
int skipfirst = 0; int skipfirst = 0;
blknr = read_allocated_block(&(node->inode), i); blknr = read_allocated_block(&(node->inode), i);
@ -82,7 +83,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
/* Last block. */ /* Last block. */
if (i == blockcnt - 1) { if (i == blockcnt - 1) {
blockend = (len + pos) % blocksize; blockend = (len + pos) - (blocksize * i);
/* The last portion is exactly blocksize. */ /* The last portion is exactly blocksize. */
if (!blockend) if (!blockend)
@ -90,7 +91,7 @@ int ext4fs_read_file(struct ext2fs_node *node, loff_t pos,
} }
/* First block. */ /* First block. */
if (i == pos / blocksize) { if (i == lldiv(pos, blocksize)) {
skipfirst = blockoff; skipfirst = blockoff;
blockend -= skipfirst; blockend -= skipfirst;
} }

@ -13,6 +13,8 @@
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <part.h> #include <part.h>
#include <linux/ctype.h> #include <linux/ctype.h>
#include <div64.h>
#include <linux/math64.h>
#include "fat.c" #include "fat.c"
static void uppercase(char *str, int len) 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) static int check_overflow(fsdata *mydata, __u32 clustnum, loff_t size)
{ {
__u32 startsect, sect_num; __u32 startsect, sect_num, offset;
if (clustnum > 0) { if (clustnum > 0) {
startsect = mydata->data_begin + startsect = mydata->data_begin +
@ -779,13 +781,13 @@ static int check_overflow(fsdata *mydata, __u32 clustnum, loff_t size)
startsect = mydata->rootdir_sect; startsect = mydata->rootdir_sect;
} }
sect_num = size / mydata->sect_size; sect_num = div_u64_rem(size, mydata->sect_size, &offset);
if (size % mydata->sect_size)
if (offset != 0)
sect_num++; sect_num++;
if (startsect + sect_num > cur_part_info.start + total_sector) if (startsect + sect_num > cur_part_info.start + total_sector)
return -1; return -1;
return 0; return 0;
} }

@ -23,6 +23,8 @@
#include <fs.h> #include <fs.h>
#include <sandboxfs.h> #include <sandboxfs.h>
#include <asm/io.h> #include <asm/io.h>
#include <div64.h>
#include <linux/math64.h>
DECLARE_GLOBAL_DATA_PTR; 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); printf("%llu bytes read in %lu ms", len_read, time);
if (time > 0) { if (time > 0) {
puts(" ("); puts(" (");
print_size(len_read / time * 1000, "/s"); print_size(div_u64(len_read, time) * 1000, "/s");
puts(")"); puts(")");
} }
puts("\n"); 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); printf("%llu bytes written in %lu ms", len, time);
if (time > 0) { if (time > 0) {
puts(" ("); puts(" (");
print_size(len / time * 1000, "/s"); print_size(div_u64(len, time) * 1000, "/s");
puts(")"); puts(")");
} }
puts("\n"); puts("\n");

Loading…
Cancel
Save