From: Laurent Vivier In-kernel super block changes to support >32 bit free blocks numbers. Signed-Off-By: Laurent Vivier Signed-off-by: Dave Kleikamp --- diff -Nurp linux015/fs/ext4/balloc.c linux016/fs/ext4/balloc.c --- linux015/fs/ext4/balloc.c 2006-09-19 16:35:56.000000000 -0500 +++ linux016/fs/ext4/balloc.c 2006-09-19 16:35:56.000000000 -0500 @@ -99,12 +99,16 @@ read_block_bitmap(struct super_block *sb desc = ext4_get_group_desc (sb, block_group, NULL); if (!desc) goto error_out; - bh = sb_bread(sb, le32_to_cpu(desc->bg_block_bitmap)); + bh = sb_bread(sb, + EXT4_BLOCK_BITMAP(desc, + ext4_group_first_block_no(sb, block_group))); if (!bh) ext4_error (sb, "read_block_bitmap", "Cannot read block bitmap - " - "block_group = %d, block_bitmap = %u", - block_group, le32_to_cpu(desc->bg_block_bitmap)); + "block_group = %d, block_bitmap = "E3FSBLK, + block_group, + EXT4_BLOCK_BITMAP(desc, + ext4_group_first_block_no(sb, block_group))); error_out: return bh; } @@ -432,7 +436,7 @@ void ext4_free_blocks_sb(handle_t *handl es = sbi->s_es; if (block < le32_to_cpu(es->s_first_data_block) || block + count < block || - block + count > le32_to_cpu(es->s_blocks_count)) { + block + count > EXT4_BLOCKS_COUNT(es)) { ext4_error (sb, "ext4_free_blocks", "Freeing blocks not in datazone - " "block = "E3FSBLK", count = %lu", block, count); @@ -460,11 +464,19 @@ do_more: if (!desc) goto error_return; - if (in_range (le32_to_cpu(desc->bg_block_bitmap), block, count) || - in_range (le32_to_cpu(desc->bg_inode_bitmap), block, count) || - in_range (block, le32_to_cpu(desc->bg_inode_table), + if (in_range (EXT4_BLOCK_BITMAP(desc, + ext4_group_first_block_no(sb, block_group)), + block, count) || + in_range (EXT4_INODE_BITMAP(desc, + ext4_group_first_block_no(sb, block_group)), + block, count) || + in_range (block, + EXT4_INODE_TABLE(desc, + ext4_group_first_block_no(sb, block_group)), sbi->s_itb_per_group) || - in_range (block + count - 1, le32_to_cpu(desc->bg_inode_table), + in_range (block + count - 1, + EXT4_INODE_TABLE(desc, + ext4_group_first_block_no(sb, block_group)), sbi->s_itb_per_group)) ext4_error (sb, "ext4_free_blocks", "Freeing blocks in system zones - " @@ -1351,7 +1363,7 @@ static int ext4_has_free_blocks(struct e ext4_fsblk_t free_blocks, root_blocks; free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); - root_blocks = le32_to_cpu(sbi->s_es->s_r_blocks_count); + root_blocks = EXT4_R_BLOCKS_COUNT(sbi->s_es); if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) && sbi->s_resuid != current->fsuid && (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { @@ -1462,7 +1474,7 @@ ext4_fsblk_t ext4_new_blocks(handle_t *h * First, test whether the goal block is free. */ if (goal < le32_to_cpu(es->s_first_data_block) || - goal >= le32_to_cpu(es->s_blocks_count)) + goal >= EXT4_BLOCKS_COUNT(es)) goal = le32_to_cpu(es->s_first_data_block); ext4_get_group_no_and_offset(sb, goal, &group_no, &grp_target_blk); goal_group = group_no; @@ -1561,11 +1573,15 @@ allocated: ret_block = grp_alloc_blk + ext4_group_first_block_no(sb, group_no); - if (in_range(le32_to_cpu(gdp->bg_block_bitmap), ret_block, num) || - in_range(le32_to_cpu(gdp->bg_inode_bitmap), ret_block, num) || - in_range(ret_block, le32_to_cpu(gdp->bg_inode_table), + if (in_range(EXT4_BLOCK_BITMAP(gdp, ext4_group_first_block_no(sb, group_no)), + ret_block, num) || + in_range(EXT4_BLOCK_BITMAP(gdp, ext4_group_first_block_no(sb, group_no)), + ret_block, num) || + in_range(ret_block, EXT4_INODE_TABLE(gdp, + ext4_group_first_block_no(sb, group_no)), EXT4_SB(sb)->s_itb_per_group) || - in_range(ret_block + num - 1, le32_to_cpu(gdp->bg_inode_table), + in_range(ret_block + num - 1, EXT4_INODE_TABLE(gdp, + ext4_group_first_block_no(sb, group_no)), EXT4_SB(sb)->s_itb_per_group)) ext4_error(sb, "ext4_new_block", "Allocating block in system zone - " @@ -1604,11 +1620,11 @@ allocated: jbd_unlock_bh_state(bitmap_bh); #endif - if (ret_block + num - 1 >= le32_to_cpu(es->s_blocks_count)) { + if (ret_block + num - 1 >= EXT4_BLOCKS_COUNT(es)) { ext4_error(sb, "ext4_new_block", - "block("E3FSBLK") >= blocks count(%d) - " + "block("E3FSBLK") >= blocks count("E3FSBLK") - " "block_group = %lu, es == %p ", ret_block, - le32_to_cpu(es->s_blocks_count), group_no, es); + EXT4_BLOCKS_COUNT(es), group_no, es); goto out; } @@ -1707,7 +1723,7 @@ ext4_fsblk_t ext4_count_free_blocks(stru brelse(bitmap_bh); printk("ext4_count_free_blocks: stored = "E3FSBLK ", computed = "E3FSBLK", "E3FSBLK"\n", - le32_to_cpu(es->s_free_blocks_count), + EXT4_FREE_BLOCKS_COUNT(es), desc_count, bitmap_count); return bitmap_count; #else diff -Nurp linux015/fs/ext4/ialloc.c linux016/fs/ext4/ialloc.c --- linux015/fs/ext4/ialloc.c 2006-09-19 16:35:56.000000000 -0500 +++ linux016/fs/ext4/ialloc.c 2006-09-19 16:35:56.000000000 -0500 @@ -60,12 +60,14 @@ read_inode_bitmap(struct super_block * s if (!desc) goto error_out; - bh = sb_bread(sb, le32_to_cpu(desc->bg_inode_bitmap)); + bh = sb_bread(sb, EXT4_INODE_BITMAP(desc, + ext4_group_first_block_no(sb, block_group))); if (!bh) ext4_error(sb, "read_inode_bitmap", "Cannot read inode bitmap - " - "block_group = %lu, inode_bitmap = %u", - block_group, le32_to_cpu(desc->bg_inode_bitmap)); + "block_group = %lu, inode_bitmap = %llu", + block_group, EXT4_INODE_BITMAP(desc, + ext4_group_first_block_no(sb, block_group))); error_out: return bh; } @@ -304,7 +306,7 @@ static int find_group_orlov(struct super goto fallback; } - blocks_per_dir = le32_to_cpu(es->s_blocks_count) - freeb; + blocks_per_dir = EXT4_BLOCKS_COUNT(es) - freeb; sector_div(blocks_per_dir, ndirs); max_dirs = ndirs / ngroups + inodes_per_group / 16; diff -Nurp linux015/fs/ext4/inode.c linux016/fs/ext4/inode.c --- linux015/fs/ext4/inode.c 2006-09-19 16:35:56.000000000 -0500 +++ linux016/fs/ext4/inode.c 2006-09-19 16:35:56.000000000 -0500 @@ -2438,8 +2438,9 @@ static ext4_fsblk_t ext4_get_inode_block */ offset = ((ino - 1) % EXT4_INODES_PER_GROUP(sb)) * EXT4_INODE_SIZE(sb); - block = le32_to_cpu(gdp[desc].bg_inode_table) + - (offset >> EXT4_BLOCK_SIZE_BITS(sb)); + block = EXT4_INODE_TABLE((gdp+desc), + ext4_group_first_block_no(sb, block_group)) + + (offset >> EXT4_BLOCK_SIZE_BITS(sb)); iloc->block_group = block_group; iloc->offset = offset & (EXT4_BLOCK_SIZE(sb) - 1); @@ -2506,7 +2507,9 @@ static int __ext4_get_inode_loc(struct i goto make_io; bitmap_bh = sb_getblk(inode->i_sb, - le32_to_cpu(desc->bg_inode_bitmap)); + EXT4_INODE_BITMAP(desc, + ext4_group_first_block_no(inode->i_sb, + block_group))); if (!bitmap_bh) goto make_io; diff -Nurp linux015/fs/ext4/resize.c linux016/fs/ext4/resize.c --- linux015/fs/ext4/resize.c 2006-09-19 16:35:56.000000000 -0500 +++ linux016/fs/ext4/resize.c 2006-09-19 16:35:56.000000000 -0500 @@ -27,7 +27,7 @@ static int verify_group_input(struct sup { struct ext4_sb_info *sbi = EXT4_SB(sb); struct ext4_super_block *es = sbi->s_es; - ext4_fsblk_t start = le32_to_cpu(es->s_blocks_count); + ext4_fsblk_t start = EXT4_BLOCKS_COUNT(es); ext4_fsblk_t end = start + input->blocks_count; unsigned group = input->group; ext4_fsblk_t itend = input->inode_table + sbi->s_itb_per_group; @@ -830,9 +830,12 @@ int ext4_group_add(struct super_block *s /* Update group descriptor block for new group */ gdp = (struct ext4_group_desc *)primary->b_data + gdb_off; - gdp->bg_block_bitmap = cpu_to_le32(input->block_bitmap); - gdp->bg_inode_bitmap = cpu_to_le32(input->inode_bitmap); - gdp->bg_inode_table = cpu_to_le32(input->inode_table); + EXT4_BLOCK_BITMAP_SET(gdp, ext4_group_first_block_no(sb, gdb_num), + input->block_bitmap); /* LV FIXME */ + EXT4_INODE_BITMAP_SET(gdp, ext4_group_first_block_no(sb, gdb_num), + input->inode_bitmap); /* LV FIXME */ + EXT4_INODE_TABLE_SET(gdp, ext4_group_first_block_no(sb, gdb_num), + input->inode_table); /* LV FIXME */ gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count); gdp->bg_free_inodes_count = cpu_to_le16(EXT4_INODES_PER_GROUP(sb)); @@ -846,7 +849,7 @@ int ext4_group_add(struct super_block *s * blocks/inodes before the group is live won't actually let us * allocate the new space yet. */ - es->s_blocks_count = cpu_to_le32(le32_to_cpu(es->s_blocks_count) + + EXT4_BLOCKS_COUNT_SET(es, EXT4_BLOCKS_COUNT(es) + input->blocks_count); es->s_inodes_count = cpu_to_le32(le32_to_cpu(es->s_inodes_count) + EXT4_INODES_PER_GROUP(sb)); @@ -882,7 +885,7 @@ int ext4_group_add(struct super_block *s /* Update the reserved block counts only once the new group is * active. */ - es->s_r_blocks_count = cpu_to_le32(le32_to_cpu(es->s_r_blocks_count) + + EXT4_R_BLOCKS_COUNT_SET(es, EXT4_R_BLOCKS_COUNT(es) + input->reserved_blocks); /* Update the free space counts */ @@ -933,7 +936,7 @@ int ext4_group_extend(struct super_block /* We don't need to worry about locking wrt other resizers just * yet: we're going to revalidate es->s_blocks_count after * taking lock_super() below. */ - o_blocks_count = le32_to_cpu(es->s_blocks_count); + o_blocks_count = EXT4_BLOCKS_COUNT(es); o_groups_count = EXT4_SB(sb)->s_groups_count; if (test_opt(sb, DEBUG)) @@ -1004,7 +1007,7 @@ int ext4_group_extend(struct super_block } lock_super(sb); - if (o_blocks_count != le32_to_cpu(es->s_blocks_count)) { + if (o_blocks_count != EXT4_BLOCKS_COUNT(es)) { ext4_warning(sb, __FUNCTION__, "multiple resizers run on filesystem!"); unlock_super(sb); @@ -1020,7 +1023,7 @@ int ext4_group_extend(struct super_block ext4_journal_stop(handle); goto exit_put; } - es->s_blocks_count = cpu_to_le32(o_blocks_count + add); + EXT4_BLOCKS_COUNT_SET(es, o_blocks_count + add); ext4_journal_dirty_metadata(handle, EXT4_SB(sb)->s_sbh); sb->s_dirt = 1; unlock_super(sb); @@ -1032,8 +1035,8 @@ int ext4_group_extend(struct super_block if ((err = ext4_journal_stop(handle))) goto exit_put; if (test_opt(sb, DEBUG)) - printk(KERN_DEBUG "EXT4-fs: extended group to %u blocks\n", - le32_to_cpu(es->s_blocks_count)); + printk(KERN_DEBUG "EXT4-fs: extended group to %llu blocks\n", + EXT4_BLOCKS_COUNT(es)); update_backups(sb, EXT4_SB(sb)->s_sbh->b_blocknr, (char *)es, sizeof(struct ext4_super_block)); exit_put: diff -Nurp linux015/fs/ext4/super.c linux016/fs/ext4/super.c --- linux015/fs/ext4/super.c 2006-09-19 16:35:56.000000000 -0500 +++ linux016/fs/ext4/super.c 2006-09-19 16:35:56.000000000 -0500 @@ -1182,6 +1182,9 @@ static int ext4_check_descriptors (struc struct ext4_sb_info *sbi = EXT4_SB(sb); ext4_fsblk_t first_block = le32_to_cpu(sbi->s_es->s_first_data_block); ext4_fsblk_t last_block; + ext4_fsblk_t block_bitmap; + ext4_fsblk_t inode_bitmap; + ext4_fsblk_t inode_table; struct ext4_group_desc * gdp = NULL; int desc_block = 0; int i; @@ -1199,42 +1202,42 @@ static int ext4_check_descriptors (struc if ((i % EXT4_DESC_PER_BLOCK(sb)) == 0) gdp = (struct ext4_group_desc *) sbi->s_group_desc[desc_block++]->b_data; - if (le32_to_cpu(gdp->bg_block_bitmap) < first_block || - le32_to_cpu(gdp->bg_block_bitmap) > last_block) + block_bitmap = EXT4_BLOCK_BITMAP(gdp, + ext4_group_first_block_no(sb, i)); + if (block_bitmap < first_block || block_bitmap > last_block) { ext4_error (sb, "ext4_check_descriptors", "Block bitmap for group %d" - " not in group (block %lu)!", - i, (unsigned long) - le32_to_cpu(gdp->bg_block_bitmap)); + " not in group (block "E3FSBLK")!", + i, block_bitmap); return 0; } - if (le32_to_cpu(gdp->bg_inode_bitmap) < first_block || - le32_to_cpu(gdp->bg_inode_bitmap) > last_block) + inode_bitmap = EXT4_INODE_BITMAP(gdp, + ext4_group_first_block_no(sb, i)); + if (inode_bitmap < first_block || inode_bitmap > last_block) { ext4_error (sb, "ext4_check_descriptors", "Inode bitmap for group %d" - " not in group (block %lu)!", - i, (unsigned long) - le32_to_cpu(gdp->bg_inode_bitmap)); + " not in group (block "E3FSBLK")!", + i, inode_bitmap); return 0; } - if (le32_to_cpu(gdp->bg_inode_table) < first_block || - le32_to_cpu(gdp->bg_inode_table) + sbi->s_itb_per_group > - last_block) + inode_table = EXT4_INODE_TABLE(gdp, + ext4_group_first_block_no(sb, i)); + if (inode_table < first_block || + inode_table + sbi->s_itb_per_group > last_block) { ext4_error (sb, "ext4_check_descriptors", "Inode table for group %d" - " not in group (block %lu)!", - i, (unsigned long) - le32_to_cpu(gdp->bg_inode_table)); + " not in group (block "E3FSBLK")!", + i, inode_table); return 0; } first_block += EXT4_BLOCKS_PER_GROUP(sb); gdp++; } - sbi->s_es->s_free_blocks_count=cpu_to_le32(ext4_count_free_blocks(sb)); + EXT4_FREE_BLOCKS_COUNT_SET(sbi->s_es, ext4_count_free_blocks(sb)); sbi->s_es->s_free_inodes_count=cpu_to_le32(ext4_count_free_inodes(sb)); return 1; } @@ -1411,6 +1414,7 @@ static int ext4_fill_super (struct super int i; int needs_recovery; __le32 features; + __u64 blocks_count; sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); if (!sbi) @@ -1622,7 +1626,7 @@ static int ext4_fill_super (struct super goto failed_mount; } - if (le32_to_cpu(es->s_blocks_count) > + if (EXT4_BLOCKS_COUNT(es) > (sector_t)(~0ULL) >> (sb->s_blocksize_bits - 9)) { printk(KERN_ERR "EXT4-fs: filesystem on %s:" " too large to mount safely\n", sb->s_id); @@ -1634,9 +1638,11 @@ static int ext4_fill_super (struct super if (EXT4_BLOCKS_PER_GROUP(sb) == 0) goto cantfind_ext4; - sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - - le32_to_cpu(es->s_first_data_block) - 1) - / EXT4_BLOCKS_PER_GROUP(sb)) + 1; + blocks_count = (EXT4_BLOCKS_COUNT(es) - + le32_to_cpu(es->s_first_data_block) + + EXT4_BLOCKS_PER_GROUP(sb) - 1); + do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb)); + sbi->s_groups_count = blocks_count; db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) / EXT4_DESC_PER_BLOCK(sb); sbi->s_group_desc = kmalloc(db_count * sizeof (struct buffer_head *), @@ -1951,7 +1957,7 @@ static journal_t *ext4_get_dev_journal(s goto out_bdev; } - len = le32_to_cpu(es->s_blocks_count); + len = EXT4_BLOCKS_COUNT(es); start = sb_block + 1; brelse(bh); /* we're done with the superblock */ @@ -2121,7 +2127,7 @@ static void ext4_commit_super (struct su if (!sbh) return; es->s_wtime = cpu_to_le32(get_seconds()); - es->s_free_blocks_count = cpu_to_le32(ext4_count_free_blocks(sb)); + EXT4_FREE_BLOCKS_COUNT_SET(es, ext4_count_free_blocks(sb)); es->s_free_inodes_count = cpu_to_le32(ext4_count_free_inodes(sb)); BUFFER_TRACE(sbh, "marking dirty"); mark_buffer_dirty(sbh); @@ -2314,7 +2320,7 @@ static int ext4_remount (struct super_bl ext4_init_journal_params(sb, sbi->s_journal); if ((*flags & MS_RDONLY) != (sb->s_flags & MS_RDONLY) || - n_blocks_count > le32_to_cpu(es->s_blocks_count)) { + n_blocks_count > EXT4_BLOCKS_COUNT(es)) { if (sbi->s_mount_opt & EXT4_MOUNT_ABORT) { err = -EROFS; goto restore_opts; @@ -2433,10 +2439,10 @@ static int ext4_statfs (struct dentry * buf->f_type = EXT4_SUPER_MAGIC; buf->f_bsize = sb->s_blocksize; - buf->f_blocks = le32_to_cpu(es->s_blocks_count) - overhead; + buf->f_blocks = EXT4_BLOCKS_COUNT(es) - overhead; buf->f_bfree = percpu_counter_sum(&sbi->s_freeblocks_counter); - buf->f_bavail = buf->f_bfree - le32_to_cpu(es->s_r_blocks_count); - if (buf->f_bfree < le32_to_cpu(es->s_r_blocks_count)) + buf->f_bavail = buf->f_bfree - EXT4_R_BLOCKS_COUNT(es); + if (buf->f_bfree < EXT4_R_BLOCKS_COUNT(es)) buf->f_bavail = 0; buf->f_files = le32_to_cpu(es->s_inodes_count); buf->f_ffree = percpu_counter_sum(&sbi->s_freeinodes_counter); diff -Nurp linux015/include/linux/ext4_fs.h linux016/include/linux/ext4_fs.h --- linux015/include/linux/ext4_fs.h 2006-09-19 16:35:56.000000000 -0500 +++ linux016/include/linux/ext4_fs.h 2006-09-19 16:35:56.000000000 -0500 @@ -132,6 +132,63 @@ struct ext4_group_desc __le32 bg_reserved[3]; }; +#ifdef __KERNEL__ +#include +#include +static inline u32 EXT4_RELATIVE_ENCODE(ext4_fsblk_t group_base, + ext4_fsblk_t fs_block) +{ + s32 gdp_block; + + if (fs_block < (1ULL<<32) && group_base < (1ULL<<32)) + return fs_block; + + gdp_block = (fs_block - group_base); + BUG_ON ((group_base + gdp_block) != fs_block); + + return gdp_block; +} + +static inline ext4_fsblk_t EXT4_RELATIVE_DECODE(ext4_fsblk_t group_base, + u32 gdp_block) +{ + if (group_base >= (1ULL<<32)) + return group_base + (s32) gdp_block; + + if ((s32) gdp_block >= 0 && gdp_block < group_base && + group_base + gdp_block >= (1ULL<<32)) + return group_base + gdp_block; + + return gdp_block; +} + +#define EXT4_BLOCK_BITMAP(bg, group_base) \ + EXT4_RELATIVE_DECODE(group_base, le32_to_cpu((bg)->bg_block_bitmap)) +#define EXT4_INODE_BITMAP(bg, group_base) \ + EXT4_RELATIVE_DECODE(group_base, le32_to_cpu((bg)->bg_inode_bitmap)) +#define EXT4_INODE_TABLE(bg, group_base) \ + EXT4_RELATIVE_DECODE(group_base, le32_to_cpu((bg)->bg_inode_table)) + +#define EXT4_BLOCK_BITMAP_SET(bg, group_base, value) \ + do {(bg)->bg_block_bitmap = \ + cpu_to_le32(EXT4_RELATIVE_ENCODE(group_base, value)); \ + } while(0) +#define EXT4_INODE_BITMAP_SET(bg, group_base, value) \ + do {(bg)->bg_inode_bitmap = \ + cpu_to_le32(EXT4_RELATIVE_ENCODE(group_base, value)); \ + } while(0) +#define EXT4_INODE_TABLE_SET(bg, group_base, value) \ + do {(bg)->bg_inode_table = \ + cpu_to_le32(EXT4_RELATIVE_ENCODE(group_base, value)); \ + } while(0) + +#define EXT4_IS_USED_BLOCK_BITMAP(bg) \ + ((bg)->bg_block_bitmap != 0) +#define EXT4_IS_USED_INODE_BITMAP(bg) \ + ((bg)->bg_inode_bitmap != 0) +#define EXT4_IS_USED_INODE_TABLE(bg) \ + ((bg)->bg_inode_table != 0) +#endif /* * Macro-instructions used to manage group descriptors */ @@ -494,14 +551,43 @@ struct ext4_super_block { __u8 s_def_hash_version; /* Default hash version to use */ __u8 s_reserved_char_pad; __u16 s_reserved_word_pad; - __le32 s_default_mount_opts; +/*100*/ __le32 s_default_mount_opts; __le32 s_first_meta_bg; /* First metablock block group */ - __u32 s_reserved[190]; /* Padding to the end of the block */ + __le32 s_mkfs_time; /* When the filesystem was created */ + __le32 s_jnl_blocks[17]; /* Backup of the journal inode */ + /* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */ +/*150*/ __le32 s_blocks_count_hi; /* Blocks count */ + __le32 s_r_blocks_count_hi; /* Reserved blocks count */ + __le32 s_free_blocks_count_hi; /* Free blocks count */ + __u32 s_reserved[169]; /* Padding to the end of the block */ }; + +#define EXT4_BLOCKS_COUNT(s) \ + (ext4_fsblk_t)(((__u64)le32_to_cpu((s)->s_blocks_count_hi) << 32) | \ + (__u64)le32_to_cpu((s)->s_blocks_count)) +#define EXT4_BLOCKS_COUNT_SET(s,v) do { \ + (s)->s_blocks_count = cpu_to_le32((v)); \ + (s)->s_blocks_count_hi = cpu_to_le32(((__u64)(v)) >> 32); \ +} while (0) + +#define EXT4_R_BLOCKS_COUNT(s) \ + (ext4_fsblk_t)(((__u64)le32_to_cpu((s)->s_r_blocks_count_hi) << 32) | \ + (__u64)le32_to_cpu((s)->s_r_blocks_count)) +#define EXT4_R_BLOCKS_COUNT_SET(s,v) do { \ + (s)->s_r_blocks_count = cpu_to_le32((v)); \ + (s)->s_r_blocks_count_hi = cpu_to_le32(((__u64)(v)) >> 32); \ +} while (0) + +#define EXT4_FREE_BLOCKS_COUNT(s) \ + (ext4_fsblk_t)(((__u64)le32_to_cpu((s)->s_free_blocks_count_hi) << 32) | \ + (__u64)le32_to_cpu((s)->s_free_blocks_count)) +#define EXT4_FREE_BLOCKS_COUNT_SET(s,v) do { \ + (s)->s_free_blocks_count = cpu_to_le32((v)); \ + (s)->s_free_blocks_count_hi = cpu_to_le32(((__u64)(v)) >> 32); \ +} while (0) + #ifdef __KERNEL__ -#include -#include static inline struct ext4_sb_info * EXT4_SB(struct super_block *sb) { return sb->s_fs_info; @@ -588,12 +674,14 @@ static inline int ext4_valid_inum(struct #define EXT4_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ #define EXT4_FEATURE_INCOMPAT_META_BG 0x0010 #define EXT4_FEATURE_INCOMPAT_EXTENTS 0x0040 /* extents support */ +#define EXT4_FEATURE_INCOMPAT_64BIT 0x0080 #define EXT4_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR #define EXT4_FEATURE_INCOMPAT_SUPP (EXT4_FEATURE_INCOMPAT_FILETYPE| \ EXT4_FEATURE_INCOMPAT_RECOVER| \ EXT4_FEATURE_INCOMPAT_META_BG| \ - EXT4_FEATURE_INCOMPAT_EXTENTS) + EXT4_FEATURE_INCOMPAT_EXTENTS| \ + EXT4_FEATURE_INCOMPAT_64BIT) #define EXT4_FEATURE_RO_COMPAT_SUPP (EXT4_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT4_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT4_FEATURE_RO_COMPAT_BTREE_DIR)