From: Eric Sandeen Subject: Re: [PATCH] ext4: Fix 64-bit block type problem on 32-bit platforms Date: Sun, 14 Jun 2009 23:07:10 -0500 Message-ID: <4A35C8EE.8070700@redhat.com> References: <1245015002-16880-1-git-send-email-tytso@mit.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: Ext4 Developers List To: "Theodore Ts'o" Return-path: Received: from mx2.redhat.com ([66.187.237.31]:40162 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751483AbZFOEHE (ORCPT ); Mon, 15 Jun 2009 00:07:04 -0400 In-Reply-To: <1245015002-16880-1-git-send-email-tytso@mit.edu> Sender: linux-ext4-owner@vger.kernel.org List-ID: Theodore Ts'o wrote: > The function ext4_mb_free_blocks() was using an "unsigned long" to > pass a block number; this will cause 64-bit block numbers to get > truncated on x86 and other 32-bit platforms. > > Signed-off-by: "Theodore Ts'o" Yup, good catch. Reviewed-by: Eric Sandeen > --- > fs/ext4/ext4.h | 2 +- > fs/ext4/mballoc.c | 8 ++++---- > 2 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h > index 746cdcb..17b9998 100644 > --- a/fs/ext4/ext4.h > +++ b/fs/ext4/ext4.h > @@ -1341,7 +1341,7 @@ extern void ext4_discard_preallocations(struct inode *); > extern int __init init_ext4_mballoc(void); > extern void exit_ext4_mballoc(void); > extern void ext4_mb_free_blocks(handle_t *, struct inode *, > - unsigned long, unsigned long, int, unsigned long *); > + ext4_fsblk_t, unsigned long, int, unsigned long *); > extern int ext4_mb_add_groupinfo(struct super_block *sb, > ext4_group_t i, struct ext4_group_desc *desc); > extern void ext4_mb_update_group_info(struct ext4_group_info *grp, > diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c > index 8d98070..519a0a6 100644 > --- a/fs/ext4/mballoc.c > +++ b/fs/ext4/mballoc.c > @@ -4689,7 +4689,7 @@ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b, > * Main entry point into mballoc to free blocks > */ > void ext4_mb_free_blocks(handle_t *handle, struct inode *inode, > - unsigned long block, unsigned long count, > + ext4_fsblk_t block, unsigned long count, > int metadata, unsigned long *freed) > { > struct buffer_head *bitmap_bh = NULL; > @@ -4715,11 +4715,11 @@ void ext4_mb_free_blocks(handle_t *handle, struct inode *inode, > block + count > ext4_blocks_count(es)) { > ext4_error(sb, __func__, > "Freeing blocks not in datazone - " > - "block = %lu, count = %lu", block, count); > + "block = %llu, count = %lu", block, count); > goto error_return; > } > > - ext4_debug("freeing block %lu\n", block); > + ext4_debug("freeing block %llu\n", block); > trace_ext4_free_blocks(inode, block, count, metadata); > > ac = kmem_cache_alloc(ext4_ac_cachep, GFP_NOFS); > @@ -4761,7 +4761,7 @@ do_more: > > ext4_error(sb, __func__, > "Freeing blocks in system zone - " > - "Block = %lu, count = %lu", block, count); > + "Block = %llu, count = %lu", block, count); > /* err = 0. ext4_std_error should be a no op */ > goto error_return; > }