I apologize if this is a dumb question, but I'm having trouble
understanding the huge_file superblock flag.
I see how, if this flag is set, that the inode can have a size > 2**32
bytes, using the i_size_lo/i_size_high fields.
But since an ext4_extent only uses 32-bits for for its ee_block field
to represent the logical block, how can an extent describe any block
range of a file past the 4GiB boundary?
Am I missing something?
Thanks,
Curt
Curt Wohlgemuth wrote:
> I apologize if this is a dumb question, but I'm having trouble
> understanding the huge_file superblock flag.
>
> I see how, if this flag is set, that the inode can have a size > 2**32
> bytes, using the i_size_lo/i_size_high fields.
>
> But since an ext4_extent only uses 32-bits for for its ee_block field
> to represent the logical block, how can an extent describe any block
> range of a file past the 4GiB boundary?
>
> Am I missing something?
i_size_lo/hi is in bytes, ee_block is in .... blocks.
so 2^32 blocks is a lot more than 2^32 bytes, and i_size_hi/lo are
needed to contain it. I think. :)
-Eric
Hi Eric:
On Fri, Jul 10, 2009 at 8:39 AM, Eric Sandeen<[email protected]> wrote:
> Curt Wohlgemuth wrote:
>> I apologize if this is a dumb question, but I'm having trouble
>> understanding the huge_file superblock flag.
>>
>> I see how, if this flag is set, that the inode can have a size > 2**32
>> bytes, using the i_size_lo/i_size_high fields.
>>
>> But since an ext4_extent only uses 32-bits for for its ee_block field
>> to represent the logical block, how can an extent describe any block
>> range of a file past the 4GiB boundary?
>>
>> Am I missing something?
>
> i_size_lo/hi is in bytes, ee_block is in .... blocks.
>
> so 2^32 blocks is a lot more than 2^32 bytes, and i_size_hi/lo are
> needed to contain it. ?I think. ?:)
Oops. Of course. I knew it had to be something simple.
Thanks,
Curt
On Jul 10, 2009 08:32 -0700, Curt Wohlgemuth wrote:
> I apologize if this is a dumb question, but I'm having trouble
> understanding the huge_file superblock flag.
>
> I see how, if this flag is set, that the inode can have a size > 2**32
> bytes, using the i_size_lo/i_size_high fields.
Actually, it is RO_COMPAT_LARGE_FILE that indicates support for size larger
than 2^32 _bytes_. The RO_COMPAT_HUGE_FILE indicates support for blocks
more than 2^32 512-byte _sectors_ (2TB).
> But since an ext4_extent only uses 32-bits for for its ee_block field
> to represent the logical block, how can an extent describe any block
> range of a file past the 4GiB boundary?
There are two different mechanisms used with HUGE_FILE. It allows
storing a high word of data (2^48 sectors) and it ALSO changes the
units to be in terms of filesystem blocksize instead of 512-byte sectors.
While both of these mechanisms are not strictly necessary with the
current extent format, which only handles 2^32 filesystem blocks,
there were some good reasons to make both changes:
- having the inode i_blocks field be in 512-byte sectors was confusing
to many coders and wasted 3 bits (for 4kB blocks) of dynamic range.
- if we ever implement a new extent format that handles more than 2^32
filesystem blocks, or use larger filesystem blocks we don't need to
rework this code again.
Cheers, Andreas
--
Andreas Dilger
Sr. Staff Engineer, Lustre Group
Sun Microsystems of Canada, Inc.