From: Ɓukasz Majewski Date: Wed, 5 Dec 2012 08:06:37 +0000 (+0000) Subject: fs:ext4:write: Add lldiv and do_div to perform 64-32 bits division X-Git-Tag: v2013.01-rc2~77 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=32fc16d7e7a81816ce247b7cd70c94f3210a228b;p=kernel%2Fu-boot.git fs:ext4:write: Add lldiv and do_div to perform 64-32 bits division The ext4write code has been using direct calls to 64-32 division (/ and %). Officially supported u-boot toolchains (eldk-5.[12].x) generate calls to __aeabi_uldivmod(), which is niether defined in the toolchain libs nor u-boot source tree. Due to that, when the ext4write command has been executed, "undefined instruction" execption was generated (since the __aeabi_uldivmod() is not provided). To fix this error, lldiv() for division and do_div() for modulo have been used. Those two functions are recommended for performing 64-32 bit number division in u-boot. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park --- diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c index 06536ba..80b3b90 100644 --- a/fs/ext4/ext4fs.c +++ b/fs/ext4/ext4fs.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "ext4_common.h" int ext4fs_symlinknest; @@ -1051,8 +1052,8 @@ int ext4fs_write(const char *fname, unsigned char *buffer, } /* calucalate how many blocks required */ bytes_reqd_for_file = sizebytes; - blks_reqd_for_file = bytes_reqd_for_file / fs->blksz; - if (bytes_reqd_for_file % fs->blksz != 0) { + blks_reqd_for_file = lldiv(bytes_reqd_for_file, fs->blksz); + if (do_div(bytes_reqd_for_file, fs->blksz) != 0) { blks_reqd_for_file++; debug("total bytes for a file %u\n", blks_reqd_for_file); }