ext4: Fix 64-bit block type problem on 32-bit platforms
authorTheodore Ts'o <tytso@mit.edu>
Mon, 15 Jun 2009 07:45:05 +0000 (03:45 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 15 Jun 2009 07:45:05 +0000 (03:45 -0400)
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" <tytso@mit.edu>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
fs/ext4/ext4.h
fs/ext4/mballoc.c

index 746cdcb..17b9998 100644 (file)
@@ -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,
index 8d98070..519a0a6 100644 (file)
@@ -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;
        }