提交 cd2291a4 编写于 作者: E Eric Sandeen 提交者: Theodore Ts'o

ext4: different maxbytes functions for bitmap & extent files

use 2 different maxbytes functions for bitmapped & extent-based
files.
Signed-off-by: NEric Sandeen <sandeen@redhat.com>
上级 8180a562
...@@ -1600,19 +1600,58 @@ static void ext4_orphan_cleanup (struct super_block * sb, ...@@ -1600,19 +1600,58 @@ static void ext4_orphan_cleanup (struct super_block * sb,
#endif #endif
sb->s_flags = s_flags; /* Restore MS_RDONLY status */ sb->s_flags = s_flags; /* Restore MS_RDONLY status */
} }
/*
* Maximal extent format file size.
* Resulting logical blkno at s_maxbytes must fit in our on-disk
* extent format containers, within a sector_t, and within i_blocks
* in the vfs. ext4 inode has 48 bits of i_block in fsblock units,
* so that won't be a limiting factor.
*
* Note, this does *not* consider any metadata overhead for vfs i_blocks.
*/
static loff_t ext4_max_size(int blkbits)
{
loff_t res;
loff_t upper_limit = MAX_LFS_FILESIZE;
/* small i_blocks in vfs inode? */
if (sizeof(blkcnt_t) < sizeof(u64)) {
/*
* CONFIG_LSF is not enabled implies the inode
* i_block represent total blocks in 512 bytes
* 32 == size of vfs inode i_blocks * 8
*/
upper_limit = (1LL << 32) - 1;
/* total blocks in file system block size */
upper_limit >>= (blkbits - 9);
upper_limit <<= blkbits;
}
/* 32-bit extent-start container, ee_block */
res = 1LL << 32;
res <<= blkbits;
res -= 1;
/* Sanity check against vm- & vfs- imposed limits */
if (res > upper_limit)
res = upper_limit;
return res;
}
/* /*
* Maximal file size. There is a direct, and {,double-,triple-}indirect * Maximal bitmap file size. There is a direct, and {,double-,triple-}indirect
* block limit, and also a limit of (2^48 - 1) 512-byte sectors in i_blocks. * block limit, and also a limit of (2^48 - 1) 512-byte sectors in i_blocks.
* We need to be 1 filesystem block less than the 2^48 sector limit. * We need to be 1 filesystem block less than the 2^48 sector limit.
*/ */
static loff_t ext4_max_size(int bits) static loff_t ext4_max_bitmap_size(int bits)
{ {
loff_t res = EXT4_NDIR_BLOCKS; loff_t res = EXT4_NDIR_BLOCKS;
int meta_blocks; int meta_blocks;
loff_t upper_limit; loff_t upper_limit;
/* This is calculated to be the largest file size for a /* This is calculated to be the largest file size for a
* dense, file such that the total number of * dense, bitmapped file such that the total number of
* sectors in the file, including data and all indirect blocks, * sectors in the file, including data and all indirect blocks,
* does not exceed 2^48 -1 * does not exceed 2^48 -1
* __u32 i_blocks_lo and _u16 i_blocks_high representing the * __u32 i_blocks_lo and _u16 i_blocks_high representing the
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册