[U-Boot] [PATCH] fs/ext4/ext4fs.c, fs/fs.c: Use lldiv and multiplication / subtraction on 64bit ops

Simon Glass sjg at chromium.org
Mon Nov 24 20:55:29 CET 2014


On 24 November 2014 at 09:55, Tom Rini <trini at ti.com> wrote:
> In some cases we need to do math on 64bit quantities.  We need to be
> using lldiv in these cases rather than letting the compiler do it.  In
> addition we need to avoid doing % operations on these same quantities.
> These changes fix compilation on MIPS/MIPSEL.
>
> Cc: Daniel Schwierzeck <daniel.schwierzeck at gmail.com>
> Cc: Suriyan Ramasami <suriyan.r at gmail.com>
> Cc: Simon Glass <sjg at chromium.org>
> Signed-off-by: Tom Rini <trini at ti.com>

Reviewed-by: Simon Glass <sjg at chromium.org>

> ---
>  fs/ext4/ext4fs.c |   11 ++++++-----
>  fs/fs.c          |    3 ++-
>  2 files changed, 8 insertions(+), 6 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/fs.c b/fs/fs.c
> index 3da7860..760f4a6 100644
> --- a/fs/fs.c
> +++ b/fs/fs.c
> @@ -17,6 +17,7 @@
>  #include <config.h>
>  #include <errno.h>
>  #include <common.h>
> +#include <div64.h>
>  #include <part.h>
>  #include <ext4fs.h>
>  #include <fat.h>
> @@ -399,7 +400,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(lldiv(len_read, time * 1000), "/s");
>                 puts(")");
>         }
>         puts("\n");
> --
> 1.7.9.5
>


More information about the U-Boot mailing list