[PATCH 3/3] Fix missing __udivdi3 in SquashFS implementation.

Daniel Schwierzeck daniel.schwierzeck at gmail.com
Wed Sep 23 00:05:35 CEST 2020


Am Sonntag, den 20.09.2020, 21:21 -0400 schrieb Tom Rini:
> On Sun, Sep 20, 2020 at 06:29:01PM +0200, Mauro Condarelli wrote:
> 
> > Signed-off-by: Mauro Condarelli <mc5686 at mclink.it>
> > ---
> >  fs/squashfs/sqfs.c        | 45 +++++++++++++++++++++++++--------------
> >  fs/squashfs/sqfs_inode.c  |  8 +++----
> >  include/configs/vocore2.h |  2 +-

remove that file which is unrelated to this patch

> >  3 files changed, 34 insertions(+), 21 deletions(-)
> > 
> > diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c
> > index 15208b4dab..b49331ce93 100644
> > --- a/fs/squashfs/sqfs.c
> > +++ b/fs/squashfs/sqfs.c
> > @@ -18,6 +18,8 @@
> >  #include <string.h>
> >  #include <squashfs.h>
> >  #include <part.h>
> > +#include <div64.h>
> > +#include <stdio.h>
> >  
> >  #include "sqfs_decompressor.h"
> >  #include "sqfs_filesystem.h"
> > @@ -82,13 +84,16 @@ static int sqfs_count_tokens(const char *filename)
> >   */
> >  static int sqfs_calc_n_blks(__le64 start, __le64 end, u64 *offset)
> >  {
> > -	u64 start_, table_size;
> > +	u64 start_, table_size, blks;
> >  
> >  	table_size = le64_to_cpu(end) - le64_to_cpu(start);
> > -	start_ = le64_to_cpu(start) / ctxt.cur_dev->blksz;
> > +	start_ = le64_to_cpu(start);
> > +	do_div(start_, ctxt.cur_dev->blksz);

have you tried with lldiv() which returns the 64bit result? Also it
would be a little cleaner:

    start_ = lldiv(le64_to_cpu(start), ctxt.cur_dev->blksz);

> >  	*offset = le64_to_cpu(start) - (start_ * ctxt.cur_dev->blksz);
> >  
> > -	return DIV_ROUND_UP(table_size + *offset, ctxt.cur_dev->blksz);
> > +	blks = table_size + *offset;
> > +	if (do_div(blks, ctxt.cur_dev->blksz)) blks++;
> > +	return blks;

maybe define something like this and use that instead of DIV_ROUND_UP:

    #define lldiv_round_up(n, d) lldiv((n) + (d) - 1, (d))

> >  }
> >  
> >  /*
> > @@ -109,8 +114,8 @@ static int sqfs_frag_lookup(u32 inode_fragment_index,
> >  	if (inode_fragment_index >= get_unaligned_le32(&sblk->fragments))
> >  		return -EINVAL;
> >  
> > -	start = get_unaligned_le64(&sblk->fragment_table_start) /
> > -		ctxt.cur_dev->blksz;
> > +	start = get_unaligned_le64(&sblk->fragment_table_start);
> > +	do_div(start, ctxt.cur_dev->blksz);
> >  	n_blks = sqfs_calc_n_blks(sblk->fragment_table_start,
> >  				  sblk->export_table_start,
> >  				  &table_offset);
> > @@ -135,7 +140,8 @@ static int sqfs_frag_lookup(u32 inode_fragment_index,
> >  	start_block = get_unaligned_le64(table + table_offset + block *
> >  					 sizeof(u64));
> >  
> > -	start = start_block / ctxt.cur_dev->blksz;
> > +	start = start_block;
> > +	do_div(start, ctxt.cur_dev->blksz);
> >  	n_blks = sqfs_calc_n_blks(cpu_to_le64(start_block),
> >  				  sblk->fragment_table_start, &table_offset);
> >  
> > @@ -641,8 +647,8 @@ static int sqfs_read_inode_table(unsigned char **inode_table)
> >  
> >  	table_size = get_unaligned_le64(&sblk->directory_table_start) -
> >  		get_unaligned_le64(&sblk->inode_table_start);
> > -	start = get_unaligned_le64(&sblk->inode_table_start) /
> > -		ctxt.cur_dev->blksz;
> > +	start = get_unaligned_le64(&sblk->inode_table_start);
> > +	do_div(start, ctxt.cur_dev->blksz);
> >  	n_blks = sqfs_calc_n_blks(sblk->inode_table_start,
> >  				  sblk->directory_table_start, &table_offset);
> >  
> > @@ -725,8 +731,8 @@ static int sqfs_read_directory_table(unsigned char **dir_table, u32 **pos_list)
> >  	/* DIRECTORY TABLE */
> >  	table_size = get_unaligned_le64(&sblk->fragment_table_start) -
> >  		get_unaligned_le64(&sblk->directory_table_start);
> > -	start = get_unaligned_le64(&sblk->directory_table_start) /
> > -		ctxt.cur_dev->blksz;
> > +	start = get_unaligned_le64(&sblk->directory_table_start);
> > +	do_div(start, ctxt.cur_dev->blksz);
> >  	n_blks = sqfs_calc_n_blks(sblk->directory_table_start,
> >  				  sblk->fragment_table_start, &table_offset);
> >  
> > @@ -1158,6 +1164,7 @@ static int sqfs_get_regfile_info(struct squashfs_reg_inode *reg,
> >  				       fentry);
> >  		if (ret < 0)
> >  			return -EINVAL;
> > +
> >  		finfo->comp = true;
> >  		if (fentry->size < 1 || fentry->start == 0x7FFFFFFF)
> >  			return -EINVAL;
> > @@ -1328,17 +1335,19 @@ int sqfs_read(const char *filename, void *buf, loff_t offset, loff_t len,
> >  		data_offset = finfo.start;
> >  		datablock = malloc(get_unaligned_le32(&sblk->block_size));
> >  		if (!datablock) {
> > +			printf("Error: malloc(%u) failed.\n", get_unaligned_le32(&sblk->block_size));
> >  			ret = -ENOMEM;
> >  			goto free_paths;
> >  		}
> >  	}
> >  
> >  	for (j = 0; j < datablk_count; j++) {
> > -		start = data_offset / ctxt.cur_dev->blksz;
> > +		start = data_offset;
> > +		do_div(start, ctxt.cur_dev->blksz);
> >  		table_size = SQFS_BLOCK_SIZE(finfo.blk_sizes[j]);
> >  		table_offset = data_offset - (start * ctxt.cur_dev->blksz);
> > -		n_blks = DIV_ROUND_UP(table_size + table_offset,
> > -				      ctxt.cur_dev->blksz);
> > +		n_blks = table_size + table_offset;
> > +		if (do_div(n_blks, ctxt.cur_dev->blksz)) n_blks++;
> >  
> >  		data_buffer = malloc_cache_aligned(n_blks * ctxt.cur_dev->blksz);
> >  
> > @@ -1365,8 +1374,10 @@ int sqfs_read(const char *filename, void *buf, loff_t offset, loff_t len,
> >  			dest_len = get_unaligned_le32(&sblk->block_size);
> >  			ret = sqfs_decompress(&ctxt, datablock, &dest_len,
> >  					      data, table_size);
> > -			if (ret)
> > +			if (ret) {
> > +				printf("Errrt: block decompress failed.\n");
> >  				goto free_buffer;
> > +			}
> >  
> >  			memcpy(buf + offset + *actread, datablock, dest_len);
> >  			*actread += dest_len;
> > @@ -1388,10 +1399,12 @@ int sqfs_read(const char *filename, void *buf, loff_t offset, loff_t len,
> >  		goto free_buffer;
> >  	}
> >  
> > -	start = frag_entry.start / ctxt.cur_dev->blksz;
> > +	start = frag_entry.start;
> > +	do_div(start, ctxt.cur_dev->blksz);
> >  	table_size = SQFS_BLOCK_SIZE(frag_entry.size);
> >  	table_offset = frag_entry.start - (start * ctxt.cur_dev->blksz);
> > -	n_blks = DIV_ROUND_UP(table_size + table_offset, ctxt.cur_dev->blksz);
> > +	n_blks = table_size + table_offset;
> > +	if (do_div(n_blks, ctxt.cur_dev->blksz)) n_blks++;
> >  
> >  	fragment = malloc_cache_aligned(n_blks * ctxt.cur_dev->blksz);
> >  
> > diff --git a/fs/squashfs/sqfs_inode.c b/fs/squashfs/sqfs_inode.c
> > index 1368f3063c..c330e32a0e 100644
> > --- a/fs/squashfs/sqfs_inode.c
> > +++ b/fs/squashfs/sqfs_inode.c
> > @@ -11,6 +11,7 @@
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >  #include <string.h>
> > +#include <div64.h>
> >  
> >  #include "sqfs_decompressor.h"
> >  #include "sqfs_filesystem.h"
> > @@ -67,10 +68,9 @@ int sqfs_inode_size(struct squashfs_base_inode *inode, u32 blk_size)
> >  		u64 file_size = get_unaligned_le64(&lreg->file_size);
> >  		unsigned int blk_list_size;
> >  
> > -		if (fragment == 0xFFFFFFFF)
> > -			blk_list_size = DIV_ROUND_UP(file_size, blk_size);
> > -		else
> > -			blk_list_size = file_size / blk_size;
> > +		if (do_div(file_size, blk_size) && (fragment == 0xFFFFFFFF))
> > +		    file_size++;
> > +		blk_list_size = file_size;
> >  
> >  		return sizeof(*lreg) + blk_list_size * sizeof(u32);
> >  	}
> > diff --git a/include/configs/vocore2.h b/include/configs/vocore2.h
> > index 29a57ad233..dfdb8fcc04 100644
> > --- a/include/configs/vocore2.h
> > +++ b/include/configs/vocore2.h
> > @@ -41,7 +41,7 @@
> >  
> >  /* Memory usage */
> >  #define CONFIG_SYS_MAXARGS		64
> > -#define CONFIG_SYS_MALLOC_LEN		(1024 * 1024)
> > +#define CONFIG_SYS_MALLOC_LEN		(16 * 1024 * 1024)
> >  #define CONFIG_SYS_BOOTPARAMS_LEN	(128 * 1024)
> >  #define CONFIG_SYS_CBSIZE		512
> 
> Add in maintainers..
> 
-- 
- Daniel



More information about the U-Boot mailing list