forked from mirrors/linux
		
	hfsplus: Fix undefined __divdi3 in hfsplus_init_header_node()
ERROR: "__divdi3" [fs/hfsplus/hfsplus.ko] undefined!
Introduced by commit 099e9245e0 ("hfsplus: implement attributes file's
header node initialization code").
i_size_read() returns loff_t, which is long long, i.e.  64-bit.  node_size
is size_t, which is either 32-bit or 64-bit.  Hence
"i_size_read(attr_file) / node_size" is a 64-by-32 or 64-by-64 division,
causing (some versions of) gcc to emit a call to __divdi3().
Fortunately node_size is actually 16-bit, as the sole caller of
hfsplus_init_header_node() passes a u16.  Hence change its type from
size_t to u16, and use do_div() to perform a 64-by-32 division.
Not seen in m68k/allmodconfig in -next, so it really depends on the
verion of gcc.
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Vyacheslav Dubeyko <slava@dubeyko.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									498d319bb5
								
							
						
					
					
						commit
						a99b7069aa
					
				
					 1 changed files with 6 additions and 3 deletions
				
			
		| 
						 | 
					@ -129,7 +129,7 @@ static int can_set_xattr(struct inode *inode, const char *name,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void hfsplus_init_header_node(struct inode *attr_file,
 | 
					static void hfsplus_init_header_node(struct inode *attr_file,
 | 
				
			||||||
					u32 clump_size,
 | 
										u32 clump_size,
 | 
				
			||||||
					char *buf, size_t node_size)
 | 
										char *buf, u16 node_size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct hfs_bnode_desc *desc;
 | 
						struct hfs_bnode_desc *desc;
 | 
				
			||||||
	struct hfs_btree_header_rec *head;
 | 
						struct hfs_btree_header_rec *head;
 | 
				
			||||||
| 
						 | 
					@ -139,8 +139,9 @@ static void hfsplus_init_header_node(struct inode *attr_file,
 | 
				
			||||||
	char *bmp;
 | 
						char *bmp;
 | 
				
			||||||
	u32 used_nodes;
 | 
						u32 used_nodes;
 | 
				
			||||||
	u32 used_bmp_bytes;
 | 
						u32 used_bmp_bytes;
 | 
				
			||||||
 | 
						loff_t tmp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	hfs_dbg(ATTR_MOD, "init_hdr_attr_file: clump %u, node_size %zu\n",
 | 
						hfs_dbg(ATTR_MOD, "init_hdr_attr_file: clump %u, node_size %u\n",
 | 
				
			||||||
				clump_size, node_size);
 | 
									clump_size, node_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* The end of the node contains list of record offsets */
 | 
						/* The end of the node contains list of record offsets */
 | 
				
			||||||
| 
						 | 
					@ -154,7 +155,9 @@ static void hfsplus_init_header_node(struct inode *attr_file,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	head = (struct hfs_btree_header_rec *)(buf + offset);
 | 
						head = (struct hfs_btree_header_rec *)(buf + offset);
 | 
				
			||||||
	head->node_size = cpu_to_be16(node_size);
 | 
						head->node_size = cpu_to_be16(node_size);
 | 
				
			||||||
	head->node_count = cpu_to_be32(i_size_read(attr_file) / node_size);
 | 
						tmp = i_size_read(attr_file);
 | 
				
			||||||
 | 
						do_div(tmp, node_size);
 | 
				
			||||||
 | 
						head->node_count = cpu_to_be32(tmp);
 | 
				
			||||||
	head->free_nodes = cpu_to_be32(be32_to_cpu(head->node_count) - 1);
 | 
						head->free_nodes = cpu_to_be32(be32_to_cpu(head->node_count) - 1);
 | 
				
			||||||
	head->clump_size = cpu_to_be32(clump_size);
 | 
						head->clump_size = cpu_to_be32(clump_size);
 | 
				
			||||||
	head->attributes |= cpu_to_be32(HFS_TREE_BIGKEYS | HFS_TREE_VARIDXKEYS);
 | 
						head->attributes |= cpu_to_be32(HFS_TREE_BIGKEYS | HFS_TREE_VARIDXKEYS);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue